2006年05月23日

ネットワークパケットを覗いちゃえ

はてなブックマークに登録

レイヤを問わず (ethernet から HTTP や SMTP まで) 、ネットワーク絡みのトラブルシューティングや挙動の確認をするときにパケットの流れが見られると非常に有益です。

開眼すると「パケットの流れが目で見える」そうですが、私などはまだまだ修行が足りず裸眼では見えないので、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 でじっくり鑑賞するときなどに便利でしょう。

(ひ)
klab_gijutsu2 at 16:38│Comments(0)TrackBack(2)network 

トラックバック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がおすすめ...

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント