Linuxコマンド辞典 tcpdumpコマンド(ネットワーク)

ネットワークトラフィックを出力する「tcpdump」コマンドの概要と使い方を記載しています。

RHEL Fedora CentOS Vine Deblan Ubuntu Plamo

参考サイト:Man page of INSTALL

概要・使用方法

書式

$ tcpdump [オプション] [評価式] 

ネットワークインターフェースを通過するパケットを監視し、評価式にマッチしたパケットの概要を表示します。標準出力への出力以外にオプション(-w/-r)を指定することで、ファイルにパケットデータを書き出したり、書き出したパケットデータを読み込むことができます。

パケットの評価式は1つ以上の基本要素からなります。また、基本要素は1つ以上の装飾要素からなります。装飾要素は「type」「dir」「proto」を定義しています。「type」はhost/port/netを利用し、「host www.yahoo.co.jp」や「port 80」などのように利用します。「dir」はsrc/dst/src or dst/src and dstのいずれかを利用し、パケットの宛先、送信元を限定します。「proto」はプロトコルについて、ip/ip6/arp/tcp/udpなどを利用します。

tcpdumpコマンドを実行すると、ネットワークデバイスはプロミスキャスモードで動作します。通常は自分宛のパケットしか受け取らないが、プロミスキャスモード(無差別透過モード)では自分宛以外のパケットも受け取ります。

オプション

-Aすべてのパケットを(最小限で)ASCII表示する
-aネットワークアドレスとブロードキャストアドレスを名前解決する
-c 数指定した数のパケットを受信したら終了する
-C サイズ出力ファイルの最大サイズを指定(MiB単位)し、超えた場合は別ファイルにローテートする
-Dキャプチャできるネットワークインターフェース一覧を表示する
-eすべてのパケットのリンクレベルヘッダを表示する
-F ファイル名入力に使用するファイルを指定する
-G 秒数ダンプファイルをローテート出力する秒数を指定する。ローテートする数は-Wオプションで指定する
-i インターフェース名指定したネットワークインターフェースのパケットを見る。指定しない場合は、loopbackを除いたリスト(「tcpdump -D」の出力)の1番目のインターフェースを待ち受ける
-lバッファを標準出力にも出力する
-nアドレスやポート番号の名前解決を行わない
-pプロミスキャストモード(無差別透過モード)にしない
-q簡易的な出力とする
-Nホスト名のドメイン部分を表示しない
-r ファイル名-wオプションで作成したパケットのrawファイルを読み込む。「-」を指定すると標準入力を利用する
-s サイズキャプチャするバイト数を指定する(例:0であればデフォルトの65535が使われる)
-STCPシーケンス番号を相対値ではなく絶対値で表示する
-tダンプ表示に時間を表示しない
-vやや詳細に出力する(TTLなども表示される)
-vv-vよりも詳細に出力する
-vvv-vvよりも詳細出力する
-w ファイル名パケットを指定したファイルにrawで出力する
-W 数-Gオプションと併用して、ローテート数を指定する
-x出力を16進数で表示する
-X出力を16進数でASCII文字も表示する
評価式

与えられない場合は、ネットワークインターフェースを通るすべてのパケットを出力する

キーワード説明
type「host」「net」「port」を指定する(デフォルトはhost)
dir「src(送信元)」「dst(宛先)」「src or dst(送信元もしくは宛先)」「src and dst(送信元と宛先)」を指定する(デフォルトはsrc or dst)
protoプロトコルを指定(ip/ip6/arp/icmp/tcp/udpなど)

特定ポート宛のパケットをキャプチャする

80や443ポート番号を指定すると、httpやhttpsのアクセスをパケットキャプチャーすることができる。

$ tcpdump -ni インターフェース dst port ポート番号

実行結果

