デモサイトに2つ目のLaravelプロジェクトを入れポート開放したが画面が出なかった理由

デモサイトに2つ目のLaravelプロジェクトを入れポート開放したが画面が出なかった理由

いやぁ~しんどかったです。
最初は2週間ほど前に仕掛けて、上手くいかなかったので時間のある時にやろうと思い本日作業を行ったのですが、解決まで丸一日かかりました。

先に答えを書いてしまうと、私が利用している【さくらインターネット】の設定が胆でした。

という事で、繰り返しそうなので備忘録です。

まずはおさらいCentOS7でのポート開放

CentOS6ではiptableなどを使いポート開放をしますが、CentOS7以降ではfirewalldがport開放を超簡単にしてくれています。
コマンドはたった2つ。

firewall-cmd --zone=public --add-port=443/tcp --permanent

firewall-cmd --reload

これで443ポートを恒久的に開放してくれます。

恒久的にという指示は --permanent が担当。
--add-port がポートを追加してねと言う意味。これを【--remove-port】とすると開放設定したポートを閉じてねとの意味になります。firewall-cmd --reload でファイヤーフォールを再起動し追加削除した設定が反映されます。

--add-portの箇所については様々な書き方が出来ます。

#サービスを指定して開放 ※例だと80番を開放
firewall-cmd --add-service=http --zone=public --permanent

#ポートを指定して開放 ※例だと22番を開放
firewall-cmd --add-port=22/tcp --zone=public --permanent

#指定IPの接続許可 ※ホワイトリスト
firewall-cmd --add-source=192.168.1.0/24 --zone=public

#指定IPの接続拒否 ※ブラックリスト
firewall-cmd --add-source=192.168.1.0/24 --zone=drop

他にもまだ、アクティブゾーンの変更などいろんな設定が出来そうですが、多くは記載したコマンド程度で事足りるかなと思います。

ポート開放が出来たか確認。

8100番を2つ目プロジェクトの窓口にしようとコマンドを走らせ、無事にポート開放が出来たか確認してみます。

firewall-cmd --add-port=8100/tcp --zone=public --permanent
firewall-cmd --reload

sudo firewall-cmd --list-all
#結果
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh ssh-alt
  ports: 443/tcp 110/tcp 25/tcp 587/tcp 465/tcp 8100/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

無事に8100番がリストに登場しました。

firewalldの設定は出来ているのになぜかページが表示されない。

http://サーバーIP:8100にアクセスしてみます...が何の表示もされない...。

何故だ??
私の格闘はここから始まりました。

まずは本当にポートが開いているのか疑う

疑うと言ってもfirewall-cmd --list-allではポート番号が出てきています。

ちょうど別建てのサーバーがあるのでこちらからportスキャンを掛けてポートが開いているか確認してみます。

#外部(別サーバ)から実行
nmap -sT -p8100 ポート解放設定したサーバーIP
#結果
PORT     STATE    SERVICE
8100/tcp filtered xprint-server

status:filtered の解説

Nmapは、このポートが開いているかどうかを判別できない。なぜなら、パケットフィルタのせいで、プローブがポートまで到達できないからである。このフィルタ処理は、ファイアウォール専用機器、ルータのルール、ホストベースのファイアウォールソフトなどで実行できる。これらのポートからは情報がほとんど得られないので、攻撃者の企てを阻むことになる。場合によっては、タイプ3コード13(destination unreachable(宛先到達不能):通信が管理上の理由で禁止されている)などのICMPエラーメッセージを返すこともあるが、応答しないでプローブを破棄するだけのフィルタのほうがはるかに多く使われるようになっている。この場合、Nmapは、プローブが破棄されたのはフィルタリングではなくてネットワークの混雑のせいと見なして、再試行を数回行わざるを得なくなるので、スキャンの進行速度が格段に落ちる

ん?ファイヤーウォールでポート開放してるのに開いてない??
もうわけわかりません。

