Home
2130 words
11 minutes
【Unix】tcpdumpの解説(詳細説明版)
2025-02-27

最終更新:2025-02-27

概要#

tcpdumpコマンドは、コンピュータのネットワークインタフェースでやり取りされる「パケット」と呼ばれるデータの送受信を“生の状態”でキャプチャし、その中身を表示するためのツールである。ネットワークで流れているデータを可視化することで、通信エラーの原因探しや、どんなデータが送られているのかを確認するのに役立つ。

ここでいうパケットとは、インターネットやLANなどでやり取りされるデータの最小単位のようなもので、送信元アドレスや宛先アドレス、通信で使われるプロトコルなどの情報が含まれている。たとえば、Webページを表示するときにも、多数のパケットが自動的にやり取りされている。

コマンドの使用方法#

以下の基本的な書式で、tcpdumpを使うことができる。

tcpdump [オプション] [フィルタ式]
  • 「オプション」はコマンドの使い勝手を変える設定(例: 「-i eth0」でインタフェース指定)。
  • 「フィルタ式」は、「特定のサーバとの通信だけを見たい」、「特定の通信ポートだけを見たい」といった条件を指定できる機能である。

tcpdump実行前に知っておくとよいこと#

  • 通信データの中身がそのまま表示される場合があるため、パスワードなどの秘匿情報が含まれているとセキュリティリスクになる。管理者権限が必要なシステム環境もある。
  • 大量のパケットをキャプチャすると、画面に情報が流れすぎてわかりにくい。そのためフィルタ式やオプションを駆使して必要な情報だけ表示するのが一般的である。

オプション一覧と詳細#

  • -i <インタフェース>
    通常ネットワークカード名を指定して利用する(例: eth0, ens33, wlan0など)。「-i eth0」のようにすると、そのインタフェースで送受信されるパケットだけをキャプチャする。
  • -n
    IPアドレスやポート番号の「名前解決」を行わず、数値のまま表示する。名前解決とは、例えば「93.184.216.34」を「example.com」に置き換える処理のこと。
  • -v / -vv / -vvv
    詳細表示モード。指定する回数(vの数)が増えるほど、パケットに含まれる情報が詳しくなる。
  • -x, -XX
    パケットのペイロード(データ部分)を16進数で表示する。-xは16進数のみ、-XXは16進数とASCII文字列を併記して、どんな文字列データが入っているかをある程度読みやすくする。
  • -w <ファイル>
    キャプチャしたデータをファイル(pcap形式)に保存する。あとからオフラインで解析したい場合に使う。
  • -r <ファイル>
    -wで保存したファイルを読み込んで、tcpdump形式で表示する。
  • -c <数>
    指定した数のパケットをキャプチャすると、自動的にtcpdumpコマンドが終了する。
  • -S
    TCP(通信で使われる有名なプロトコル)の“シーケンス番号”を、そのままの絶対値で表示する。通常は相対値で表示されることが多い。
  • -A
    パケットのデータ部分(ペイロード)をASCII文字として表示する。HTTPリクエストやテキスト主体の通信を覗く際に便利。
  • -q
    簡易表示モード。必要最低限の情報だけを表示して、画面をスッキリさせたい場合に有効。

ハンズオン(オプションごとの例と、キャプチャ結果の見方)#

以下、tcpdumpを実行したときにどのような出力が得られるか、具体例を挙げて説明する。

1. インタフェースを指定してキャプチャ (-i)#

tcpdump -i eth0
  • eth0のインタフェース上を流れるパケットだけをキャプチャする。
  • 実行すると、パケットがリアルタイムで画面に流れていく。以下のように表示される場合が多い:

出力例(抜粋):

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:00:00.123456 IP 192.168.0.10.55000 > 93.184.216.34.80: Flags [S], seq 123456789, ...
  • 日時: 14:00:00.123456 は、パケットを受信した時刻(時:分:秒.マイクロ秒)
  • IP 192.168.0.10.55000 > 93.184.216.34.80 は、送信元IPアドレスとポート番号(192.168.0.10:55000) から宛先IPアドレスとポート番号(93.184.216.34:80) へ向けて送られたパケットであることを示す。
  • Flags [S] はTCPのフラグ。S (SYN) はコネクション開始を表す。
  • seq 123456789 はTCPのシーケンス番号(通信を正しく並べるための番号)を示す。

2. 数値で表示する (-n)#

tcpdump -n
  • IPアドレスやポート番号を名前解決せずに、そのまま数字で出力する。
  • 通常、ポート80なら「http」と表示される場合もあるが、このオプションを使うと「:80」のまま表示される。
  • DNSへの問い合わせが減るため、より軽い処理になる利点がある。

出力例:

14:01:00.123456 IP 192.168.0.10.55000 > 93.184.216.34.80: Flags [S], seq 123456789, ...

