【tcpdump入門】ネットワークの中身を覗いてみよう!初心者向け完全ガイド

ネットワーク

「サーバーへの通信がうまくいかない」「ネットワークの中で何が起きているのか見たい」——そんなときに使うのが 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では記号で表示されます。これを覚えると通信の状態が一目でわかります。

記号フラグ名意味
SSYN接続を始めたい
.ACK確認応答(単独の場合)
FFIN接続を終わりたい
RRST接続を強制終了
PPSHデータを即座に処理してほしい

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.com

HTTPのリクエストヘッダ・レスポンスが平文で表示されます。次に 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 50

50パケットをキャプチャして mycapture.pcap に保存します。これを Wireshark で開けば、GUIで色分け&プロトコル階層付きで詳細解析できます。実務でも「サーバーで取って手元で開く」がよくあるパターンです。


よくある疑問

Q1. 自分のPC以外の通信は見えるの?

原則として、tcpdumpを実行しているマシンを通過するパケットしか見えません。遠くにある他人のPC同士の通信を、自分のPCから直接覗くことはできません。例外として、ルーターやファイアウォール上で実行する場合や、スイッチのミラーポート機能を使う場合は、配下のマシンの通信を観察できます。これは主にネットワーク管理者の領域です。

Q2. トラブルシュートでは具体的にどう使うの?

定石は「通信の両端でtcpdumpを動かして突き合わせる」です。以下の順序で確認することで、問題箇所を特定できます。

  1. クライアントからSYNが出ているか?
  2. サーバーにそのSYNが届いているか?
  3. サーバーからSYN/ACKが返っているか?
  4. その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


参考リソース

コメント

タイトルとURLをコピーしました