tcpdumpの使い方|Linuxパケットキャプチャとフィルタ解析の実践ガイド

コマンドリファレンス

tcpdump コマンドは、LinuxやUNIX系OSでネットワークインターフェースを流れるパケットをリアルタイムにキャプチャ・解析するための強力なコマンドラインツールです。
Webサーバーの接続障害、特定IPからの不審な通信、DNS名前解決の失敗など、ネットワークトラブルシューティングにおいて必須のツールです。

本記事では、tcpdump の基本的な使い方から主要オプション、目的別にパケットを絞り込むフィルタ指定、出力結果の読み方、pcapファイル保存・Wireshark連携、トラブル対処までわかりやすく解説します。

基本構文と実行前の準備

tcpdump の基本構文は以下の通りです。

sudo tcpdump [オプション] [フィルタ式]

1. 実行にはroot権限(sudo)が必要

ネットワークインターフェースをプロミスキャスモード(混在モード)で読み取るため、通常は sudo や root 権限が必要です。一般ユーザーで実行すると Operation not permitted などの権限エラーが発生します。

2. 利用可能なインターフェースの一覧確認(-D)

どのネットワークインターフェース(eth0, ens33, lo など)が存在するか調べるには -D オプションを使用します。

sudo tcpdump -D

出力例:

1.eth0 [Up, Running, Connected]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

any を指定すると、サーバー上のすべてのインターフェースの通信を一括でキャプチャできます。

主なオプション一覧

実務でよく使われる tcpdump の主要オプションを整理しました。

オプション説明使用例
-i IFACE対象のインターフェースを指定(デフォルトは1番目の有効IF)sudo tcpdump -i eth0
-nホスト名やポート名を名前解決せずIP・数値で表示(高速・推奨)sudo tcpdump -n -i eth0
-c N指定したパケット数(N件)に達したら自動終了sudo tcpdump -c 10
-w FILEキャプチャ結果をファイル(pcap形式)に保存sudo tcpdump -w output.pcap
-r FILE保存されたpcapファイルを読み込んで表示tcpdump -r output.pcap
-AパケットのペイロードをASCIIテキストで表示(HTTP等の確認用)sudo tcpdump -A port 80
-Xヘッダ+データを16進数とASCIIの両方で表示sudo tcpdump -X port 80
-v / -vv / -vvv出力表示の詳細度(TTL、ID、オプション等)を上げるsudo tcpdump -vv -i eth0
-ttttタイムスタンプを「YYYY-MM-DD HH:MM:SS.microsec」形式で表示sudo tcpdump -tttt -i eth0
-l出力を行バッファリングし、パイプ処理(grep等)で即時出力sudo tcpdump -l | grep "80"

通信を絞り込むフィルタ指定(フィルタ式)

サーバー上の全パケットを表示すると大量のログで画面が埋まってしまいます。フィルタ式を使って目的の通信だけを抽出しましょう。

1. IPアドレス・サブネット指定(host / net)

  • 特定のIPアドレスとの通信:sudo tcpdump host 192.168.1.100
  • 送信元IPを指定:sudo tcpdump src host 192.168.1.100
  • 宛先IPを指定:sudo tcpdump dst host 192.168.1.100
  • ネットワーク帯(CIDR)を指定:sudo tcpdump net 192.168.1.0/24

2. ポート番号・プロトコル指定(port / tcp / udp)

  • 特定ポートの通信(80番):sudo tcpdump port 80
  • 送信元ポートを指定:sudo tcpdump src port 80
  • ポート範囲を指定:sudo tcpdump portrange 8000-8080
  • プロトコルを指定(tcp, udp, icmp等):sudo tcpdump icmp

3. 論理演算子による複数条件の組み合わせ(and / or / not)

and, or, not を使うことで細かい条件指定が可能です。シェルでの誤動作を防ぐため、複合条件はシングルクォートで括ると安全です。

# 192.168.1.100 との通信かつポート80のパケット
sudo tcpdump 'host 192.168.1.100 and port 80'

# ポート80または443(HTTP/HTTPS)の通信
sudo tcpdump 'port 80 or port 443'

# SSH(ポート22)以外の通信を抽出
sudo tcpdump 'not port 22'

実践的な実行例

例1:HTTPリクエストの内容をテキスト(ASCII)確認

WebサーバーへのリクエストヘッダやGET/POSTパラメータを確認するには -A オプションを使用します。

sudo tcpdump -i any -n -A 'tcp port 80'

出力例:

