Edited at

tcpdumpの使い方

Wiresharkの方が新しく強力なイメージがあるが、tcpdumpも開発が続いているし機能面では負けていない印象。


一番基本的な使い方

# tcpdump -nn port 80

# tcpdump -nn -X dst port 80

# tcpdump -nn -X host 1.2.3.4

# tcpdump -nn 'src host xx.xx.xx.xx and dst port 80'

Macでローカルホスト同士の通信を見る場合は-i lo0をつける。-i allでもいいかもしれない。


よく使うオプション

-i  キャプチャするインターフェースを指定します。-iオプションを指定しない場合はループバックを除いた一番小さいインターフェースが指定されます。(大体の場合はeth0ですね。)

-nn アドレスやポート番号を名前に変換しないで表示します。
-s キャプチャするサイズを指定します。-s0ですべてキャプチャします。デフォルトは65535
-vvv 詳細を出力します。
-w 生データをそのままファイルに書き込みます。WireSharkやEtherealで開く場合に便利です。
-r -wで書き込んだファイルを読み込んで表示する
-X 16進とASCII文字で表示を行います。
-A ASCII文字で表示を行います。


  • -nn(アドレスやポートを名前でなく番号で表示)はつけた方がよい

  • -A より -X の方が見やすい

  • HTTPのように中身をテキストでちゃんと見たいというときだけ -A をつけるとよい

  • -X、-A どちらもつけないでも十分かも

  • TCPフラグだけは tshark の方が見やすいかも


出力の見方

形式

src > dst: flags data-seqno ack window urgent options

フラグの意味

S (SYN)

F (FIN)
P (PUSH)
R (RST)
W (ECN CWR)
E (ECN-Echo)
. (フラグなし)

URG, ACK は urg, ack という文字列で表示される

TCPヘッダの構造

ECE ECN-Echo (ECE) フラグは TCP ピアが TCP 3-way ハンドシェイク間に ECN 対応であることを示すために、また TCP セグメントが 11 に設定されている IP ヘッダーの ECN フィールドとの接続で受け取られたことを示すために使用されます。TCP 3-way ハンドシェイクに関する情報は RFC 793 をご覧ください。

CWR Congestion Window Reduced (CWR) フラグが送信ホストにより設定され、ECE フラグ セットと TCP セグメントを受信したことを示します。輻輳ウィンドウは TCP により保持される内部の変数で、送信ウィンドウのサイズを管理します。

19:24:49.347860 IP 13.113.156.215.40206 > 10.4.3.221.d-s-n: Flags [P.], seq 266:297, ack 1, win 211, options [nop,nop,TS val 852763 ecr 854483], length 31

0x0000: 4500 0053 908d 4000 fe06 33ee 0d71 9cd7
0x0010: 0a04 03dd 9d0e 1f96 9c50 949a eba9 fc37
0x0020: 8018 00d3 90c8 0000 0101 080a 000d 031b
0x0030: 000d 09d3 666f 6f62 6172 2076 616c 7565
0x0040: 3d30 2e39 3935 3732 3230 3032 3833 3330
0x0050: 3935 39

4 = IPのバージョン番号(4はIPv4を表す)

5 = IPヘッダの長さ(4 * 5 = 20バイト)
00 = サービスタイプ
0053 = IPヘッダを含むパケットの全長。0x0050の3バイト目が終端になっていることに注目。
(中略)
0d71 9cd7 = 13.113.156.215。送信元IPアドレス
0a04 03dd = 10.4.3.221。受信IPアドレス
ここからTCPヘッダ
9d0e = 40206。送信元ポート
1f96 = 8086。受信ポート
0x20の行の最初にある8(4ビット)がTCPヘッダのサイズ。8→32バイト。


色々な使い方


ポート80番でのやり取り(双方向)を表示する(ヘッダのみ)

# tcpdump -nn port 80


-X をつけるとパケットの中身(HTTPならリクエストやレスポンスなど)も表示する

# tcpdump -nn -X port 80


ポート80番への受信パケットだけを表示する

tcpdump -nn -X dst port 80


ポート80番からの送信パケットだけを表示する

# tcpdump -nn -X src port 80


ICMPをキャプチャする

# tcpdump -nn icmp


指定できるプロトコル

ether fddi mopdl ip ip6 arp rarp decnet lat sca moprc icmp icmp6 tcp udp