linux【tcpdump】の見方, 使い方, Filter, Option(ローテーション等), 解析方法について

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

Windows上でのパケットキャプチャはWiresharkがよく使われますが、Linux上でのパケットキャプチャはtcpdumpを使います。名前から迷いますがUDPも普通にキャプチャできます。

また、tcpdump で取得したファイルはWindows上のWiresharkで見ることもできます。

CentOS7でのインストール方法

yum -y install tcpdump

一般的なオプション

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

tcpdump -i eth1 -nn -vvv

オプション "-i" はインタフェース名を指定します。VMware等で作っているLinuxの場合、デフォルトで他のインタフェースが指定されていたりしますので、このオプションでキャプチャしたいインタフェースを指定します。

複数インタフェースでキャプチャをしたい場合は -i any で全インタフェースを指定します。

tcpdump -i any -nn -vvv

オプション "-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"と一緒に使うと、1秒毎に何パケットキャプチャしたかをリアルタイム表示してくれます。

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

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\)

ローテーションについて

時間によるローテーション

tcpdump では -G オプションで時間単位でのローテーションが可能です。以下の記述では、pcapファイルを1時間毎に新規生成・分割し、1日単位でローテーションしていきます。

tcpdump -i eth0 -G 3600 -w capture-at-%H.pcap

-G はローテーションを実施する秒数(つまり1時間おきにファイルを生成する)、-w でのファイル名指定の中の "%H" はファイル生成時刻の "?時" を意味します。つまり14時にファイル生成すれば "%H=14" です。

ファイル名に使える %で始まる変数は、"strftime関数"で定義されているものです。例えば %a=曜日、%b=月、%d=日にち、%H=24時間表記の時間、%M=分、%S=秒 です。

なお、指定ファイル数分だけ取得できたら tcpdump を停止したい!という場合は -W オプションを使います。以下の例では10ファイル生成されたら tcpdump は停止します。

tcpdump -i eth0 -G 3600 -W 10 -w capture.pcap

サイズによるローテーション

tcpdump では単体機能でサイズによる上書きローテーション機能はありません。timeout コマンドと cron を組み合わせれば何とか、、といった感じです。以下の例では、pcapファイルを1MBサイズ毎に新規生成・分割し、1800秒単位でローテーションが行われます。

timeout 1800 tcpdump -i eth0 -C 1 -w capture-per-1MB.pcap

-C オプションではファイルサイズ(単位=1,000,000byte≒1MB)を指定します。-wで指定されたファイル名の最後に通し番号が付きます。例えば2番目に生成されたファイルは "capture-per-1MB.pcap2" となります。

このコマンド実行を cron で 30分毎に実行すれば目的は適うはずです。

また、サイズローテーションのときと同様、指定ファイル数生成した後にtcpdumpを止めたい!という場合はやはり -W オプションを使います。以下の例では10ファイル生成したら tcpdump を止めます。

tcpdump -i eth0 -C 1 -W 10 -w capture-per-1MB.pcap

-sオプションについて

昔のtcpdumpは1パケットあたりに取得できるサイズがデフォルトで68Byteでした。なのでtcp/udpやhttp等の中身までキャプチャするには"-s"オプションでサイズを指定する必要がありました。

tcpdump -i eth1 -nn -vvv -s 1500

ですが最近では 262144 bytes という十分すぎるサイズになっていますので指定は不要です。

取得したパケットの見方

[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のプロセッサにて計算し送信するためです。

コマンド生成ツール DA DUMP

tcpdumpを一度も使ったことの無い初心者でも簡単にコマンドを作成できます。

【tcpdumpコマンド自動生成Tool】DA DUMP ~OptionやFilterも装備!サンプルいらず!~
【tcpdumpコマンド自動生成Tool】DA DUMP ~OptionやFilterも装備!サンプルいらず!~
DA DUMP tcpdumpを一度も使ったことの無い初心者でも簡単にコマンド...

シェアする

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

フォローする