Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

TCPDumpをマスターしよう:パケット分析に役立つ15の実用コマンド例

TCPDumpをマスターしよう:パケット分析に役立つ15の実用コマンド例

tcpdumpコマンドは「パケットアナライザ(パケット解析ツール)」とも呼ばれます。

tcpdumpは、ほとんどのUNIX系OSで動作する定番のネットワーク診断ツールです。キャプチャしたパケットをファイルに保存できるため、後から詳細な分析を行うことが可能です。保存したファイルは同じtcpdumpコマンドで閲覧できるほか、Wiresharkなどのオープンソースソフトウェアでも読み込めます。

このチュートリアルでは、tcpdumpコマンドの実践的な使用例を15個紹介します。ネットワークトラブルシューティングやトラフィック調査の際に、ぜひ参考にしてください。

1. 特定のイーサネットインターフェースからパケットをキャプチャする(tcpdump -i)

オプションを付けずにtcpdumpコマンドを実行すると、すべてのインターフェースを流れるパケットがキャプチャされます。-iオプションを指定すると、特定のイーサネットインターフェースに絞り込んで監視できます。

$ tcpdump -i eth1
14:59:26.608728 IP xx.domain.netbcp.net.52497 > valh4.lell.net.ssh: . ack 540 win 16554
14:59:26.610602 IP resolver.lell.net.domain > valh4.lell.net.24151: 4278 1/0/0 (73)
14:59:26.611262 IP valh4.lell.net.38527 > resolver.lell.net.domain: 26364+ PTR? 244.207.104.10.in-addr.arpa. (45)

この例では、eth1インターフェースを流れるすべてのパケットをキャプチャし、標準出力に表示しています。

補足: Editcapユーティリティを使うと、ダンプファイルから特定のパケットを選択・削除し、指定した形式に変換することができます。

2. 指定した数のパケットだけキャプチャする(tcpdump -c)

tcpdumpコマンドは、手動で停止するまでパケットをキャプチャし続けます。-cオプションを使えば、キャプチャするパケットの上限数を指定できます。

$ tcpdump -c 2 -i eth0
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:38:38.184913 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 1457255642:1457255758(116) ack 1561463966 win 63652
14:38:38.690919 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 116:232(116) ack 1 win 63652
2 packets captured
13 packets received by filter
0 packets dropped by kernel

上記のコマンドでは、eth0インターフェースから2パケットのみをキャプチャしています。

補足: MergecapとTSharkについて — Mergecapは複数のパケットダンプを1つのダンプファイルに結合するツールです。TSharkは強力なパケットキャプチャツールで、ネットワークトラフィックの分析に利用でき、Wiresharkディストリビューションに同梱されています。

3. キャプチャしたパケットをASCII形式で表示する(tcpdump -A)

次のコマンド構文では、パケットの内容をASCII形式で出力します。

$ tcpdump -A -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
14:34:50.913995 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 1457239478:1457239594(116) ack 1561461262 win 63652
E.....@.@..]..i...9...*.V...]...P....h....E...>{..U=...g.
......G..7\+KA....A...L.
14:34:51.423640 IP valh4.lell.net.ssh > yy.domain.innetbcp.net.11006: P 116:232(116) ack 1 win 63652
E.....@.@..\..i...9...*.V..*]...P....h....7......X..!....Im.S.g.u:*..O&....^#Ba...
E..(R.@.|.....9...i.*...]...V..*P..OWp........

補足: ifconfigコマンドは、ネットワークインターフェースの設定や確認に使用されます。

4. キャプチャしたパケットをHEXとASCIIの両方で表示する(tcpdump -XX)

16進数(HEX)でパケットを分析したい場合もあるでしょう。tcpdumpでは、-XXオプションによりASCIIとHEXの両方の形式でパケットを出力できます。

