特定のポート(サービス)への通信ができない場合¶
該当する症状¶
Apache/Nginxをインストールしたがブラウザからのアクセスができない
メールを送信しようとしたが送れない
SSHのポートを変更したが接続できなくなってしまった
Note
確認方法¶
Note
0. 事前準備¶
# dnf install tcpdump
通信パケットはクライアント(PC等)からご利用VPSまで到達しているか
パケットのやり取りは正常に行われているか
# tcpdump <オプション> <条件式>
オプション
詳細
-i
パケットをキャプチャーするインターフェースの指定する
-n
送信先/送信元のIPアドレスの名前解決を行わずに出力する
-nn
-nを実施し、さらに送信先/送信元のサービス名変換を行わずに出力する
-w
引数にファイル名を指定し、キャプチャーしたパケットをファイルに保存する
-e
MACアドレスを表示させる
-v
出力される内容をより詳細にする
Note
条件式は組み合わせることによって複数の指定の仕方が可能ですので、記載はあくまでも一例となります。
条件式 |
詳細 |
---|---|
host |
送受信を行っている対象のIPアドレスを指定する(送信元/送信先問わず) |
port |
パケットの送出/受信ポートを指定する |
ether |
MACアドレスを指定する |
tcp/udp |
パケットのプロトコルがTCP/UDPを利用しているものを指定する |
icmp |
パケットのプロトコルがICMPを利用しているものを指定する |
arp |
パケットのプロトコルがarpを利用しているものを指定する |
src |
送信元の対象を指定する |
dst |
送信先の対象を指定する |
and |
条件式をand条件で組み合わせて、対象をより絞る時に利用する |
or |
条件式をor条件で組み合わせて、対象を複数抽出する時に利用する |
not |
後に記載される条件を否定し、その条件式以外を出力させる |
# tcpdump -i eth0 -n
※パケットの取得インターフェースをeth0に指定し、送信元/送信先のIPアドレスを名前解決しない。
# tcpdump -i eth0 -w /path/to/file
※eth0に受信したパケットを全てファイルに出力する。出力されたファイルはWireshark等のパケット解析ツールで読み込める。
# tcpdump -i eth0 -n host XXX.XXX.XXX.XXX and port 80
※送信元/送信先の対象IPアドレスを指定し、さらに送信元/送信先を問わず80番ポート(Webサーバ)へアクセスしている通信を抽出する。
# tcpdump -i eth0 -nn not src (host) XXX.XXX.XXX.XXX and dst port 80
※ポートの名前解決を無効化、特定の送信元以外の通信で、かつ宛先ポートが80番の通信を抽出する。()内の記述は省略可能。
警告
1. tcpdumpを実行してもパケットが受信できていない場合¶
ご利用VPSの電源は起動していて、Webサービスも起動状態になっている
クライアントのWebブラウザからご利用VPSへアクセスした場合、ブラウザに「タイムアウト」の表示がされる
ご利用VPSで下記のコマンドを実行し、ブラウザからご利用VPSへアクセスしても全く出力が無い
# tcpdump -i eth0 -n port 80
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
※終了する場合はCtrl+Cを押下してください。
1-1. パケットフィルターの設定不備¶
1-2. HSTSによるリダイレクト¶
# tcpdump -i eth0 -n port 443
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:11:43.603016 IP XXX.XXX.XXX.XXX.13943 > YYY.YYY.YYY.YYY.https: Flags [S], seq 2952803574, win 65535, options [mss 1460,nop,wscale 6,sackOK,TS val 190463372 ecr 0], length 0
16:11:43.603067 IP YYY.YYY.YYY.YYY.https > XXX.XXX.XXX.XXX.13943: Flags [S.], seq 51034214, ack 2952803575, win 28960, options [mss 1460,sackOK,TS val 2693706482 ecr 190463372,nop,wscale 7], length 0
16:11:43.623754 IP XXX.XXX.XXX.XXX.13943 > YYY.YYY.YYY.YYY.https: Flags [.], ack 1, win 1027, options [nop,nop,TS val 190463392 ecr 2693706482], length 0
<中略>
※パケットが到達した場合はこのように出力されます。
ご利用VPSにSSLを導入してもらい、HTTPS化してから確認する
Test-NetConnection コマンドを利用して確認する(接続クライアントのOSでWindowsをご利用の場合)
警告
Test-NetConnectionの実行方法¶
キーボードの Windows + R キーを押下して、「ファイル名を指定して実行」を起動させる
検索窓に「powershell」と入力する
以下のコマンドを実行する
> Test-NetConnection <対象ホスト名/IPアドレス> -Port <対象ポート>
ComputerName : <対象ホスト名/IPアドレス>
RemoteAddress : <対象IPアドレス>
RemotePort : <対象ポート>
InterfaceAlias : イーサネット
SourceAddress : <検索端末に割り当てられているIPアドレス>
TcpTestSucceeded : True
TcpTestSucceeded 項目がTrueになっていることを確認する
2. tcpdumpを実行してパケットが受信できている場合¶
# tcpdump -i eth0 -nn port 80
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:11:43.603016 IP <接続元IPアドレス>.13943 > <ご利用VPSIPアドレス>.80: Flags [S], seq 3473259437, win 64240, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0
16:11:43.623754 IP <接続元IPアドレス>.13943 > <ご利用VPSIPアドレス>.80: Flags [S], seq 3473259437, win 64240, options [mss 1414,nop,wscale 8,nop,nop,sackOK], length 0
<中略>
2-1. iptables/Firewalldの設定不備¶
iptablesが通信を阻害している場合¶
Note
2-2. サービスの起動不具合¶
A. サービスの自動起動が設定されていなかった場合¶
# systemctl status httpd (指定するサービス名は確認対象に変更してください)
# systemctl start httpd (上記で停止していた場合起動)
# systemctl is-enabled httpd
# systemctl enable httpd
※Webサービスの場合、関連するサービス(SQLやphp-fpm等)の起動状態も確認が必要です。
B. サービスのポート設定が変更されていた場合¶
# systemctl status httpd (サービスが起動していることを確認)
# ss -tulnp state listening (現在リッスンしているポートの一覧とサービス名を表示)
C. サービスの起動に失敗している場合¶
# systemctl status httpd (サービスがinactiveもしくはdeadになっていることを確認)
# journalctl -xe --no-pager | less (systemdの起動ログの確認)
# less /var/log/messages (システムログを確認)