conf t

インフラエンジニアのメモ

tcpdumpの使い方まとめ

最近トラブルシューティングtcpdumpを使うことが多いので、
tcpdumpコマンドの使い方をまとめてみました。

インターフェースを指定してtcpdumpでキャプチャ

# tcpdump -i eth1

インターフェースを指定してtcpdumpでキャプチャする。
この場合は、eth1を通過するパケットをキャプチャする。
ifconfig等でインターフェース名を事前に調べ、それを指定する。
-i 1など数字で指定することもできるが、わかりずらいのでインターフェース名で指定するのが良い。

プロトコルを指定してtcpdumpでキャプチャ

# tcpdump -i eth1 icmp

eth1を通過するパケットのうち、プロトコルicmpのパケットのみキャプチャする。
ping応答しない設定になっているホストへの疎通確認をしたい場合に、
sshでログインし、疎通確認したインターフェースで上記を実施しpingが来ていることを確認したりする。
tcpdumpで指定できるプロトコルはほかにtcp, udpなど。
httpなどは指定できないので、次のportで指定する。

ポートを指定してtcpdumpでキャプチャ

# tcpdump -i eth1 port 80

特定のポート番号の通信のみキャプチャしたい場合は、port番号を指定してキャプチャする。

ホストを指定してtcpdumpでキャプチャ

# tcpdump -i eth1 icmp host 192.168.1.1
# tcpdump -i eth1 icmp dst host 192.168.1.1
# tcpdump -i eth1 icmp src host 192.168.1.1

eth1を通過するパケットのうち、プロトコルicmpで、かつ192.168.1.1が送受信するパケットのみキャプチャする。

192.168.1.1が宛先のものだけ→dst host 192.168.1.1
192.168.1.1が送信元のものだけ→src host 192.168.1.1

ある宛先への通信に不具合があり、検証端末-宛先間の通信を調べたい時などに使用します。

特定ホストを除外してtcpdumpでキャプチャ

# tcpdump -i eth1 icmp not host 192.168.1.200

特定のホストが送受信するパケットを除外してtcpdumpキャプチャすることができる。
NTPサーバ宛の通信など、調査したい通信とは関係ないパケットを除外するときに使う。
上記の例は、192.168.1.200の送受信を除外している。

tcpdumpキャプチャ結果をファイルへ書き込む

# tcpdump -w test.pcap -i eth1 host 192.168.1.1

tcpdumpキャプチャ結果をターミナルではなくファイルに書き込む。
wiresharkでも読める。じっくり解析したい場合や、tcpdumpキャプチャ結果を別担当やサポートへ送付するときに使う。

tcpdumpのファイル書き込みを一定の容量でローテーション

# tcpdump -w test.pcap -i eth1 host 192.168.1.1 -c 100

tcpdumpキャプチャファイルを、一定の容量になるごとにローテーションさせる。
ファイルアップロードシステムなどは決まった容量までしかアップできないことも多いので、 そういった場合に便利。

tcpdumpキャプチャファイルの開始と終了時刻を表示する

# tcpslice -t test.pcap
sliced_test.pcap        2015y04m12d23h51m08s383237u     2015y04m12d23h51m08s427872u

あとからtcpdumpキャプチャファイルを分割したい場合、tcpsliceが便利。
単純にファイル分割するだけであればsplitでもよいが、キャプチャファイル中の意味のある特定の期間だけ
抜き出したいなどの場合にはこれが便利。
上記はtest.pcapのキャプチャ開始時間と終了時間を表示させている。
そして、実際に切り出す際は以下コマンドを使う。

tcpdumpキャプチャファイルから特定期間を切り出す

tcpslice -w sliced_test.pcap 2015y04m12d23h51m08s +60 test.pcap

2015y04m12d23h51m08sは切り出し始めの時間、+60は切り出し始めの時間から60秒分切り出すという意味。
test.pcapからsliced_test.pcapを作成している。