00:12:34.567890 IP 192.168.1.50.54321 > 192.168.1.10.80: Flags [P.], seq 1:150, ack 1, win 502, length 149
GET /index.html HTTP/1.1
Host: 192.168.1.10
User-Agent: curl/7.68.0
Accept: */*

例2:DNS名前解決の問い合わせ(UDP 53)を確認

名前解決が遅い・失敗する場合のトラブルシューティング例です。

sudo tcpdump -i any -n 'udp port 53'

出力例:

00:15:20.123456 IP 192.168.1.50.43210 > 8.8.8.8.53: 4521+ A? example.com. (29)
00:15:20.145678 IP 8.8.8.8.53 > 192.168.1.50.43210: 4521 1/0/0 A 93.184.216.34 (45)

例3:TCP接続の握手(SYNパケット)のみ取得

新規接続の試行(SYN)を検出してポートスキャンや接続開始要求を確認します。

sudo tcpdump -i eth0 -n 'tcp[tcpflags] & tcp-syn != 0'

例4:キャプチャをファイルに保存してWiresharkで解析(pcap)

本番サーバーでパケットを保存し、手元のPC上のWireshark(GUIツール)で詳細解析する手順です。

# ファイルへ保存(-w)
sudo tcpdump -i eth0 -w capture.pcap 'port 80 or port 443'

# 保存したファイルをtcpdumpで確認(-r)
tcpdump -r capture.pcap -n

tcpdump出力ログの読み解き方

tcpdump の出力行には、通信の詳しい状態が含まれています。標準的な1行の構成を読み解いてみましょう。

12:34:56.789123 IP 192.168.1.50.54321 > 93.184.216.34.80: Flags [S], seq 12345678, win 64240, length 0
  1. 12:34:56.789123:パケットをキャプチャした時刻(時:分:秒.マイクロ秒)。
  2. IP:ネットワーク層のプロトコル(IPv4)。
  3. 192.168.1.50.54321 > 93.184.216.34.80:送信元IP.ポート > 宛先IP.ポート。
  4. Flags [S]:TCPフラグ(後述)。[S] はSYN(接続開始)。
  5. seq 12345678:シーケンス番号。
  6. win 64240:TCPウィンドウサイズ(受信可能バッファ容量)。
  7. length 0:パケットのデータ長(バイト数)。

主なTCPフラグ記号:

フラグ記号名称意味・役割
[S]SYN接続確立の要求(3ウェイハンドシェイク第1段階)
[.]ACK応答確認(データ受領の通知)
[P.] / [P]PUSHデータを直ちにアプリへ渡す(データ送信時)
[F.] / [F]FIN接続終了の要求
[R] / [R.]RST接続の強制切断・拒否(ポートが閉じている等)

よくあるエラーと注意点

1. tcpdump: command not found(コマンドが見つからない)

tcpdump がインストールされていない場合は、パッケージマネージャーからインストールします。

# Ubuntu / Debian
sudo apt update && sudo apt install -y tcpdump

# RHEL / CentOS / Rocky Linux / AlmaLinux
sudo dnf install -y tcpdump

2. Operation not permitted / Permission denied

sudo を付けずに実行した場合の権限エラーです。sudo tcpdump ... のように実行してください。

3. 高負荷環境での注意(パケットドロップとサーバー負荷)

トラフィックの激しい本番サーバーで条件なしで tcpdump を実行すると、CPU使用率やディスク容量が急増する危険性があります。以下の対策を徹底しましょう。

  • -c 1000 などでパケット件数を制限する
  • -n で名前解決のオーバーヘッドを無くす
  • 特定IPやポート番号で事前に条件を絞り込む

よくある質問(FAQ)

Q. tcpdumpとWiresharkの違いは何ですか?
A. tcpdump はCUI(コマンドライン)で動作するパケットキャプチャツールで、サーバー上での軽量・迅速な調査に適しています。一方、WiresharkはGUIツールで、パケットの流れをグラフィカルに可視化・分析するのに優れています。サーバーで tcpdump -w output.pcap 保存し、PCのWiresharkで解析するのが一般的な組み合わせです。

Q. キャプチャの途中で終了するにはどうすればいいですか?
A. ターミナルで Ctrl + C を押すと安全にキャプチャを停止できます。停止時に「パケットキャプチャ件数」「カーネルによりドロップされたパケット数」が集計表示されます。

関連記事・ステップアップ

ネットワーク設定やトラブルシューティングの理解を深めるため、以下の関連記事もぜひ参考にしてください。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント