とほほのtcpdump入門

目次

tcpdumpとは

インストール

# CentOS 7
# yum -y install tcpdump
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips  26 Jan 2017

# CentOS 8(Rocky Linux / AlmaLinux)
# dnf -y install tcpdump
# tcpdump --version
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1k  FIPS 25 Mar 2021

# Ubuntu 20.04
$ sudo apt -y install tcpdump
$ tcpdump --version
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1f  31 Mar 2020

使用例

# 192.168.0.100 から送信されるパケットをキャプチャする
# tcpdump src host 192.168.0.100

# 192.168.0.100 が送受信する 8080番ポートのパケットをキャプチャする
# tcpdump host 192.168.0.100 and port 8080

# 16進ダンプ付きでキャプチャする
# tcpdump -X host 192.168.0.100

オプション

ヘルプ関連

--version
バージョン情報を表示します。
-h
--help
ヘルプメッセージを表示します。

インタフェース関連

-i interface
--interface=interface
指定したインタフェースのみをキャプチャします。
-D
--list-interfaces
-i オプションで指定可能なインタフェースの一覧を表示します。
-p
--no-promiscuous-mode
インタフェースを非プロミスキャスモードにします。自分あて以外のパケットはキャプチャしなくなります。
-I
--monitor-mode
インタフェースをモニターモードにします。一部の OS で、かつ、IEEE802.11 Wi-Fi インターフェイスでのみサポートされます。
-L
--list-data-link-types
-y オプションで指定可能な、インタフェースのデータリンクタイプの一覧を表示します。
-y datalink_type
--linktype=datalinktype
パケットキャプチャに使用するデータリンクタイプを指定します。

キャプチャ制限関連

-F file
src host などの条件式をファイルで指定します。
-c count
パケットを指定個受信すれば終了します。
-s snaplen
--snapshot-length=snaplen
パケットの先頭から指定したバイト数のみキャプチャします。
-Q direction
--direction=direction
パケットをキャプチャする方向を in, out または inout のいずれかで指定します。プラットフォームによっては使用できません。

表示関連

-n
ホストアドレスを名前に変換しません。
-nn
ホストアドレスに加えてポート番号等も名前に変換しません。
-N
ホストのドメイン名をホスト部のみ表示します。www.example.com の場合は www のみ。
-A
パケットの内容をASCII文字で表示します。
-x
パケット情報を16進数ダンプします。データリンク層(Ethernetなど)は表示しない。
-X
パケット情報を16進数とASCIIでダンプします。データリンク層(Ethernetなど)は表示しない。
-#
--number
先頭にパケット番号を表示します。
-v
少し詳細に表示します。IPヘッダ情報やチェックサム情報など。
-vv
もうすこし詳細に表示します。NFS応答の付加フィールドなど。
-vvv
もっと詳細に表示します。telnetオプションなど。
-a
ネットワークとブロードキャストアドレスをDNS名に変換します。
-d
コンパイルされたパケットマッチングコードを人が読める形式で表示します。
-dd
パケットマッチングコードをC言語形式で表示します。
-ddd
パケットマッチングコードを10進形式で表示します。
-f
外部IPv4アドレスを数字で表示します。
-q
クワイエットモードとしてパケット情報を省略して表示します。

ファイル出力関連

-w file
パケット情報をバイナリでファイルに書き込みます。-r オプションで読み込むことができます。
-r file
-w オプションで書き込んだパケット情報ファイルを読み込んで表示します。
-V file_list
-r オプションの代わりに使用し、読み込むファイル名の一覧を file_list ファイルから読み込みます。
-C file_size
-w でファイルに書き込む際に、ファイルサイズ毎にファイルをローテートします。file_size は 1,000,000バイト単位で指定します。-w file と指定した場合、生成されるファイル名は file, file1, file2, ... となります。Permission denied エラーが出る場合は -Z オプションでユーザを指定してみてください。
-G seconds
-w でファイルに書き込む際に seconds秒毎にファイルをローテートします。ファイル名には strftime(3) 形式のフォーマット(%Y/%m/%d_%H:%M:%S等)が利用できます。(※ Couldn't change ownership of savefile エラーで利用できない?)
-W file_count
-w オプションで書き込むファイルの個数を制限します。-C オプションと組み合わせた場合は、ファイル末尾の数字は 0, 1, 2, ... となり、-W で指定した個数を超えると 0 に戻ります。-G オプションと組み合わせた場合は -W で指定したファイル個数を超えると処理を停止します。
-z post_rotate_command
-C や -G オプションでファイルがローテートされる際に post_rotate_command file を実行します。例えば、-z gzip を指定するとファイルをローテートする度に生成したファイルを gzip で圧縮することができます。

タイムスタンプ関連

-t
タイムスタンプを表示しません。
-tt
タイムスタンプを 1970年1月1に地 00:00:00 UTC からの秒数で表示します。
-ttt
タイムスタンプを直前のパケット受信時からの差分で表示します。
-tttt
タイムスタンプの前に日付を付加して表示します。
-ttttt
タイムスタンプを最初に受信したパケット受信時からの差分で表示します。
--time-stamp-precision precision
タイムスタンプの精度を指定します。precision には micro または nano を指定します。
-j time_stamp_type
--time-stamp-type time_stamp_type
タイムスタンプタイプを指定します。指定可能なタイムスタンプタイプは -J オプションで調べることができます。
-J
--list-time-stamp-types
-j オプションで指定可能なタイムスタンプタイプの一覧を表示します。

バッファリング関連

-B size
--buffer-size=size
受信バッファサイズをKB(1024bytes)単位で指定します。
--immediate-mode
パケットを受信するとバッファリングせずに直ちに出力します。tcpdump の主力先がコンソールなどの場合はデフォルトでこのモードになります。
-l
標準出力をバッファリングします。
-U
--packet-buffered
出力をバッファリングモードにします。

プロトコル依存

-b
BGPパケット中のAS番号をASPLAIN表記ではなくASDOT表記で表示します。
-K
--dont-verify-checksums
TCP や UDP のチェックサムを検証しません。
-S
--absolute-tcp-sequence-numbers
TCPシーケンス番号を相対値ではなく実値で表示します。
-T type
指定したプロトコル(rtp, snmp等)として解釈します。
-u
デコードされていないNFSハンドルを表示します。
-e
Ethernetなどリンク層のヘッダ情報も表示します。
-E algo:secret
IPSec ESPパケットを復号化する際に algo:secret を使用します。
-H
802.11sドラフトメッシュヘッダーの検出を試みます。
-m file
MIB の解析を行うために、SMI MIB モジュールファイルを読み込みます。-m オプションは複数指定することができます。
-M secret
TCP-MD5 オプション(RFC2385)が使用されている場合、TCP セグメント中のダイジェストを検証するための共有シークレットを指定します。

その他

-O
--no-optimize
パケットマッチングコードオプティマイザを無効にします。
-Z user
実行ユーザを指定します。省略時は tcpdump ユーザとして動作します。

条件式

条件式の中で主なものを紹介します。

論理演算子

exp1 and exp2
exp1 or exp2
not exp1
条件式に対して and(かつ)、or(または)、not(否定) の論理演算を行います。下記の様に ( ... ) を使用することもできます。コマンドラインから使用する場合はシェルが ( や ) を解釈しないように \ でエスケープします。
# tcpdump \( src host 192.168.0.100 \) and \( dst port 80 or dst port 8080 \)

ホスト指定

src host 192.168.0.100
dst host 192.168.0.100
host 192.168.0.100
src host は送信元ホストが、dst host は送信先ホストが、host は送信元または送信先ホストが 192.168.0.100 であればキャプチャします。

ネットワーク指定

src net 192.168.100.0/24
src net 192.168.100.0 mask 255.255.255.0
dst net 192.168.100.0/24
dst net 192.168.100.0 mask 255.255.255.0
net 192.168.100.0/24
net 192.168.100.0 mask 255.255.255.0
src net は送信元ネットが、dst net は送信先ネットが、net は送信元または送信先ネットが 192.168.100.0/24 であればキャプチャします。
ip broadcast
ip multicast
ip6 multicast
IPブロードキャスト、IPマルチキャスト、IPv6マルチキャストパケットをキャプチャします。

ポート指定

src port 8000
dst port 8000
port 8000
src port は送信元ポートが、dst port は送信先ポートが、port は送信元または送信先ポートが 8000 であればキャプチャします。
src portrange 8000-9000
dst portrange 8000-9000
portrange 8000-9000
src portrange は送信元ポートが、dst portrange は送信先ポートが、portrange は送信元または送信先ポートが 8000~9000 であればキャプチャします。

パケットサイズ指定

less 1000
greater 1000
less はパケットサイズが 1000 バイト以下のもの、greater は 1000バイト以上のものをキャプチャします。

プロトコル指定

tcp | udp | icmp | sctp
プロトコルが TCP、UDP、ICMP、SCTP であるものをキャプチャします。
ip | ip6 | arp | rarp | atalk | aarp | decnet | iso | stp | ipx | netbeui
Ethernet上の上位プロトコルを指定します。
ip proto protocol
ip6 proto protocol
proto protocol
ip proto は IPv4 上の、ip6 proto は IPv6 上の、proto は IPv4 または IPv6 上の上位プロトコルを指定します。protocol には icmp、icmp6、igmp、igrp、pim、ah、esp、vrrp、udp、tcp のいずれか、もしくはプロトコル番号を指定できます。icmp, udp, tcp はキーワードでもあるので、\icmp (シェルから起動する場合は \\icmp) の様に \ でエスケープする必要があります。プロトコルヘッダチェーン(IPv6 ヘッダと TCPヘッダの間に認証ヘッダが挿入されるTCPパケット等)には対応しません。
ip protochain protocol
ip6 protochain protocol
protochain protocol
ip proto 等と同様ですが、プロトコルヘッダチェーンに対応する点が異なります。

Ethernet関連

ether src 0e:dd:d8:e5:6d:13
ether dst 0e:dd:d8:e5:6d:13
ether host 0e:dd:d8:e5:6d:13
ether src は送信元MACアドレスが、ether dstは送信先MACアドレスが、ether は送信元または送信先MACアドレスが 0e:dd:d8:e5:6d:13 であればキャプチャします。
ether proto protocol
Ethernet上の上位プロトコルを指定します。protocol には aarp, arp, atalk, decnet, ip, ip6, ipx, iso, lat, loopback, mopdl, moprc, netbeui, rarp, sca, stp またはプロトコル番号を指定します。loopback 以外の名前はキーワードでもあるので、\aarp (シェルから起動する場合は \\aarp) の様に \ でエスケープする必要があります。
ether broadcast
ether multicast
Ethernetブロードキャスト、Ethernetマルチキャストパケットをキャプチャします。

上記以外の条件式については下記のリンク先を参照してください。