概要
Linux環境におけるネットワーク障害の切り分けやパケットレベルの調査において、デファクトスタンダードとして広く活用されている tcpdump。膨大な man ページを読み解く代わりに、NICの検出からリアルタイムな通信のフィルタリング、PCAPファイルへのダンプと解析に至るまで、現場ですぐに役立つ実践例を交えながら体系的に解説します。
tcpdumpの導入とパケット取得対象インターフェースの確認
パケットモニタリングおよびトラフィック検証環境を整備するため、前提となる tcpdump と curl の各ツールをシステムへ導入します。

パッケージのセットアップが完了したら、tcpdump --version を投入して導入済みバイナリおよびバックエンドで動作するキャプチャライブラリ libpcap のバージョン情報をチェックします。tcpdump は、ネットワークインターフェースを通過する通信パケットをリアルタイムに傍受し、各プロトコルの詳細なトラフィック構造を解析できる強力なCLIユーティリティです。
⚙️ [主要オプション一覧]
-i : 監視対象とするネットワークインターフェースを指定します。-n : ホストのアドレス解決(名前解決)を抑止し、IPアドレスのまま直接表示します。-nn : ホスト名に加えてポート番号のサービス名解決も無効化し、すべて数値として出力します。-c : 指定したパケット数を取得した段階で、プロセスの実行を自動終了します。-v : TTLやパケットID、ヘッダー情報など出力内容の詳細度を引き上げます(-vv、-vvv でさらに詳細化可能)。-w : 取得した未加工のパケットデータを、Wireshark等で読み込み可能なPCAP形式ファイルへ書き出します。-r : 保存済みのPCAPキャプチャファイルを読み込み、ターミナル上にパケット一覧を表示します。-A : パケット内のペイロード領域を可読性の高いASCIIテキストとして展開します。-X : パケットのヘッダーおよびペイロードを、16進数(HEX)とASCIIテキストの双方で並列表示します。-D : システム上でパケット捕捉が可能な全ネットワークインターフェースの一覧を列挙します。

続いて tcpdump -D を実行し、キャプチャ可能なネットワークデバイスの一覧をインターフェース番号および状態とともに取得します。
出力結果を確認すると、外部通信を受け持つ物理NIC eth0、全デバイスを横断して一括監視できる仮想インターフェース any、そしてローカルループバック lo などが識別できます。これらの識別子は以降のキャプチャ実行時に -i 引数として指定します。

ループバックインターフェースでの基本的なパケットキャプチャ
ローカル環境内でのパケット捕捉テストを行うため、ping -c 4 127.0.0.1 > /dev/null 2>&1 & をバックグラウンドジョブとして走らせ、試験用のICMPパケットを意図的に流します。

バックグラウンド通信の発生に合わせて tcpdump -i lo -c 4 -n を実行します。ここではループバックインターフェース(lo)を対象に、DNS名前解決を行わず(-n)、4パケット分(-c 4)だけ通信を捕捉しています。
コンソールには 127.0.0.1 相互間で交わされたICMP echo request / reply の計4パケットが、正確なタイムスタンプ、シーケンス番号、ペイロード長とともに記録されていることが確認できます。

プロトコルとポート条件による動的トラフィックフィルタリング
HTTPS通信のパケット捕捉シナリオを再現するため、curl -s https://example.com > /dev/null 2>&1 & をバックグラウンドで呼び出し、443番ポート宛てのHTTP/TLSリクエストをトリガーします。

ここで tcpdump -i any -c 4 -nn 'tcp port 443' を実行します。すべてのインターフェース(-i any)を横断監視し、IPとポートの双方を数値表記のまま(-nn)、TCP 443番ポートに限定したフィルタ式('tcp port 443')で先頭4パケット(-c 4)を取得します。
キャプチャ結果からは、外部Webサーバー(172.66.147.243.443)とローカルホスト(172.18.0.2)間でやり取りされたHTTPSセッションのTCPフラグ、シーケンス番号、ACK番号、パケット長が的確に抽出されている様子が分かります。

続いてICMPトラフィックの抽出検証を行うため、パブリックDNS宛てに ping -c 2 8.8.8.8 > /dev/null 2>&1 & をバックグラウンドで送出します。

この状態で tcpdump -i any -c 2 -n 'icmp' を走らせると、全インターフェース(-i any)を対象にIPアドレス直接表示(-n)を維持しつつ、ICMPプロトコル('icmp')に該当するフレームのみを2件(-c 2)選別してキャプチャできます。
画面上のログより、ローカルマシン(172.18.0.2)とGoogle Public DNS(8.8.8.8)の間で送受信されたICMP echo request / reply パケットの識別子(id)、シーケンス番号(seq)、データ長が漏れなく取得されていることが把握できます。

PCAPファイルへのパケット保存とペイロード詳細解析
パケットダンプの保存手順を検証するため、まずは ping -c 3 127.0.0.1 > /dev/null 2>&1 & をバックグラウンドで起動し、キャプチャ用のサンプル通信を生成します。

トラフィックの発生中に tcpdump -i lo -c 3 -w /tmp/traffic_sample.pcap を実行します。これにより、ループバックデバイス(lo)経由のパケット3個(-c 3)が、未加工のバイナリデータとして指定先ファイル(/tmp/traffic_sample.pcap)へ直接書き込まれます。
画面へパケットを逐次描画せずファイルへ直にダンプするため、高トラフィック環境での負荷軽減や、後からのWiresharkによるオフライン精密分析・長期保管に最適です。

保存されたダンプファイルを精査するため、tcpdump -r /tmp/traffic_sample.pcap -n -X を実行します。-r オプションで該当PCAPファイル(/tmp/traffic_sample.pcap)をロードし、名前解決をスキップ(-n)した上で、ヘッダー情報とペイロードを16進数およびASCII(-X)で同時にダンプ表示します。
実行結果を確認すると、各ICMPパケットのプロトコルヘッダーのみならず、実際に運搬されたペイロードの生バイト列と可読文字が並列展開され、通信の中身を余すところなく調査できることが分かります。

一連の検証が完了したら、作業用として生成した一時キャプチャファイルを rm -f /tmp/traffic_sample.pcap コマンドで安全に破棄します。

本記事では、Ubuntu環境における tcpdump を用いた基礎的なパケットキャプチャから、実用的なトラフィックフィルタリング、PCAP保存およびペイロード解析までの実践的アプローチを紹介しました。
ここで取り上げた主要オプションやフィルタ構文をマスターし、日々のネットワーク診断や障害対応、セキュリティ調査にお役立てください。