ポートが解放されていないようなのでファイヤーフォールごと止めてみる

という事で、ファイヤーフォールの設定がオカシイと疑い、その原因を確定するために一回Firewalldを止めてみる事にします。
これでportスキャンかけてstatus:open だったら原因はfirewalldの設定間違いになりますよね。

#firewalldの停止
sudo systemctl stop firewalld
#外部(別サーバ)から実行
nmap -sT -p8100 ポート解放設定したサーバーIP
#結果
PORT     STATE    SERVICE
8100/tcp filtered xprint-server

再び【filtered】。と言う事はポートが開いていない原因にファイヤーウォールは関係なし。
メンターに聞きつつ、同時進行で原因を調べてみます。

Firewalldを設定してもListenにならないと意味がない

そんな中、次のような情報を見つけました。

  1. ポート開放設定を行ってもポートがListenにならないと何も動作しない
  2. Listenになるためには、そのportで待ち受けるシステム(サービス)の存在が必要

つまりは2つ目のLaravelプロジェクトを上手く起動できていなければポートの状態はListenにならないという事らしい。

なるほど。Laravelをうまく起動できていない可能性が浮上したわけです。

メンターより悲しいお知らせ、8100番ポートは登録済みポートだから使っちゃダメ。

そんな中、全く考えてなかった事態が発生しました。

8100番ポートでのメッセージにxprint-serverサービスと勘違いされている動きがあると。
んで、調べたら公式で書かれた登録積みportですでに利用者がいて使っちゃダメとの事。

いやぁ~全くチェックしてなかった。

TCP/UDP Portインデックス

TCPやUDPにおけるポート番号の一覧

動く前に調べなきゃダメですね。大いに反省です。

ポートを変えてLaravelの起動を調べる

メンター曰く、wgetで接続できるか試してみた方がいいとの事。

Laravelプロジェクトのポートを8080番に変えて実行です。
firewalldの設定をして、外部から nmap -sT -p8080 でportスキャン。
うん、8080に変えても変化なく 8080/tcp filtered。

教えてもらったwgetを早速やってみます。

#8080番ポートで実行
wget http://localhost:8080
--2019-12-16 13:20:39--  http://localhost:8080/
localhost (localhost) をDNSに問いあわせています... 127.0.0.1
localhost (localhost)|127.0.0.1|:8080 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`index.html.2' に保存中

    [ <=>                                   ] 70,474      --.-K/s 時間 0s

2019-12-16 23:17:39 (174 MB/s) - `index.html.2' へ保存終了 [70474]

接続が完了するという事は、Server内部からはプロジェクトが見えている=Laravelは動いているようです。

開放したポートがListenになっているか調べる

次にポートがListenになっているか調べます。

sudo netstat -tanp | grep LISTEN
#結果
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      1026/httpd
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1026/httpd
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      9949/php

お~~ちゃんとListenに入ってます。
これで解決か!外部サーバーからportスキャンしてみます。

#外部(別サーバ)から実行
nmap -sT -p8080 ポート解放設定したサーバーIP
#結果
PORT     STATE    SERVICE
8100/tcp filtered xprint-server

Listenに入っているのに何故 filtered??

と言う事で前段長くなりましたが回答編です。

さくらインターネットVPSでは標準機能として任意ポートは閉められている

一日かかって原因がサーバー会社の設定とは...そりゃいくらあれこれやってみてもダメなわけですね。

さくらインターネットVPSには【パケットフィルタ】という機能が標準でついています。
この機能により、サーバー側にポート開放を指示しても外に出ていかないという堅牢な鍵を掛けています。

この赤枠を追加設定する事でファイヤーフォールで開けた8080ポートが無事に外からみえるようになりました。

まとめ

いゃぁ~これはサーバーだけ見てると絶対に気づかない所。
メンター、情報ありがとうございました。とても助かりました。

疲れたぁ~~ ^^;

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。