$tcpdump -XX -i eth0
18:52:54.859697 IP zz.domain.innetbcp.net.63897 > valh4.lell.net.ssh: . ack 232 win 16511
 0x0000: 0050 569c 35a3 0019 bb1c 0c00 0800 4500 .PV.5.........E.
 0x0010: 0028 042a 4000 7906 c89c 10b5 aaf6 0f9a .(.*@.y.........
 0x0020: 69c4 f999 0016 57db 6e08 c712 ea2e 5010 i.....W.n.....P.
 0x0030: 407f c976 0000 0000 0000 0000 @..v........
18:52:54.877713 IP 10.0.0.0 > all-systems.mcast.net: igmp query v3 [max resp time 1s]
 0x0000: 0050 569c 35a3 0000 0000 0000 0800 4600 .PV.5.........F.
 0x0010: 0024 0000 0000 0102 3ad3 0a00 0000 e000 .$......:.......
 0x0020: 0001 9404 0000 1101 ebfe 0000 0000 0300 ................
 0x0030: 0000 0000 0000 0000 0000 0000 ............

5. パケットをキャプチャしてファイルに保存する(tcpdump -w)

tcpdumpでは、キャプチャしたパケットをファイルに保存できます。保存したファイルは、後から詳細な分析に活用できます。

$ tcpdump -w 08232010.pcap -i eth0
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
32 packets captured
32 packets received by filter
0 packets dropped by kernel

-wオプションを指定すると、パケットが指定したファイルに書き込まれます。拡張子は.pcapとする必要があり、この形式のファイルは各種ネットワークプロトコルアナライザで読み込むことができます。

6. 保存したファイルからパケットを読み込む(tcpdump -r)

キャプチャ済みのpcapファイルを読み込み、以下のようにパケットを表示して分析することができます。

$tcpdump -tttt -r data.pcap
2010-08-22 21:35:26.571793 00:50:56:9c:69:38 (oui Unknown) > Broadcast, ethertype Unknown (0xcafe), length 74:
 0x0000: 0200 000a ffff 0000 ffff 0c00 3c00 0000 ............<...
 0x0010: 0000 0000 0100 0080 3e9e 2900 0000 0000 ........>.).....
 0x0020: 0000 0000 ffff ffff ad00 996b 0600 0050 ...........k...P
 0x0030: 569c 6938 0000 0000 8e07 0000 V.i8........
2010-08-22 21:35:26.571797 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.50570: P 800464396:800464448(52) ack 203316566 win 71
2010-08-22 21:35:26.571800 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.50570: P 52:168(116) ack 1 win 71
2010-08-22 21:35:26.584865 IP valh5.lell.net.ssh > 11.154.12.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADC

7. IPアドレスを表示してパケットをキャプチャする(tcpdump -n)

これまでの例では、パケットがDNS名(ホスト名)で表示されており、IPアドレスではありませんでした。次の例では-nオプションを使い、通信に関わるマシンのIPアドレスを直接表示します。

$ tcpdump -n -i eth0
15:01:35.170763 IP 10.0.19.121.52497 > 11.154.12.121.ssh: P 105:157(52) ack 18060 win 16549
15:01:35.170776 IP 11.154.12.121.ssh > 10.0.19.121.52497: P 23988:24136(148) ack 157 win 113
15:01:35.170894 IP 11.154.12.121.ssh > 10.0.19.121.52497: P 24136:24380(244) ack 157 win 113

8. 読みやすいタイムスタンプ付きでパケットをキャプチャする(tcpdump -tttt)

-ttttオプションを組み合わせると、日付を含んだ人間が読みやすい形式のタイムスタンプでパケットを表示できます。

$ tcpdump -n -tttt -i eth0
2010-08-22 15:10:39.162830 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 49800 win 16390
2010-08-22 15:10:39.162833 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 50288 win 16660
2010-08-22 15:10:39.162867 IP 10.0.19.121.52497 > 11.154.12.121.ssh: . ack 50584 win 16586

9. Nバイトより大きいパケットのみを読み込む

「greater」フィルタを使うことで、指定したバイト数より大きいパケットのみを受信できます。

$ tcpdump -w g_1024.pcap greater 1024

10. 特定のプロトコルタイプのパケットのみを受信する

プロトコルタイプを指定してパケットを受信することも可能です。指定できるプロトコルは、fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp、udpなどです。次の例では、eth0インターフェースを流れるARPパケットのみをキャプチャします。

$ tcpdump -i eth0 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
19:41:52.809642 arp who-has valh5.lell.net tell valh9.lell.net
19:41:52.863689 arp who-has 11.154.12.1 tell valh6.lell.net
19:41:53.024769 arp who-has 11.154.12.1 tell valh7.lell.net

11. Nバイトより小さいパケットのみを読み込む

「less」フィルタを使うことで、指定したバイト数より小さいパケットのみを受信できます。

$ tcpdump -w l_1024.pcap less 1024

