「サーバーへの通信がうまくいかない」「ネットワークの中で何が起きているのか見たい」——そんなときに使うのが tcpdump コマンドです。本記事では、tcpdumpを初めて触る方を対象に、基本の使い方からよく使うオプション、出力結果の読み方、実際に手を動かして試す方法までをやさしく解説します。読み終える頃には、ターミナルでパケットの流れを観察できるようになっているはずです。
tcpdumpとは何か
tcpdumpは、ネットワークインターフェイス(ネットワークに接続するための窓口)を流れるパケットをキャプチャ・表示するコマンドラインツールです。LinuxやmacOSには標準で搭載されており、ネットワークトラブルの原因調査やプロトコル学習に長年使われてきた定番ツールです。
イメージとしては、道路を走る車を1台ずつ覗き込んで「どこから来て、どこへ行くのか、何を運んでいるのか」を確認できる虫眼鏡のようなツールです。

主な用途は次のとおりです。
- ネットワークトラブルの原因調査(通信が届いているか、相手から応答があるか)
- セキュリティ調査(怪しい通信がないかチェック)
- プロトコルの学習(TCP/IPがどう動いているかを目で見て理解)
- アプリケーションのデバッグ(APIリクエストの中身確認など)
基本構文と必須オプション
tcpdumpの基本構文は以下のとおりです。パケットキャプチャは管理者権限が必要なため、ほぼ必ず sudo を付けて実行します。
sudo tcpdump [オプション] [フィルタ式]初心者がまず覚えたい4つのオプションを整理しました。
| オプション | 意味 |
|---|---|
-i <名前> | 監視するインターフェイスを指定(「どの窓口を見るか」を決める) |
-nn | 名前解決をしない(表示が速く、正確になる) |
-c <数> | 指定した数のパケットを取ったら終了(無限に流れ続けるのを防ぐ) |
-w <ファイル名> | 結果をファイルに保存(後でWiresharkで詳細解析できる) |
-nn オプションが超重要な理由
tcpdumpはデフォルトでは、IPアドレスをホスト名に、ポート番号をサービス名に変換して表示します。一見親切ですが、次のような問題があります。
- 遅い:表示するたびにDNSへ問い合わせが発生する
- ノイズが混じる:tcpdump自身のDNS問い合わせが、キャプチャ結果に紛れ込む
- 不正確になりうる:「ポート443=HTTPS」と決めつけて表示されるが、実際は別のプロトコルかもしれない
-nn を付けると、IPアドレスもポート番号もそのまま数字で表示されます。
| オプション | IPアドレス | ポート番号 |
|---|---|---|
| なし | ホスト名(dns.google) | サービス名(domain) |
-n | 数字のまま(8.8.8.8) | サービス名(domain) |
-nn | 数字のまま(8.8.8.8) | 数字のまま(53) |
「tcpdumpを打つときは -nn をセットで」と反射的に付けるのがベテランの作法です。
ネットワークインターフェイスを理解する
tcpdumpを使うとき最初につまずきやすいのが、「どのインターフェイスを指定すればいいか」という点です。ネットワークインターフェイスとは、コンピュータがネットワークにつながるための窓口のことで、一台のPCには複数の窓口があり、それぞれ名前が付けられています。
| 名前の例 | 意味 |
|---|---|
eth0, eth1 | 有線LAN(昔ながらの命名) |
ens33, enp0s3 | 有線LAN(最近のLinux命名) |
wlan0, en0 | 無線LAN(Linux / macOS) |
lo | ループバック(自分自身) |
any | 全インターフェイスをまとめて指定 |
使用可能なインターフェイスを確認するには、以下のコマンドを実行します。
sudo tcpdump -D
# または
ip addrどのインターフェイスを指定すべきか迷ったら -i any と指定すれば、すべての窓口でキャプチャできます。手軽さ重視ならこれが楽です。
「送信元」と「宛先」を意識したフィルタの使い分け
tcpdumpの真価はフィルタ式にあります。条件を指定して、必要なパケットだけを抽出できます。すべてのパケットには「誰から(送信元)」と「誰へ(宛先)」の情報が含まれており、手紙の差出人・宛先と同じイメージです。

