2006年05月23日
ネットワークパケットを覗いちゃえ
レイヤを問わず (ethernet から HTTP や SMTP まで) 、ネットワーク絡みのトラブルシューティングや挙動の確認をするときにパケットの流れが見られると非常に有益です。
開眼すると「パケットの流れが目で見える」そうですが、私などはまだまだ修行が足りず裸眼では見えないので、tcpdump というツールを使って見ています。
tcpdump はその名前があまりよくないと私は思っていて、"tcp" だけでなく udp やICMP や ethernet フレームまで覗ける超強力ツールです。
というわけで tcpdump の簡単な説明を書いてみます。
tcpdump は UNIX 系の OS で使えるツールなのですが、Windows 用にはWinDumpという CUI のツールがあり、tcpdump と同じように使えます。
GUI がお好みの方は、後でも紹介するEtherealがおすすめです。UNIX 系でも Windows でも使えます。
ちなみに tcpdump のほかには sniffit というがあったり、Solaris には snoop というのがついてきたります。
あと、tcpdump を使うには root 権限が必要です。
典型的なオプションの組み合わせとしては、パケットの流れを追えればよいときは -n か -ne 、パケットの中身 (HTTP のリクエスト/レスポンスとか) まで見たいときは -nxXs 1600 といったところでしょうか。
続いてよく使いそうなレシピ集です。
Debin GNU/Linux (sarge) の tcpdump (tcpdump-3.8.3+libpcap-0.8.3) での動作です。
これで HTTP リクエストとレスポンスのパケットが見られます。
特定のホストとのやりとりだけ見たい場合は、
のようにします。
ポート番号 (80) を変えれば、他のプロトコルにも適用できます。例えば、DNS のやり取りを見たい場合は、
で再帰問い合わせの様子を眺めたりできます。
TCP は 3way ハンドシェイクを経てコネクションが確立するわけですが、その流れをみてみましょう。
とした状態で、
してみると、
のがわかります。
ネットワーク組んだのになぜか TCP が通らない場合は、こうやってどの段階までハンドシェイクが行われているか確認したりします。
このへんから古い tcpdump だとエラーになったりするかもしれません。
ポートを限定するときは、"and"で条件を連結します。
冒頭でも紹介したEtherealがおすすめです。Windows でも使えます。
表示するフィルタのルールがメニューから選択できて必要なものだけ見られますし、ポート番号、プロトコル種別、MAC の OUI (メーカ固有番号) を名前で表示してくれたりもします。あと、パケットダンプを ethernet ヘッダ、IPヘッダなどでハイライトしてくれるのも見やすいですね。
Ethereal 単体でもパケットキャプチャはできますが、tcpdump でキャプチャしたデータを Ethereal で読み込んで見ることもできます。
例えば、
で適当なころあいで ^C で tcpdump を終了して、できた test.dmp をEthereal で開きます。もちろん、tcpdump -w するときにフィルタルールを指定して、
などとすることもできます。
この方法は、遠隔のサーバで tcpdump した結果を、手元の PC でじっくり鑑賞するときなどに便利でしょう。
(ひ)
開眼すると「パケットの流れが目で見える」そうですが、私などはまだまだ修行が足りず裸眼では見えないので、tcpdump というツールを使って見ています。
tcpdump はその名前があまりよくないと私は思っていて、"tcp" だけでなく udp やICMP や ethernet フレームまで覗ける超強力ツールです。
というわけで tcpdump の簡単な説明を書いてみます。
tcpdumpについて
tcpdump は UNIX 系の OS で使えるツールなのですが、Windows 用にはWinDumpという CUI のツールがあり、tcpdump と同じように使えます。
GUI がお好みの方は、後でも紹介するEtherealがおすすめです。UNIX 系でも Windows でも使えます。
Ethereal には CUI 版の tethereal というのもあります。
ちなみに tcpdump のほかには sniffit というがあったり、Solaris には snoop というのがついてきたります。
あと、tcpdump を使うには root 権限が必要です。
まずはオプション
- -i
パケットを拾うネットワークインターフェースをデバイス名 (Linux だと eth0 とか) で指定します。Linux の kernel 2.2 以上の場合は、"any" で全てのインターフェースのパケットをキャプチャできます。
windump の場合は少し違っていて、まず、windump -D で有効なデバイスの一覧を表示させて、キャプチャするデバイスを確認します。デバイスの指定は tcpdump と同じように -i オプションなのですが、windump -D で表示された番号か名前で指定します。名前は長いので番号で指定した方がよいでしょう。
- -n
IP アドレスやポート番号を名前に変換せずに数値のまま表示します。このオプションを指定しないと、いちいち IP アドレスを DNS に問い合わせるので表示が遅くなります。
- -x
パケットの中身を 16 進で表示してくれます。
- -X
パケットの中身で ASCII で表示可能なものを ASCII で表示してくれます。
- -s 長さ
-x や -X を指定した場合、パケットの先頭数十バイトだけが表示されますが、-s オプションでダンプ表示する長さを指定できます。ethernet 上でパケットダンプする際は -s 1600 で十分でしょう。
- -e
ethernet フレームのヘッダを表示します。
典型的なオプションの組み合わせとしては、パケットの流れを追えればよいときは -n か -ne 、パケットの中身 (HTTP のリクエスト/レスポンスとか) まで見たいときは -nxXs 1600 といったところでしょうか。
こんなときどーする?
続いてよく使いそうなレシピ集です。
Debin GNU/Linux (sarge) の tcpdump (tcpdump-3.8.3+libpcap-0.8.3) での動作です。
HTTP を見たい
tcpdump -i eth0 -n tcp port 80
これで HTTP リクエストとレスポンスのパケットが見られます。
特定のホストとのやりとりだけ見たい場合は、
tcpdump -i eth0 -n host 210.253.244.195 and tcp port 80
のようにします。
ポート番号 (80) を変えれば、他のプロトコルにも適用できます。例えば、DNS のやり取りを見たい場合は、
tcpdump -i eth0 -nxXs 1600 port 53
で再帰問い合わせの様子を眺めたりできます。
TCP のハンドシェイクを見たい
TCP は 3way ハンドシェイクを経てコネクションが確立するわけですが、その流れをみてみましょう。
tcpdump -i eth0 -n host 10.10.0.2 and port 80
とした状態で、
telnet 10.10.0.2 80
してみると、
SYN パケットを相手に送って、 ↓ココの "S" が SYN
IP 10.10.2.4.56708 > 10.10.0.2.80: S 3693760150:3693760150(0) win 5840
SYN+ACK が返ってきて、 ↓ココの "S" と ココの "ack"↓
IP 10.10.0.2.80 > 10.10.2.4.56708: S 3033576079:3033576079(0) ack 3693760151 win 5792
最後に ACK を返している ↓ココの "ack"
IP 10.10.2.4.56708 > 10.10.0.2.80: . ack 1 win 1460
のがわかります。
ネットワーク組んだのになぜか TCP が通らない場合は、こうやってどの段階までハンドシェイクが行われているか確認したりします。
icmp を見たい
tcpdump -i eth0 -n icmp
or
tcpdump -i eth0 -n ip proto \\icmp
arp を見たい
tcpdump -i eth0 -n arp
or
tcpdump -i eth0 -n ether proto \\arp
or
tcpdump -i eth0 -ne arp
vrrp を見たい
このへんから古い tcpdump だとエラーになったりするかもしれません。
tcpdump -i eth0 -n vrrp
or
tcpdump -i eth0 -n ip proto \\vrrp
or
tcpdump -i eth0 -n ip proto 112
マルチキャストを見たい
tcpdump -i eth0 -n ip multicast
tcpdump -i eth0 -n multicast だと、ether multicast つまり IPv4 のブロードキャストなどもダンプされちゃいます。
stp を見たい
tcpdump -i eth0 -n stp
IPv6を見たい
tcpdump -i eth0 -n ip6
ポートを限定するときは、"and"で条件を連結します。
tcpdump -i eth0 -n ip6 and port 80
やっぱり GUI が好き
冒頭でも紹介したEtherealがおすすめです。Windows でも使えます。
表示するフィルタのルールがメニューから選択できて必要なものだけ見られますし、ポート番号、プロトコル種別、MAC の OUI (メーカ固有番号) を名前で表示してくれたりもします。あと、パケットダンプを ethernet ヘッダ、IPヘッダなどでハイライトしてくれるのも見やすいですね。
Ethereal 単体でもパケットキャプチャはできますが、tcpdump でキャプチャしたデータを Ethereal で読み込んで見ることもできます。
例えば、
# tcpdump -i eth0 -n -s 1600 -w ~/test.dmp
で適当なころあいで ^C で tcpdump を終了して、できた test.dmp をEthereal で開きます。もちろん、tcpdump -w するときにフィルタルールを指定して、
# tcpdump -i eth0 -n -s 1600 -w ~/test.dmp port 80
などとすることもできます。
この方法は、遠隔のサーバで tcpdump した結果を、手元の PC でじっくり鑑賞するときなどに便利でしょう。
(ひ)
トラックバックURL
この記事へのトラックバック
1. soft/ethreal [ PukiWiki Plus! (PukiWiki/TrackBack 0.4) ] 2007年08月29日 15:27
http://dsas.blog.klab.org/archives/50434369.htmlより tcpdumpについて tcpdump は UNIX 系の OS で使えるツールなのですが、Windows 用にはWinDumpという CUI のツールがあり、tcpdump と同じように使えます。 GUI がお好みの方は、後でも紹介するEtherealがおすすめ...
2. soft/ethreal/sample [ PukiWiki Plus! (PukiWiki/TrackBack 0.4) ] 2007年08月29日 15:28
http://dsas.blog.klab.org/archives/50434369.htmlより tcpdumpについて tcpdump は UNIX 系の OS で使えるツールなのですが、Windows 用にはWinDumpという CUI のツールがあり、tcpdump と同じように使えます。 GUI がお好みの方は、後でも紹介するEtherealがおすすめ...