このページの目次

ネットワーク障害診断の手法論

階層型特定——L1からL7まで、1層ずつ除外していく。MTUブラックホール(ICMPフィルタによりTCPハンドシェイクは完了するがデータ転送が不可)、DNS解決異常、TCPハンドシェイクタイムアウト——各古典的な障害には特定の診断パスが存在する。mtrはping/tracerouteよりも一時的なパケット損失の特定に適している。

概要

ネットワーク障害診断の中核となる手法は、階層型特定です。L1(物理層)からL7(アプリケーション層)まで、1層ずつ除外していきます。最も一般的な障害パターンには、MTUブラックホール(ICMPがフィルタリングされ、TCPがデッドロック状態に陥る)、DNS解決異常、TCP接続確立後のデータ転送停止(バッファ/ウィンドウの問題)があります。mtrは、エンドツーエンドの各ホップにおけるパケット損失率とレイテンジジッターを表示するため、長期的なパケット損失の監視にはpingやtracerouteよりも適しています。

階層別診断

L1 (物理): ip link, ethtool eth0 | grep Link
L2 (データリンク): ip neigh, tcpdump arp
L3 (ネットワーク): ping -M do, traceroute, ip route
L4 (トランスポート): ss -tlnp, tcpdump 'tcp[tcpflags] & tcp-syn != 0'
L5-6 (TLS): openssl s_client -connect host:443, tshark 'tls.alert_message.level==2'
L7 (アプリケーション): curl -v, dig, ss -tianp (Recv-Q / Send-Q)

古典的な障害パターン

「ネットワークは接続できるがアクセスできない」

ping は通る → L3 OK, L4 に問題がある可能性あり

確認項目:
  ss -tlnp | grep <port>            サービスはリスニングしているか?
  iptables -L -n -v                  ファイアウォールでブロックされているか?
  tcpdump 'tcp[tcpflags] & tcp-rst != 0'  誰が RST を送信しているか?
  cat /proc/sys/net/netfilter/nf_conntrack_count  conntrack テーブルは満杯か?

MTU ブラックホール

症状: ping は通るが、TCP SYN+ACK は完了し、データ転送が停止する。

根本原因: パス上の MTU が送信パケットサイズ + DF=1 より小さく、かつ ICMP Frag Needed がフィルタリングされている
  → パケットがパス上で破棄され、送信元はそれを認識できない

検出: ping -M do -s 1472 <target> → 失敗 (ただし小さい ping は成功) → MTU ブラックホール
緩和策: iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

DNS 問題

dig <domain> +short                   何が返されたか?
dig +trace <domain>                   再帰パスのどのステップで切断されたか?
tcpdump -nn 'port 53'                 リクエストは送信されたか? 応答はあるか?

一時的なタイムアウト

mtr -r -c 100 <target>               どのホップからパケット損失とジッターが始まったか?
ethtool -S eth0 | grep -E 'err|drop'  NIC でのパケット損失か?
cat /proc/net/dev                      ソフトウェアレベルでのパケット損失か?
tc -s qdisc show dev eth0              qdisc でのパケット損失 (bufferbloat か?)

参考

  • mtr: bitwizard.nl/mtr
  • iptables: netfilter.org/documentation

Keywords: network troubleshooting, L1-L7, MTU black hole, DNS, TCP RST, conntrack, bufferbloat