12. 特定のポートのパケットフローを受信する(tcpdump port)

特定のポートでやり取りされるすべてのパケットを確認したい場合は、次のようにtcpdumpコマンドを使用します。

$ tcpdump -i eth0 port 22
19:44:44.934459 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 18932:19096(164) ack 105 win 71
19:44:44.934533 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 19096:19260(164) ack 105 win 71
19:44:44.934612 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 19260:19424(164) ack 105 win 71

13. 特定の宛先IPアドレスとポートのパケットをキャプチャする

パケットには、送信元および宛先のIPアドレスとポート番号が含まれています。tcpdumpでは、送信元または宛先のIPアドレスやポート番号を条件にフィルタリングできます。次のコマンドは、eth0を流れるパケットのうち、特定の宛先IPアドレスかつポート22番のものをキャプチャします。

$ tcpdump -w xpackets.pcap -i eth0 dst 10.181.140.216 and port 22

14. 2台のホスト間のTCP通信パケットをキャプチャする

異なるマシン上の2つのプロセスがTCPプロトコルで通信している場合、そのパケットを次のようにtcpdumpでキャプチャできます。

$tcpdump -w comm.pcap -i eth0 dst 16.181.170.246 and port 22

保存されたcomm.pcapファイルは、任意のネットワークプロトコルアナライザツールで開くことができ、潜在的な問題のデバッグに役立てられます。

15. tcpdumpフィルタの応用 — ARPとRARP以外のすべてのパケットをキャプチャする

tcpdumpコマンドでは、「and」「or」「not」の条件を組み合わせて、柔軟にパケットをフィルタリングできます。

$ tcpdump -i eth0 not arp and not rarp
20:33:15.479278 IP resolver.lell.net.domain > valh4.lell.net.64639: 26929 1/0/0 (73)
20:33:15.479890 IP valh4.lell.net.16053 > resolver.lell.net.domain: 56556+ PTR? 255.107.154.15.in-addr.arpa. (45)
20:33:15.480197 IP valh4.lell.net.ssh > zz.domain.innetbcp.net.63897: P 540:1504(964) ack 1 win 96
20:33:15.487118 IP zz.domain.innetbcp.net.63897 > valh4.lell.net.ssh: . ack 540 win 16486
20:33:15.668599 IP 10.0.0.0 > all-systems.mcast.net: igmp query v3 [max resp time 1s]

まとめ

tcpdumpは、これらのオプションやフィルタを自由に組み合わせられる点が大きな魅力です。たとえば「-w」で保存しつつ「port」や「dst」で絞り込み、取得したpcapファイルをWiresharkで可視化するといった運用が一般的です。日常的なネットワーク監視から障害時の切り分けまで、まずは本記事の15のコマンド例を実際に試してみてください。

  1. 初心者向けシェルスクリプト入門 – LinuxでBashスクリプトを作成・実行する方法を徹底解説

    シェルスクリプトは、Linuxにおける処理の自動化に欠かせない重要な技術です。スクリプトを使えば、一連のコマンドをファイルに記述し、まとめて実行できるようになります。同じコマンドを何度も入力する手間が省けるため、作業時間を大幅に節約できます。日々のタスクを効率的にこなすだけでなく、自動実行のスケジュールを組むことも可能です。さらに、新しいセッション起動時に特定のメッセージを表示したり、環境変数を設定したりするなど、システム起動時に実行されるスクリプトを設定することもできます。シェルスクリプトの活用範囲は非常に広いため、さっそく学んでいきましょう。この記事では、以下の内容を解説します。Bashシ

  2. Linuxファイルシステムを完全マスター:/bin、/sbin、/usr/binなど主要ディレクトリの役割を徹底解説

    「なぜあるコマンドは /bin にあり、別のコマンドは /sbin や /usr/bin、/usr/sbin に配置されているのだろう?」と疑問に思ったことはありませんか。 たとえば less コマンドは /usr/bin ディレクトリ配下にあります。なぜ /bin や /sbin、/usr/sbin ではないのでしょうか。これらのディレクトリには一体どんな違いがあるのでしょうか。 本記事では、Linuxファイルシステムの構造を俯瞰しながら、各トップレベルディレクトリの役割と意味をわかりやすく解説します。Linuxのコマンドやシステム管理を学ぶうえで、この知識は確実に役立つはずです。 1. /