とほほのtcpdump入門
目次
tcpdumpとは
- Linux でよく利用されるパケットキャプチャツールです。
- ネットワークインタフェースで受信するパケットを受信して表示します。
- 本書では tcpdump 4.9.3 をターゲットに説明します。
インストール
# 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マルチキャストパケットをキャプチャします。
上記以外の条件式については下記のリンク先を参照してください。
リンク
Copyright (C) 2022 杜甫々
初版:2022年5月15日、最終更新:2022年5月22日
https://www.tohoho-web.com/ex/tcpdump.html