ホスト指定フィルタには3種類あります。
| フィルタ | 意味 | 取得できる方向 |
|---|---|---|
host 192.168.1.100 | 送信元・宛先のどちらかが該当 | 両方向 |
src host 192.168.1.100 | 送信元のみ該当 | 送ったパケットのみ |
dst host 192.168.1.100 | 宛先のみ該当 | 受け取ったパケットのみ |
普段は host でOKです。送信だけ・受信だけを観察したい特殊な調査のときに src / dst を使い分けると覚えておけば十分です。
その他のよく使うフィルタの例を示します。
# プロトコルで絞る
sudo tcpdump -nn tcp
sudo tcpdump -nn udp
sudo tcpdump -nn icmp
# ポートで絞る
sudo tcpdump -nn port 80 # HTTP
sudo tcpdump -nn port 443 # HTTPS
sudo tcpdump -nn dst port 80 # 宛先がHTTPのみ
# 組み合わせ(and / or / not)
sudo tcpdump -nn 'host 192.168.1.100 and port 80'
sudo tcpdump -nn 'port 80 or port 443'
sudo tcpdump -nn 'not port 22'出力結果の読み方
tcpdumpの出力は最初は呪文のように見えますが、構造を覚えると簡単に読めます。以下の1行を例に各要素を確認しましょう。
12:46:23.948176 IP 192.168.11.5.50377 > 8.8.8.8.443: Flags [.], ack 3545855638, win 2048, length 0| 要素 | 意味 |
|---|---|
12:46:23.948176 | タイムスタンプ(マイクロ秒精度) |
IP | プロトコル種別(IPv4) |
192.168.11.5.50377 | 送信元IPアドレスとポート(50377番ポート) |
> | 「から」「へ」を表す矢印 |
8.8.8.8.443 | 宛先IPアドレスとポート(443番=HTTPS) |
Flags [.] | TCPフラグ |
ack 3545855638 | 「ここまで受け取りました」という確認番号 |
win 2048 | 受信可能なバイト数(ウィンドウサイズ) |
length 0 | データ本体のサイズ(0=データなし、純粋な制御パケット) |
TCPフラグはtcpdumpでは記号で表示されます。これを覚えると通信の状態が一目でわかります。
| 記号 | フラグ名 | 意味 |
|---|---|---|
S | SYN | 接続を始めたい |
. | ACK | 確認応答(単独の場合) |
F | FIN | 接続を終わりたい |
R | RST | 接続を強制終了 |
P | PSH | データを即座に処理してほしい |
TCP接続の最初には、必ず以下の3パケットが流れます。これが教科書で習う「3ウェイハンドシェイク」です。

