Wiresharkの方が新しく強力なイメージがあるが、tcpdumpも開発が続いているし機能面では負けていない印象。
使い方例
全ての通信をキャプチャ。
# tcpdump
ポート80への送受信のみキャプチャ。
# tcpdump port 80
ポート22(ssh)以外への送受信をキャプチャ。
# tcpdump port not 22
ポート80番への受信パケットだけを表示する
tcpdump dst port 80
ポート80番からの送信パケットだけを表示する
# tcpdump src port 80
-nn
をつけるとアドレスやポート番号を名前に変換しない(No Nameの略か?)。基本的につけた方が見やすいと思う。
-X
をつけるとパケットの中身(HTTPならリクエストやレスポンス)も表示。
-A
をつけると16進ダンプでなくテキストのみ表示。
# tcpdump -nn -X dst port 80
宛先IPアドレス 1.2.3.4 のみキャプチャ。
# tcpdump -nn -X host 1.2.3.4
条件のAND指定
# tcpdump -nn 'src host xx.xx.xx.xx and dst port 80'
宛先port 80かつSYNフラグのたったパケットだけ。
# tcpdump -nn dst port 80 and '(tcp[tcpflags] & tcp-syn)' != 0
Macでローカルホスト同士の通信を見る場合は-i lo0
をつける。-i all
でもいいかもしれない。
# tcpdump -i lo0
ICMPをキャプチャ
# tcpdump -nn icmp
指定できるプロトコルのリスト
ether fddi mopdl ip ip6 arp rarp decnet lat sca moprc icmp icmp6 tcp udp
よく使うオプション
表示形式
-nn アドレスやポート番号を名前に変換しないで表示します。
-X 16進とASCII文字で表示を行います。
-A ASCII文字で表示を行います。
-ttttt 最初に表示したパケットからの経過時間(delta)を表示
-vvv 詳細を出力します。
キャプチャ
-i キャプチャするインターフェースを指定します。-iオプションを指定しない場合はループバックを除いた一番小さいインターフェースが指定されます。(大体の場合はeth0ですね。)
-s キャプチャするサイズを指定します。-s0ですべてキャプチャします。デフォルトは65535
ファイルへの入出力
-w <ファイル名> 生データをそのままファイルに書き込みます。WireSharkやEtherealで開く場合に便利です。
-r <ファイル名> -wで書き込んだファイルを読み込んで表示する
- -nn(アドレスやポートを名前でなく番号で表示)はつけた方がよい
- HTTPのように中身をテキストでちゃんと見たいというときだけ -A をつけるとよい
- 中身に興味がなければ-X、-A どちらもつけないのが見やすい
出力の見方
形式
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 という文字列で表示される
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バイト。