tcpdumpの使い方まとめ

tcpdumpTCPUDP などに対応したパケットキャプチャツール。

詳細はマニュアル(man tcpdump)を読む。

1
tcpdump [options...] [ expression ]

上記expressionはネットワークスニッフ用データ形式pcapのフィルターを記述する。 詳細はman pcap-filterで読む。

基本的な使い方をメモしておく。

その場で出力する

以下のように打つ事でその場で出力する事が出来る。

1
$ sudo tcpdump -Z $(USER) -i lo [-n] [-A|-X] port 80

使うオプション

オプション 意味
-n オプション IPアドレス・port番号をそのまま表示
-A オプション TCP/UDPのpayloadをASCIIで表示
-X オプション TCP/UDPのpayloadを16進, ASCIIで表示
-i オプション キャプチャ対象のNICを指定する
-Z オプション 実行ユーザを指定する(root -> $USERに落とす)

表示形式

${日付} ${送信元 (<プロトコル> <ホスト>.<ポート>)} > ${送信先 (<プロトコル> <ホスト>.<ポート>)}: ${パケット詳細}

パケット詳細の内容

項目 意味
Flags [フラグに応じた内容](C\WR
seq sequence number
ack acknowledgement number
win ウィンドウサイズ
length パケット長
options tcp options(mss,wscale, …, eol)
1
2
3
4
5
6
[masumi(%1)@protrout ~]$ sudo tcpdump -i lo0
sudo
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
00:06:56.807659 IP6 localhost.51857 > localhost.irdmi: Flags [S], seq 2152175165, win 65535, options [mss 16324,nop,wscale 5,nop,nop,TS val 866353425 ecr 0,sackOK,eol], length 0
00:06:56.807733 IP6 localhost.irdmi > localhost.51857: Flags [R.], seq 0, ack 2152175166, win 0, length 0

例えば、1行目ではIPv6 でエフェメラルポート51857からirdmi(8000) へSYNが飛んでいる。 返答としてIPv6 でRSTACKを持ったパケットが返されている。 またウィンドウサイズは0となっている。 その後クライアントはポートを変更し(51858)IPv4 で再開している。

使用例

python -m SimpleHTTPServerに向けてcurlを使った画面を下に貼る。 画像にあるようにSYN, SYNACK, ACKとハンドシェイクが行われていることが確認できる。

IPv4でcurlした結果

同じ環境でcurl-4オプションを使用しなかった場合も載せておく。 なぜIPv6対応できていないかは不明だがcurlは最初にIPv6でSYNするもPythonRSTにより拒否している事がわかる。

IPv6でcurlした結果

キャプチャ可能なNIC情報を取得する

-iオプションでNICを指定する。対象となるデバイスリストを確認するには-Dで行える。

1
2
3
4
5
6
7
8
$ sudo tcpdump -D
1.en0
2.bridge0
3.awdl0
4.en1
5.en2
6.p2p0
7.lo0

キャプチャデータをファイルに保存する

-w オプションを使って保存する。

1
2
3
4
5
6
7
8
[masumi(%1)@protrout ~]$ sudo tcpdump -Z masumi -i lo0 -w test.pcap -A port 8000
sudo
tcpdump: listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
^C27 packets captured
27 packets received by filter
0 packets dropped by kernel
[masumi(%1)@protrout ~]$ file ./test.pcap
./test.pcap: tcpdump capture file (little-endian) - version 2.4 (No link-layer encapsulation, capture length 65535)

ファイルに保存したキャプチャデータを使う

-rオプションを使って利用する。ファイルから読み込み表示する際にフィルタを更に加える事が出来る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[masumi(%1)@protrout ~]$ tcpdump -A -r ./test.pcap ip | head
reading from file ./test.pcap, link-type NULL (BSD loopback)
23:51:23.688808 IP localhost.51697 > localhost.irdmi: Flags [S], seq 1323684566, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 865535091 ecr 0,sackOK,eol], length 0
E..@..@.@..............@N............4....?........
3..s........
23:51:23.688870 IP localhost.irdmi > localhost.51697: Flags [S.], seq 217177675, ack 1323684567, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 865535091 ecr 865535091,sackOK,eol], length 0
E..@..@.@............@.....KN........4....?........
3..s3..s....
23:51:23.688880 IP localhost.51697 > localhost.irdmi: Flags [.], ack 1, win 12759, options [nop,nop,TS val 865535091 ecr 865535091], length 0
E..4g.@.@..............@N......L..1..(.....
3..s3..s
[masumi(%1)@protrout ~]$ tcpdump -A -r ./test.pcap | head
reading from file ./test.pcap, link-type NULL (BSD loopback)
23:51:23.688660 IP6 localhost.51696 > localhost.irdmi: Flags [S], seq 1765174230, win 65535, options [mss 16324,nop,wscale 5,nop,nop,TS val 865535091 ecr 0,sackOK,eol], length 0
`....,.@...................................@i6k..........4....?........
3..s........
23:51:23.688716 IP6 localhost.irdmi > localhost.51696: Flags [R.], seq 0, ack 1765174231, win 0, length 0
`......@.................................@......i6k.P.......
23:51:23.688808 IP localhost.51697 > localhost.irdmi: Flags [S], seq 1323684566, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 865535091 ecr 0,sackOK,eol], length 0
E..@..@.@..............@N............4....?........
3..s........

フィルターの使い方はman pcap-filterに目を通すとわかる。

comments powered by Disqus