3. 詳細表示モード (-v, -vv, -vvv)#

tcpdump -vv
  • -vを複数指定することで、パケットヘッダの中身をさらに詳しく出力する。
  • ttl(データがネットワークを通過できる回数)やid(IPパケットを識別するID)、offsetなどの細かい値が表示される。

出力例(抜粋):

14:02:00.000111 IP (tos 0x0, ttl 64, id 12345, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.0.10.55000 > 93.184.216.34.80: Flags [S], seq 123456789, win 65535, options [...]

4. ペイロードを16進数で見る (-x, -XX)#

tcpdump -XX -c 1
  • -c 1 は1つのパケットを受信したらキャプチャを終了する指定。
  • -XX オプションにより、パケットの中身を16進数とASCII文字列の両方で表記してくれる。

出力例(抜粋):

14:03:00.222333 IP 192.168.0.10.55000 > 93.184.216.34.80: Flags [S], seq 123456789, ...
    0x0000:  4500 003c 9f23 4000 4006 a8c7 c0a8 000a  E..<.#@.@.......
    0x0010:  5db8 d822 d6b8 0050 075b cd15 0000 0000  ].."...P.[......
  • 0x0000, 0x0010 はパケット先頭からのバイトオフセット。
  • 4500 003c 9f23 4000 ... が実際のバイナリデータ(ヘッダとペイロード)を16進数で示している。
  • 右側(ASCII部分)で見える文字は、テキストとして解釈できる部分を表示しており、判読できないバイナリは.などに置き換えられる。

5. キャプチャをファイルに保存・読み込み (-w, -r)#

tcpdump -i eth0 -w capture.pcap
tcpdump -r capture.pcap
  • -w capture.pcap で、標準出力には表示せず、パケットをそのままファイルに保存する。
  • -r capture.pcap で後からそのファイルを読み込み、同じように解析表示ができる。
  • 大量のデータを一気に保存して、後でじっくり調べるときに役立つ。

6. 指定パケット数で終了 (-c)#

tcpdump -c 5
  • -c 5 とすることで、5個パケットを受信した時点で自動的にtcpdumpが終了する。
  • 「5個で終わり」のようにキャプチャ数を制限したいときに使われる。

出力例:

5 packets captured
5 packets received by filter
0 packets dropped by kernel
  • このように、どのくらいパケットをキャプチャしたか、フィルタで省かれたか、カーネルでドロップされたかが表示される。

7. TCPのシーケンス番号を絶対値で表示 (-S)#

tcpdump -S
  • シーケンス番号が「相対値」ではなく「実際の値」で表示される。
  • 通常はやりとりの最初のパケットを基準にして0から始まるように見せる(相対表示)場合が多い。
  • 絶対シーケンス番号が必要な解析時に利用する。

8. ASCIIテキスト表示 (-A)#

tcpdump -A -c 1
  • パケットのペイロード部分(実際のデータ)をASCII文字として表示する。
  • HTTPリクエストなど、人間が読むテキストが多く含まれる通信を細かく見たい場合に便利。

出力例(HTTPリクエストの一例):

14:06:00.111111 IP 192.168.0.10.55000 > 93.184.216.34.80: Flags [P.], ack 1, ...
E..q..@.@..76
GET / HTTP/1.1
Host: example.com

9. 簡易表示モード (-q)#

tcpdump -q
  • 詳細情報を省き、送受信やパケットサイズといった最小限の情報だけを表示する。
  • 簡単な概要を把握したい場合に向いている。

出力例:

14:07:00.222222 IP 192.168.0.10.55000 > 93.184.216.34.80: tcp 60
14:07:00.222333 IP 93.184.216.34.80 > 192.168.0.10.55000: tcp 40
  • tcp 60 は、TCPプロトコルのパケットであり、計60バイトのデータが含まれることを示す。

まとめ#

tcpdumpはネットワークのパケットをその場で「見える化」する非常に強力なツールである。
しかし以下の点に注意しよう:

  • 大量のデータが流れる環境で何もフィルタせず実行すると、表示が多すぎてかえって分かりにくい。
  • 機密情報を含んだパケットを意図せず表示する可能性があるので、取り扱いには十分注意が必要。
  • ネットワーク管理者やシステム管理者向けのオプションが多いが、Web開発者やプログラマー・セキュリティエンジニアにも役立つ。

「ネットワークの通信内容を詳しく知りたい」「特定のパケットだけ見たい」といった場面では、tcpdumpのオプションを組み合わせて活用すると効率的に対象を絞り込むことができる。

【Unix】tcpdumpの解説(詳細説明版)
https://ss0832.github.io/posts/20250227_tcpdump_guide_detailed/
Author
ss0832
Published at
2025-02-27