久しぶりの投稿になります。
いきなりですが、この前ネットワーク回りでトラブルが発生し、基本的な切り分けを改めて勉強したので備忘録として書きます。
※すみません、ちょっと雑になります
▼前提
・Apache Webサーバー(IP:192.168.33.82、ポート:80番)を題材に切り分けを進める
▼項目
- ネットワーク(IP)層 (第3層)の切り分け
- トランスポート層(第4層)の切り分け
- アプリケーション層(第7層)の切り分け
▼手順
- ネットワーク(IP)層 (第3層)の切り分け
目的: クライアント⇔サーバ間で IP レベルの疎通やルーティングに問題がないかを確認する。
・ローカルからpingで確認する
ping 192.168.33.82
→応答が返ってくることを確認する
PING 192.168.33.82 (192.168.33.82) 56(84) bytes of data. 64 bytes from 192.168.33.82: icmp_seq=1 ttl=63 time=1.66 ms 64 bytes from 192.168.33.82: icmp_seq=2 ttl=63 time=1.80 ms 64 bytes from 192.168.33.82: icmp_seq=3 ttl=63 time=1.37 ms 64 bytes from 192.168.33.82: icmp_seq=4 ttl=63 time=1.30 ms
※サーバーが起動していない場合
PING 192.168.33.82 (192.168.33.82) 56(84) bytes of data. From 192.168.33.1 icmp_seq=3 Destination Host Unreachable ^C --- 192.168.33.82 ping statistics --- 13 packets transmitted, 0 received, +1 errors, 100% packet loss, time 12242ms
→Destination Host Unreachable などのエラーになる
・ローカルからtraceroute(Linux)で確認する
traceroute 192.168.33.82
→応答が返ってくることを確認する
traceroute to 192.168.33.82 (192.168.33.82), 30 hops max, 60 byte packets 1 _gateway (xxxx.xxxx.xxxx.xxxx) 0.476 ms 0.443 ms 0.659 ms 2 test.com (192.168.33.82) 1.105 ms 1.667 ms 1.339 ms
※サーバーが起動していない場合
4 * * * 5 * * * 6 * * * 7 * * * 8 * * *
→目的のサーバーまで到達できず、ホップ数の数だけループしたのちタイムアウトする
・ローカルからtracert(windows)で確認する
tracert 192.168.33.82
→応答が返ってくることを確認する
test.com [192.168.33.82] へのルートをトレースしています 経由するホップ数は最大 30 です: 1 1 ms <1 ms <1 ms test.com [192.168.33.82]
※サーバーが起動していない場合
→目的のサーバーまで到達できず、ホップ数の数だけループしたのちタイムアウトする
2. トランスポート層(第4層)の切り分け
目的: TCP/UDP のポートレベルでの到達性やファイアウォール設定、TCPハンドシェイクの成否を確認する
・nsコマンドで確認
nc -vz 192.168.33.82 80
→Connectedが出力されることを確認する
Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.33.82:80. Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
※80ポートが開いていない場合
Ncat: Version 7.92 ( https://nmap.org/ncat ) Ncat: Connection refused.
→Connection refused になる
・telnetコマンドで確認する
telnet 192.168.33.82 80
→Connected to が出力されることを確認する
Trying 192.168.33.82... Connected to 192.168.33.82.
※80ポートが開いていない場合
Trying 192.168.33.82... telnet: connect to address 192.168.33.82: Connection refused
→Connection refusedになる
・サーバー側リッスン状況を確認する
netstat -lntp
→80番ポートがLISTENしていることを確認する
tcp6 0 0 :::80 :::* LISTEN 16740/httpd
※80ポートが開いていない場合
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connection refused.
3. アプリケーション層(第7層)の切り分け
・curlで確認
curl -I http://192.168.33.82/
→HTTP/1.1 200 OK が返ってくることを確認する
HTTP/1.1 200 OK Date: Fri, 27 Jun 2025 11:38:53 GMT Server: Apache/2.4.62 (AlmaLinux) Last-Modified: Fri, 27 Jun 2025 10:24:49 GMT ETag: "a-6388b167dce7c" Accept-Ranges: bytes Content-Length: 10 Content-Type: text/html; charset=UTF-8
※Apacheが起動していない場合
curl: (7) Failed to connect to 192.168.33.82 port 80: Connection refused
→Connection refused になる
・curlでコンテンツ取得確認
curl -v http://192.168.33.82/index.html
→コンテンツが出力されることを確認する
※Apacheが起動していない場合
Trying 192.168.33.82:80... connect to 192.168.33.82 port 80 failed: Connection refused Failed to connect to 192.168.33.82 port 80: Connection refused Closing connection 0 curl: (7) Failed to connect to 192.168.33.82 port 80: Connection refused
→Connection refused になる
・Apacheのログ確認
→アクセスログなどにリクエストが出力されていることを確認する
▼切り分けフローの例
- まず L3:
ping→ 応答なければネットワーク機器やケーブル、VLAN設定を疑う - 次に L4:
nc -vz/telnet→ ポート80が拒否されるならファイアウォールやサーバのリスン設定確認 - 最後に L7:
curl→ 200以外ならApache設定やアプリケーション内部の問題、ログで詳細を追う
下流レイヤーで問題が発生していると、上流レイヤーまで到達しないので、
基本的には 下流 → 上流のレイヤー順に順序立ててテストしていくことで、どこで障害が発生しているのか目星をつけやすくなる
以上となります。
おそらく現実は上記をそれぞれ確認したうえで、ファイアウォールやルーティングの設定を確認していくことになるかなと思います。
この辺りはまたどこかで書いていきたいと思います。