ホーム テクノロジー ネットワーキング tcpdump を使用してネットワーク トラフィックをキャプチャして分析するにはどうすればよいですか?

tcpdump を使用してネットワーク トラフィックをキャプチャして分析するにはどうすればよいですか?


tcpdump は、ネットワーク スニッフィングのための素晴らしいコマンドライン ツールです。これは、TCP/IP パケットをキャプチャして分析するための業界標準です。

tcpdump ツールは、ネットワークの問題を解決するときに非常に役立ちます。パケットはファイルに保存して、後で分析できます。このツールを時々実行してネットワークを監視することをお勧めします。

tcpdump の出力はどのようになりますか?

tcpdump を使用すると、TCP/IP パケットのヘッダーを調べることができます。パケットごとに 1 行が出力され、Ctrl+C を押して終了するまでコマンドは実行され続けます。

出力例の 1 行を調べてみましょう。

 20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0

各行には以下が含まれます

  • Unix タイムスタンプ ( 20:58:26.765637 )
  • プロトコル(IP)
  • 送信元のホスト名または IP、およびポート番号 ( 10.0.0.50.80 )
  • 宛先のホスト名または IP、およびポート番号 ( 10.0.0.1.53181 )
  • TCP フラグ ( Flags [F.] )。フラグは接続の状態を示します。これには、この例の FIN-ACK の [F.] のように、複数の値を含めることができます。このフィールドには次の値を指定できます。
    • S – SYN.接続を確立するための最初のステップ。
    • F – フィン。接続の終了。
    • 。 – 応答します。確認パケットは正常に受信されました。
    • P – プッシュ。パケットをバッファリングする代わりに処理するように受信者に指示します。
    • R – RST。通信が停止しました。
  • パケット内のデータのシーケンス番号。 ( seq 1 )
  • 確認応答番号 ( ack 2 )
  • ウィンドウ サイズ ( win 453 )。受信バッファーで使用可能なバイト数。この後に TCP オプションが続きます。
  • データペイロードの長さ。 ( length 0 )

インストール

Debian ベースのディストリビューションでは、APT コマンドを使用して tcpdump をインストールできます。

 # apt install tcpdump -y

RPM ベースのディストリビューションでは、 tcpdump は YUM を使用してインストールできます。

 # yum install tcpdump -y

または RHEL 8 の場合は DNF を使用する

# dnf install tcpdump -y

tcpdump コマンドのオプション

tcpdump を実行するには root である必要があります。多くのオプションとフィルターが含まれています。オプションを指定せずに tcpdump を実行すると、デフォルトのインターフェイスを流れるすべてのパケットがキャプチャされます。

システムで使用可能なネットワーク インターフェイスと、tcpdump がパケットをキャプチャできるネットワーク インターフェイスのリストを表示します。

 # tcpdump -D

または

# Tcpdump --list-interfaces
 1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.eth1
5.any (Pseudo-device that captures on all interfaces)
6.lo [Loopback]

これは、インターフェイスをリストするコマンドがないシステムで特に便利です。

特定のインターフェイスを通過するパケットをキャプチャするには、インターフェイス名を指定して-iフラグを使用します。 -iインターフェースを指定しないと、tcpdump は最初に遭遇したネットワークインターフェースを選択します。

 # tcpdump -i eth1
 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64
01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64
01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64

-vフラグを使用すると、パケットについて表示される情報が増加し、 -vv使用するとさらに詳細な情報が得られます。

デフォルトでは、tcpdump は IP アドレスをホスト名に解決し、ポート番号の代わりにサービス名も使用します。 DNS が壊れている場合、または tcpdump で名前検索を実行したくない場合は、 -nオプションを使用します。

 # tcpdump -n
 listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100

一連の行 (たとえば 5 行) だけをキャプチャするには、 -cフラグを使用します。

 #tcpdump -c 5
 04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
5 packets captured

デフォルトの tcpdump 出力では Unix タイムスタンプが使用されます。人間が判読できるタイムスタンプを持つパケットをキャプチャするには:

 # tcpdump -tttt
 2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36
2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36
2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36

tcpdump フィルター式

フィルター式は、どのパケット ヘッダーを表示するかを選択します。フィルタが適用されていない場合は、すべてのパケット ヘッダーが表示されます。一般的に使用されるフィルタは、port、host、src、dst、tcp、udp、icmp です。

ポートフィルター

ポート フィルターを使用して、特定のポートに到着するパケットを表示します。

 # Tcpdump -i eth1 -c 5 port 80
 23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0

ホストフィルター

IP アドレス 10.0.2.15 のホストに送受信されるすべてのパケットをキャプチャするには、次のようにします。

 # tcpdump host 10.0.2.15
 03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36
03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36

eth1 インターフェイスで特定のプロトコル タイプ(icmp など)のパケットをキャプチャするには、次の手順を実行します。

 # tcpdump -i eth1 icmp
 04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64
04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64
04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64
04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64
04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64

フィルター式を組み合わせる

これらのフィルター式を AND、OR、NOT 演算子と組み合わせることができます。これにより、パケットをより正確に分離できるコマンドを作成できるようになります。

特定の IP から特定のポート宛てのパケット:

 # tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
 00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1
00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0

ICMP を除くすべてのパケットをキャプチャするには、NOT 演算子を使用します。

 # tcpdump -i eth1 not icmp

パケットヘッダーをファイルに保存する

tcpdump の出力は画面を非常に速くスクロールできるため、-w フラグを使用してパケット ヘッダーをファイルに保存できます。出力を保存するファイルは pcap 形式を使用し、拡張子は.pcapです。

PCAP はパケット キャプチャの略です。次のコマンドは、eth1 インターフェイス上の 10 行の出力を icmp.pcap に保存します。

 # tcpdump -i eth1 -c 10 -w icmp.pcap
 tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

-rフラグを使用してこのファイルを読み取ることができます。

 tcpdump -r icmp.pcap
 reading from file icmp.pcap, link-type EN10MB (Ethernet)
05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64
05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64
05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64
05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64
05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64

パケットの詳細の表示

ここまではパケット ヘッダーのみを見てきましたが、パケットの内容を表示するには-Aオプションを使用します。これにより、パケットの内容が ASCII で出力され、ネットワークのトラブルシューティングに役立ちます。また、 -Xフラグを使用して出力を 16 進形式で表示することもできます。接続が暗号化されている場合、これはあまり役に立たない可能性があります。

 # tcpdump -c10 -i eth1 -n -A port 80
 23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
E..'..@.@.%.
...
..2...P..M.
uE............
.6.}.Q.bGET / HTTP/1.1
Host: 10.0.0.50
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT

結論

tcpdump はセットアップが簡単で、出力、さまざまなフラグ、フィルターを理解すれば、ネットワークの問題を解決し、ネットワークを保護するために使用できます。

「 tcpdump を使用してネットワーク トラフィックをキャプチャして分析するにはどうすればよいですか?」についてわかりやすく解説!絶対に観るべきベスト2動画

Wiresharkインストール・画面の見方・法律・使い方などを解説!【Windows10・MacOS可】
TCPDump を使用してネットワーク トラフィックをキャプチャする