[root@centos ~]# tcpdump -ni eth0 dst port 22
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:07:51.447478 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 250464274, win 8206, length 0
19:07:51.498523 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 53, win 8212, length 0
19:07:51.544247 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 97, win 8212, length 0
19:07:51.591868 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 141, win 8212, length 0
19:07:51.638927 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 185, win 8211, length 0
19:07:51.684231 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 229, win 8211, length 0
19:07:51.729882 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 273, win 8211, length 0
19:07:51.776376 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 317, win 8211, length 0
19:07:51.823171 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 361, win 8211, length 0
19:07:51.868936 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 405, win 8211, length 0
19:07:51.915432 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 449, win 8210, length 0
19:07:51.961072 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 493, win 8210, length 0
19:07:52.006948 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 537, win 8210, length 0
19:07:52.052887 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 581, win 8210, length 0
19:07:52.099820 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 625, win 8210, length 0
19:07:52.146298 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 669, win 8210, length 0
19:07:52.192842 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 713, win 8209, length 0
19:07:52.238679 IP 192.168.0.29.61763 > 192.168.0.60.ssh: Flags [.], ack 757, win 8209, length 0
^C
18 packets captured            #←キャプチャしたパケット数
19 packets received by filter  #←指定した条件にマッチしたパケット数
0 packets dropped by kernel    #←カーネルが破棄したパケット数
[root@centos ~]# 

特定ポート宛のパケットをキャプチャしASCII文字も併せて表示

$ tcpdump -X -i インターフェース dst port ポート番号

実行結果

[root@centos ~]#  tcpdump -X -i eth0 dst port 22
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:10:39.822184 IP 192.168.0.29.61763 > centos.ssh: Flags [.], ack 250466690, win 8208, length 0
        0x0000:  4500 0028 29a6 4000 8006 4f80 c0a8 001d  E..().@...O.....
        0x0010:  c0a8 003c f143 0016 ca5e dbef 0eed d182  ...<.C...^......
        0x0020:  5010 2010 9602 0000                      P.......
19:10:39.889197 IP 192.168.0.29.61763 > centos.ssh: Flags [.], ack 197, win 8208, length 0
        0x0000:  4500 0028 29a7 4000 8006 4f7f c0a8 001d  E..().@...O.....
        0x0010:  c0a8 003c f143 0016 ca5e dbef 0eed d246  ...<.C...^.....F
        0x0020:  5010 2010 953e 0000                      P....>..
19:10:39.935021 IP 192.168.0.29.61763 > centos.ssh: Flags [.], ack 273, win 8207, length 0
        0x0000:  4500 0028 29a8 4000 8006 4f7e c0a8 001d  E..().@...O~....
        0x0010:  c0a8 003c f143 0016 ca5e dbef 0eed d292  ...<.C...^......
        0x0020:  5010 200f 94f3 0000                      P.......
19:10:39.981796 IP 192.168.0.29.61763 > centos.ssh: Flags [.], ack 349, win 8207, length 0
        0x0000:  4500 0028 29a9 4000 8006 4f7d c0a8 001d  E..().@...O}....
        0x0010:  c0a8 003c f143 0016 ca5e dbef 0eed d2de  ...<.C...^......
        0x0020:  5010 200f 94a7 0000                      P.......

特定のプロトコルパケットをキャプチャする

$ tcpdump -i インターフェース プロトコル

実行結果

[root@centos ~]# tcpdump -i eth0 icmp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
[root@centos ~]# 

特定のトラフィックをダンプする

標準出力ではなくファイルにキャプチャ結果を出力する

$ tcpdump -i eth0 port 22 -w ./tcp-22.raw

実行結果

[root@centos ~]# tcpdump -i eth0 port 22 -w ./tcp-22.raw
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C2 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@centos ~]# wireshark ./tcp-22.raw

ファイルから読み込んで表示する

$ tcpdump -r ダンプファイル -i eth0 icmp

実行結果

[root@centos ~]# tcpdump -w dumplog -i eth0 tcp
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C2 packets captured
3 packets received by filter
0 packets dropped by kernel
[root@centos ~]# tcpdump -r dumplog -i eth0 tcp
reading from file dumplog, link-type EN10MB (Ethernet)
dropped privs to tcpdump
19:17:12.298703 IP centos.ssh > 192.168.0.29.61763: Flags [P.], seq 250475746:250475782, ack 3395220691, win 245, length 36
19:17:12.298849 IP 192.168.0.29.61763 > centos.ssh: Flags [.], ack 36, win 8208, length 0
[root@centos ~]# 

特定のインターフェースに流れるパケットを30分ごとにひとまとめにし、10個のファイルに保存する

$ tcpdump -i インターフェース -G $(expr 60 \* 30) -W 10 -w tcpdump_%Y-%m-%d_%H-%M.cap

実行結果

[root@centos ~]# tcpdump -i eth0 -G $(expr 60 \* 30) -W 10 -w tcpdump_%Y-%m-%d_%H-%M.cap
dropped privs to tcpdump
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C17 packets captured
20 packets received by filter
0 packets dropped by kernel
[root@centos ~]#