【tcpdump】コマンドの見方・使い方・オプション・フィルタ・解析方法

スポンサーリンク
スポンサーリンク

Linuxのパケットキャプチャツール tcpdump

Windows上でのパケットキャプチャはWiresharkがよく使われますが、Linux上でのパケットキャプチャはtcpdumpを使います。tcpdumpで取得したファイルはWindows上のWiresharkで見ることもできます。

CentOSでのインストール方法

yum -y install tcpdump

一般的なオプション

標準的な使い方 標準出力で見る場合

tcpdump -i eth1 -nn -vvv

オプション “-i” はインタフェース名を指定します。tcpdumpでは同時に複数のインタフェースでパケットキャプチャすることはできません。複数インタフェースを持っていたり、VMware等で作っているLinuxの場合、デフォルトで他のインタフェースが指定されていたりしますので、このオプションでキャプチャしたいインタフェースを指定します。

オプション “-n” はIPアドレスの名前解決をしないコマンドです。これが無いと表示動作が遅くなります。”-nn”にするとTCPポートアドレスの解決もしなくなります(例えばsshと表示されるところが22と表示されます)。

オプション “-v” はIPヘッダ等を表示、”-vv” はNFSやSMB等のペイロードの中身を表示、”-vvv”はさらに細かいところまで表示してくれます。

止め方

Ctrl + C

標準的な使い方 ファイル出力する(Wiresharkで見る)場合

tcpdump -i eth1 -w test.pcap -v

オプション “-w” ではファイル名を指定します。.pcap という拡張しにしておけばWindowsのWiresharkで関連付けされていますのでダブルクリックだけで開けるはずです。

オプション “-v” は “-w”と一緒に使うと、5秒おきに何パケットキャプチャしたかをリアルタイム表示してくれます。

キャプチャするパケットの数を指定したいとき

tcpdumpで大量のパケットがキャプチャされた場合、コンソールに戻すのに時間が掛かる場合があります。負荷も少なからずあるため、気になる場合は -c でパケットキャプチャする数を指定します。10パケットだけキャプチャしたい場合は以下のように指定します。

tcpdump -i eth1 -nn -vvv -c 10

スポンサーリンク

フィルタ指定

大量のパケットキャプチャの中から、特定のパケットだけキャプチャしたい場合はフィルタを指定します。

特定IPアドレス(例:10.1.2.3)の送受信のパケットをキャプチャしたい場合

tcpdump -i eth1 -nn -vvv host 10.1.2.3

特定ポート(例:http 80)のパケットをキャプチャしたい場合

tcpdump -i eth1 -nn -vvv tcp port 80

tcpを外した場合はudp の 80番ポートの通信もキャプチャされます。

AND条件(特定IPアドレス かつ 特定ポートを除外)のパケットをキャプチャしたい場合

tcpdump -i eth1 -nn -vvv \(host 10.1.2.3\) and \(not tcp port 22\)

自身がsshアクセスしているインタフェースをキャプチャする場合、ssh通信を除外すると見やすくなります。not を使えば対象を場外することができます。

さらにARPも邪魔なときはさらに『 and \(not arp\) 』を付けます。

AND/OR条件を使う場合、どこまでが1つの条件なのか区切りを付けないとコマンドが誤解する可能性があります。カッコを使えば明確になりそのようなことは無くなるので覚えておいたほうがよいでしょう。カッコを使う場合は\でエスケープする必要があります。

OR条件(特定IPアドレス もしくは 特定NWアドレス)のパケットをキャプチャしたい場合

tcpdump -i eth1 -nn -vvv \(host 10.1.2.3\) or \(net 172.16.0.0/16\)

取得したパケットの見方

[root@localhost ~]# tcpdump -i ens33 -nn -vvv -c 5
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
07:07:33.679674 IP (tos 0x10, ttl 64, id 3853, offset 0, flags [DF], proto TCP (6), length 216)
192.168.169.128.22 > 192.168.169.1.31893: Flags [P.], cksum 0xd49d (incorrect -> 0xd5e2), seq 1606433180:1606433356, ack 847329430, win 262, length 176
07:07:33.680302 IP (tos 0x10, ttl 64, id 3854, offset 0, flags [DF], proto TCP (6), length 376)
192.168.169.128.22 > 192.168.169.1.31893: Flags [P.], cksum 0xd53d (incorrect -> 0x7939), seq 176:512, ack 1, win 262, length 336
07:07:33.680781 IP (tos 0x0, ttl 128, id 5973, offset 0, flags [DF], proto TCP (6), length 40)
192.168.169.1.31893 > 192.168.169.128.22: Flags [.], cksum 0x50d6 (correct), seq 1, ack 512, win 2060, length 0
07:07:33.680997 IP (tos 0x10, ttl 64, id 3855, offset 0, flags [DF], proto TCP (6), length 568)
192.168.169.128.22 > 192.168.169.1.31893: Flags [P.], cksum 0xd5fd (incorrect -> 0x2323), seq 512:1040, ack 1, win 262, length 528
07:07:33.681332 IP (tos 0x10, ttl 64, id 3856, offset 0, flags [DF], proto TCP (6), length 360)
192.168.169.128.22 > 192.168.169.1.31893: Flags [P.], cksum 0xd52d (incorrect -> 0x4780), seq 1040:1360, ack 1, win 262, length 320
5 packets captured
6 packets received by filter
0 packets dropped by kernel
[root@localhost ~]#

1パケット目について詳細を見ていきます。

まずは時間が表示されます。(07:07:33.679674)

その次にIPヘッダ情報が表示されます。ToSは00010000, TTLは64, flag はDFビット(分割禁止)、プロトコルはTCP、パケット長は216Byteと言うことが分かります。(IP (tos 0x10, ttl 64, id 3853, offset 0, flags [DF], proto TCP (6), length 216))

その次に送信元IP、送信元TCPポート、宛先IP、宛先TCPポートが表示されます。(192.168.169.128.22 > 192.168.169.1.31893)

これは『送信元IP=192.168.169.128』『送信元TCPポート=22』『宛先IP=192.168.169.1』『宛先TCPポート=31893』という意味です。紛らわしいですが、IPアドレスとポート番号が.(ドット)で連結されているのです。

その次にTCPヘッダ情報が表示されます。Pushフラグが立っていること、TCPペイロード長が176Byteであることが分かります。( Flags [P.], cksum 0xd49d (incorrect -> 0xd5e2), seq 1606433180:1606433356, ack 847329430, win 262, length 176)

cksum で incorrect と表示されていますが、tcpdumpを動かしているホストから送信されるパケットについてはこのエラーを無視して構いません。これは『TCP checksum offloading』という機能の影響によるもので、OSとしてはこのチェックサム計算を行わずパケットキャプチャを出力し、その後NICのプロセッサにて計算し送信するためです。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク