tcpdumpで複数フィルタ条件を指定する
株式会社テイクーワンのY.Yです。
本稿では、Linux環境においてtcpdumpコマンドで複数のフィルタ条件を指定する方法を記します。
![]()
tcpdumpコマンドについて
tcpdumpは、システムを通過するネットワークトラフィックをキャプチャして分析できるコマンドラインツールです。
通信トラブルが発生したときなど、パケットレベルで何が起きているかを確認したいときに使用します。
標準でインストールされていることが多く、GUI不要でリモート環境でも実行可能なため、サーバ運用管理の現場ではよく利用されています。
実際に稼働しているサーバではネットワークトラフィック量も膨大となるため、複数のフィルタ条件を指定することで、分析対象の情報をうまく絞り込む必要があります。
基本構文
本コマンドは、管理者権限で実行します。
(動作確認環境:RHEL9.7)
# tcpdump [オプション] [フィルタ]
オプション部分では、tcpdumpコマンド自体の動作や出力フォーマットを指示します。
フィルタ部分では、キャプチャ・表示するパケットの種類を絞り込みます。
オプション例
実務でよく使うものの一例を記します。(一覧は本稿下部の【参考】等でご確認ください。)
オプションは、複数のものを併記して使用することができます。
・ -i [インターフェース名]
:キャプチャするネットワークインターフェースを指定します。 (例: -i ens192)
全インターフェースを対象とする場合は「-i any」と指定します。
・ -nn
:ホスト名・ポート番号の名前解決を無効化してIPアドレスと数値のまま表示します。
見やすさに加え、名前解決による遅延を防ぐ効果があります。
トラブルシューティング時はIPアドレス表記の方が分かりやすいので、指定することが多いです。
・ -c [パケット数]
:指定したパケット数だけキャプチャします。(例: -c 5)
本オプションを指定しない場合は、Ctrl+Cで中断するまで取得しつづけます。
・ -s 0
:パケット全体のデータを取得する場合に指定します。
・ -A
:パケットデータをASCIIテキストで表示します。HTTP通信の内容確認時等に使用します。
・ -w [ファイル名]
:キャプチャデータをWireshark等で解析可能な.pcap形式で保存します。
フィルタ例
実務でよく使うものの一例を記します。(一覧は本稿下部の【参考】等でご確認ください。)
・ port [ポート番号] :指定したポート番号の通信をキャプチャします。
・ host [IPアドレス] :指定したIPアドレスとの通信(送受信とも)をキャプチャします。
・ src [IPアドレス] :指定した送信元IPアドレス(Source)との通信をキャプチャします。
・ dst [IPアドレス] :指定した宛先IPアドレス(Destination)との通信をキャプチャします。
・ net [ネットワークアドレス] :指定したネットワークとの通信をキャプチャします。
例文
【例①】
・ 全インターフェースを対象とする
・ 名前解決しない
・ ASCIIテキストで表示する
・ 80番ポートの送受信データをキャプチャする
↓
# tcpdump -i any -nn -A port 80
【例②】
・ インターフェースens192を対象とする
・ 名前解決しない
・ パケットデータ全体を取得する
・ キャプチャデータを/XXXXX/XXXXX.pcapに保存する
・ 送信元IPアドレス192.168.1.1のデータをキャプチャする
↓
# tcpdump -i ens192 -nn -s 0 -w /XXXXX/XXXXX.pcap src 192.168.1.1
複数のフィルタ条件を指定する
論理演算子(and/or/not)を使用することにより、複数のフィルタ条件を組み合わせることができます。
・ and (かつ)
・ or (または)
・ not (否定)
例文
【例①】
・ 全インターフェースを対象とする
・ 名前解決しない
・ ASCIIテキストで表示する
・ 80番ポートの送受信データをキャプチャする
・ 192.168.1.1との送受信データをキャプチャする
↓
# tcpdump -i any -nn -A port 80 and host 192.168.1.1
【例②】
・ インターフェースens192を対象とする
・ 名前解決しない
・ パケットデータ全体を取得する
・ キャプチャデータを/XXXXX/XXXXX.pcapに保存する
・ 送信元IPアドレス192.168.1.1または192.168.1.2のデータをキャプチャする
↓
# tcpdump -i ens192 -nn -s 0 -w /XXXXX/XXXXX.pcap src 192.168.1.1 or src 192.168.1.2
【例③】
・ 全インターフェースを対象とする
・ 名前解決しない
・ 192.168.1.1との送受信データをキャプチャする
・ 22番ポートの送受信データを除外する
↓
# tcpdump -i any -nn host 192.168.1.1 and not port 22
より複雑なフィルタ条件を指定する場合
フィルタ条件を丸括弧( )でグループ化することで、より複雑な表現を作成することができます。
この場合、丸括弧( )がシェルに解釈されるのを防ぐため、フィルタ部分全体を引用符” ”で囲います。
【例】
・ インターフェースens192を対象とする
・ 名前解決しない
・ パケットデータ全体を取得する
・ キャプチャデータを/XXXXX/XXXXX.pcapに保存する
・ 80番ポートの送受信データをキャプチャする
・ 送信元IPアドレス192.168.1.1または192.168.1.2のデータをキャプチャする
↓
# tcpdump -i ens192 -nn -s 0 -w /XXXXX/XXXXX.pcap "port 80 and (src 192.168.1.1 or src 192.168.1.2)"
まとめ
・ 基本構文は「 # tcpdump [オプション] [フィルタ] 」
・ フィルタを複数指定する場合は、論理演算子(and/or/not)を使う
・ 複雑な表現が必要な場合は丸括弧( )でグループ化し、フィルタ部分全体を引用符" "で囲う
【参考】
https://www.redhat.com/ja/blog/introduction-using-tcpdump-linux-command-line
https://www.tcpdump.org/manpages/tcpdump.1.html