| 順番 | 方向 | フラグ | 意味 |
|---|---|---|---|
| ① | クライアント → サーバー | [S] | 「接続したい!」 |
| ② | サーバー → クライアント | [S.] | 「いいよ、確認した」 |
| ③ | クライアント → サーバー | [.] | 「了解、つながった!」 |
tcpdumpが終了すると、キャプチャの統計情報が表示されます。
2 packets captured
6 packets received by filter
0 packets dropped by kernel| メッセージ | 意味 |
|---|---|
| packets captured | 実際に表示されたパケット数 |
| packets received by filter | フィルタを通過したパケット数(終了処理中も含む) |
| packets dropped by kernel | カーネルが取りこぼした数(ここが0でないと要注意) |
「packets dropped」が増えるときは、フィルタを厳しくして対象を絞るか、-w でファイルに直接書き出すと改善することが多いです。
実際に試してみよう(ハンズオン)
頭で理解したら、必ず手を動かしましょう。tcpdumpは「自分で通信を起こして、それがどう見えるか」を試すと一気に理解が深まります。ターミナルを2つ開いて進めてください。1つはtcpdump観察用、もう1つは通信を発生させる用です。
実験1:pingを観察する
# ターミナル1(観察側)
sudo tcpdump -i any -nn icmp
# ターミナル2(実行側)
ping -c 3 8.8.8.8観察側に、echo request(送信)とecho reply(応答)が交互に表示されるはずです。教科書の図が目の前で動き出します。
実験2:DNSの仕組みを目撃する
# ターミナル1
sudo tcpdump -i any -nn port 53
# ターミナル2
nslookup example.com「ドメイン名→IPアドレス」の変換が、ネットワーク越しに行われている様子が見えます。
実験3:HTTPの中身を生で見る
# ターミナル1(-A はASCII表示)
sudo tcpdump -i any -nn -A 'tcp port 80'
# ターミナル2
curl http://example.comHTTPのリクエストヘッダ・レスポンスが平文で表示されます。次に https:// で同じことを試してみてください。中身が暗号化されていて読めないことがわかり、HTTPSの意義が体感できます。
実験4:3ウェイハンドシェイクを観察
# ターミナル1
sudo tcpdump -i any -nn 'tcp port 80 and host example.com'
# ターミナル2
curl http://example.com最初の3パケットに [S] → [S.] → [.] という流れが現れます。
実験5:ファイルに保存してWiresharkで開く
sudo tcpdump -i any -nn -w mycapture.pcap -c 5050パケットをキャプチャして mycapture.pcap に保存します。これを Wireshark で開けば、GUIで色分け&プロトコル階層付きで詳細解析できます。実務でも「サーバーで取って手元で開く」がよくあるパターンです。
よくある疑問
Q1. 自分のPC以外の通信は見えるの?
原則として、tcpdumpを実行しているマシンを通過するパケットしか見えません。遠くにある他人のPC同士の通信を、自分のPCから直接覗くことはできません。例外として、ルーターやファイアウォール上で実行する場合や、スイッチのミラーポート機能を使う場合は、配下のマシンの通信を観察できます。これは主にネットワーク管理者の領域です。
Q2. トラブルシュートでは具体的にどう使うの?
定石は「通信の両端でtcpdumpを動かして突き合わせる」です。以下の順序で確認することで、問題箇所を特定できます。
- クライアントからSYNが出ているか?
- サーバーにそのSYNが届いているか?
- サーバーからSYN/ACKが返っているか?
- そのSYN/ACKがクライアントに届いているか?
これを確認することで、「途中のファイアウォールで止まっている」「サーバーアプリが応答していない」などの切り分けが可能になります。
Q3. length 0のパケットばかり出るのはなぜ?
データを運ばない制御パケット(ACKだけのパケットなど)を見ているからです。実際にデータが流れているとき(ファイルアップロードやWebページ取得など)は length 1402 のような値が連続して表示されます。
Q4. 注意すべきことは?
- 自分の管理下のネットワーク・マシンでのみ実行すること。会社のネットワークや公共Wi-Fiで他人の通信を観察するのは法的・倫理的に問題になります
- 本番サーバーで使うときは必ずフィルタを指定し、過剰負荷を避ける
- キャプチャしたpcapファイルにはパスワード等の機密情報が含まれる可能性があるので扱いに注意
まとめ
tcpdumpは慣れると非常に強力なツールですが、最初の一歩は意外とシンプルです。本記事の要点を振り返ります。
- tcpdumpは自分のマシンを通過するパケットを可視化するツール
-iでインターフェイス、-nnで名前解決オフ、-cで個数制限が基本セットhostはだいたいこれでOK、特殊な調査でsrc/dstを使い分ける- 出力は「タイムスタンプ+送信元>宛先+フラグ+データ長」の構造
- 手を動かして観察するのが最良の学習法。ping・DNS・HTTPの実験から始めよう
- 本格的な解析はpcap保存+Wiresharkの二段構えが効率的
まずは以下のコマンドを打つところから始めてみてください。流れていくパケットを見つめるうちに、「ネットワークが動いている」という実感が湧いてくるはずです。
sudo tcpdump -i any -nn -c 20参考リソース
- tcpdump 公式マニュアル(英語) — オプションやフィルタ式の網羅的なリファレンス
- Wireshark 公式サイト — pcapファイルをGUIで詳細解析できる定番ツール
- Red Hat: Linux コマンドラインでの tcpdump の使用に関する概要 — 実務寄りの解説記事
man tcpdump— ターミナルで実行するとローカルでマニュアルが読めるman pcap-filter— フィルタ式の文法リファレンス


コメント