1. 概要

この記事では、Linuxのツールtcpdumpについて説明します。 特に、Linux環境でtcpdumpを使用してネットワークパケットをキャプチャする方法を学習します。

2. tcpdump

2.1. tcpdumpの概要

tcpdump は、Linuxのネットワークパケットスニファツールです。 本質的に、それはインターフェースをリッスンし、インターフェースを通過するすべてのパケットをダンプします。 ダンプを通じて、ノードを通過するパケットについてより多くの洞察を得ることができます。

2.2. インストール

UbuntuなどのDebianベースのLinuxにtcpdumpをインストールするには、apt-getコマンドを使用できます。

$ sudo apt-get update
$ sudo apt-get install -y tcpdump

または、CentOSなどのRHELベースのLinuxでyumを使用してインストールを実行することもできます。

$ sudo yum update
$ sudo yum install -y tcpdump

2.3. 一般的な構文

一般に、 tcpdump の構文は、コマンドの後にオプションのリストと式を続けることで表すことができます。

tcpdump [OPTIONS] [expression]

OPTIONS 引数は、tcpdumpのさまざまな側面を変更するために指定できるフラグのオプションのリストです。 さらに、 expression は、ユーザーがさまざまなプロパティでパケットをさらにフィルタリングできるようにする強力な構成です。

2.4. 基本的な使用法

tcpdump をデフォルト構成で、フラグや式を使用せずに実行してみましょう。

$ tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:33:18.583077 IP 927e94ccde39.54226 > 192.168.65.4.53: 39122+ AAAA? www.baeldung.com. (34)
10:33:18.583082 IP 927e94ccde39.36545 > 192.168.65.4.53: 53932+ A? www.baeldung.com. (34)
10:33:18.583450 IP 927e94ccde39.38845 > 192.168.65.4.53: 61341+ PTR? 4.65.168.192.in-addr.arpa. (43)
10:33:18.623951 IP 192.168.65.4.53 > 927e94ccde39.36545: 53932 3/0/0 A 104.26.12.74, A 172.67.72.45, A 104.26.13.74 (82)
10:33:18.624004 IP 192.168.65.4.53 > 927e94ccde39.54226: 39122 3/0/0 AAAA 2606:4700:20::ac43:482d, AAAA 2606:4700:20::681a:c4a, AAAA 2606:4700:20::681a:d4a (118)
10:33:18.624381 IP 927e94ccde39.35182 > 104.26.12.74.80: Flags [S], seq 3026253548, win 64240, options [mss 1460,sackOK,TS val 3916952268 ecr 0,nop,wscale 7], length 0
10:33:18.668779 IP 104.26.12.74.80 > 927e94ccde39.35182: Flags [S.], seq 452853775, ack 3026253549, win 65535, options [mss 1460,wscale 2,eol], length 0
10:33:18.668809 IP 927e94ccde39.35182 > 104.26.12.74.80: Flags [.], ack 1, win 502, length 0
10:33:18.668873 IP 927e94ccde39.35182 > 104.26.12.74.80: Flags [P.], seq 1:81, ack 1, win 502, length 80: HTTP: GET / HTTP/1.1
10:33:18.671819 IP 104.26.12.74.80 > 927e94ccde39.35182: Flags [.], ack 81, win 65535, length 0
10:33:18.691618 IP 104.26.12.74.80 > 927e94ccde39.35182: Flags [P.], seq 1:610, ack 81, win 65535, length 609: HTTP: HTTP/1.1 301 Moved Permanently
10:33:18.691628 IP 927e94ccde39.35182 > 104.26.12.74.80: Flags [.], ack 610, win 501, length 0

インターフェースを指定しない場合、tcpdumpはシステム上のインターフェースのリストの中で最も小さい番号のインターフェースをリッスンします。 この場合、リッスンするインターフェイスとしてeth0が選択されています。 次に、インターフェイスを通過するすべてのパケットをキャプチャしてコンソールに出力します。

出力から、各行のネットワークパケットの詳細を確認できます。 パケットダンプの例を詳しく見てみましょう。

10:33:18.583077 IP 927e94ccde39.54226 > 192.168.65.4.53: 39122+ AAAA? www.baeldung.com. (34)

出力から、このパケットがキャプチャされた時間を特定できます。 さらに、タイムスタンプの横にプロトコルが表示されるため、このパケットはIPパケットであることがわかります。

さらに、ダンプから、このパケットはポート54226のホスト927e94ccde39から発信され、ポート53[の192.168.65.4に向かっていることがわかります。 X182X]。

3. ネットワークインターフェイスのオプション

3.1. システムインターフェイスの一覧表示

-D フラグを使用して、システムで使用可能なインターフェースのリストを照会できます。

$ tcpdump -D
1.eth0 [Up, Running]
2.eth1 [Up, Running]
3.lo [Up, Running, Loopback]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]
5.bluetooth-monitor (Bluetooth Linux Monitor) [none]
6.nflog (Linux netfilter log (NFLOG) interface) [none]
7.nfqueue (Linux netfilter queue (NFQUEUE) interface) [none]
8.tunl0 [none]
9.ip6tnl0 [none]

ご覧のとおり、tcpdumpには各インターフェイスのステータスも表示されます。 実際のネットワークインターフェイスに加えて、 tcpdump は、「any」と呼ばれる疑似デバイスを作成します。 この疑似デバイスanyをリッスンすることにより、tcpdumpはすべてのインターフェイスを通過するパケットをキャプチャします。

3.2. インターフェイスの指定

複数のインターフェースを備えたシステムでは、-iフラグを使用してリッスンするインターフェースを選択できます。

$ tcpdump -i wlan0

上記のコマンドは、インターフェイスwlan0tcpdumpを開始します。 さらに、疑似デバイス any を使用して、すべてのインターフェイスのパケットをキャプチャできます。

$ tcpdump -i any

4. タイムスタンプのフォーマット

tcpdump は、各パケットダンプ出力で、最初の列にタイムスタンプを追加して、パケットがキャプチャされた時刻を示します。 tcpdump は、-tフラグを使用したこのタイムスタンプ出力のフォーマットをサポートします。

4.1. タイムスタンプ情報の抑制

tcpdumpがタイムスタンプ情報を出力しないようにするために、-tフラグを指定できます

$ tcpdump -t
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP centos-box.intra.40600 > 927e94ccde39.443: Flags [P.], seq 1584919446:1584919451, ack 1644285291, win 502, options [nop,nop,TS val 1654074382 ecr 2691638716], length 5
IP 927e94ccde39.443 > centos-box.intra.40600: Flags [.], ack 5, win 510, options [nop,nop,TS val 2693653313 ecr 1654074382], length 0

4.2. エポックタイムでのタイムスタンプの印刷

-tt フラグを使用して、エポック(1970年1月1日00:00:00 UTC)後のタイムスタンプを秒単位で出力することもできます。

$ tcpdump -tt
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
1615623341.099481 IP centos-box.intra.40600 > 927e94ccde39.443: Flags [P.], seq 1584919451:1584919456, ack 1644285291, win 502, options [nop,nop,TS val 1654246252 ecr 2693653313], length 5
1615623341.099494 IP 927e94ccde39.443 > centos-box.intra.40600: Flags [.], ack 5, win 510, options [nop,nop,TS val 2693825183 ecr 1654246252], length 0

出力から、タイムスタンプの解像度がマイクロ秒レベルまで下がっていることを確認できます。

4.3. タイムデルタでのタイムスタンプの印刷

-ttt フラグを使用して、デルタの観点からタイムスタンプを出力できます。 具体的には、 tcpdump は、現在のダンプと前のダンプの時間差を各行に出力します。

$ tcpdump -ttt
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
 00:00:00.000000 IP centos-box.intra.40600 > 927e94ccde39.443: Flags [P.], seq 1584919456:1584919461, ack 1644285291, win 502, options [nop,nop,TS val 1654379130 ecr 2693825183], length 5
 00:00:00.000014 IP 927e94ccde39.443 > centos-box.intra.40600: Flags [.], ack 5, win 510, options [nop,nop,TS val 2693958061 ecr 1654379130], length 0

上記の例では、最初のパケットと2番目のパケットの時間差は14マイクロ秒であると簡単に推測できます。

4.4. 日付付きのタイムスタンプの印刷

最後に、 -tttt フラグを使用して、タイムスタンプと日付を出力できます。

$ tcpdump -tttt
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
2021-03-13 08:20:05.370345 IP centos-box.intra.40600 > 927e94ccde39.443: Flags [P.], seq 1584919461:1584919466, ack 1644285291, win 502, options [nop,nop,TS val 1654510522 ecr 2693958061], length 5
2021-03-13 08:20:05.370400 IP 927e94ccde39.443 > centos-box.intra.40600: Flags [.], ack 5, win 510, options [nop,nop,TS val 2694089454 ecr 1654510522], length 0

5. パケットダンプをファイルに保存する

tcpdump は、パケットダンプをファイルに書き込むことを可能にするいくつかのフラグも提供します。

5.1. ファイルへの書き込み

パケットダンプをファイルに書き込むには、フラグ-wの後にファイル名を使用できます。

$ tcpdump -w packet-captured.pcap

ダンプをファイルに書き込むと、tcpdumpはダンプを標準出力に出力しなくなります。

5.2. 各ファイルのサイズを制限する

-Cフラグを使用して各ファイルのサイズを制限できます。 フラグは、各ファイルのサイズ制限を数百万バイトで表す整数値を受け入れます。

$ tcpdump -w out.pcap -C 2

上記の例では、 tcpdump は、キャプチャされたパケットをファイルout.pcapに書き込みます。 ファイルが2MBのサイズに達すると、その後2MBずつ増加するごとに、後続のパケットが新しいファイル out.pcap1 out.pcap2 outに保存されます。 .pcap3など。

5.3. 保存ファイルを一定間隔でローテーションする

-Gフラグを使用すると、tcpdumpは指定された間隔でダンプを新しいファイルに保存します。 たとえば、保存ファイルを5秒ごとにローテーションできます。

$ tcpdump -w out-%Y%m%d-%H%M%S.pcap -G 5

上記の例では、strftime形式に基づいてファイルに動的に名前を付けています。 指定した間隔ごとに一定になるようにファイル名を指定すると、前の保存ファイルが上書きされます

6. モニターモードでの実行

IEEE 802.11 WiFiインターフェースでは、モニターモードにより、インターフェースはワイヤレスチャネルで受信したすべてのパケットをキャプチャできます。 さらに、特定のアクセスポイントに関連付けたりリンクしたりすることなく、パケットをスニッフィングできます。

監視モードのインターフェイスでtcpdumpを実行するには、-Iフラグを使用できます

$ tcpdump -I

ただし、すべてのインターフェイスがモニターモードをサポートしているわけではないことに注意してください。 tcpdump は、それをサポートしていないインターフェイスでモニターモードを実行しようとすると、エラーメッセージを出力します。

$ tcpdump -i eth0 -I
tcpdump: eth0: That device doesn't support monitor mode

7. その他の便利なオプション

7.1. アドレスルックアップの抑制

デフォルトでは、tcpdumpはホストアドレスの名前を自動的に解決します。 これは、DNSルックアップのネットワークオーバーヘッドを引き起こすため、望ましくない場合があります。 -n フラグを使用して、ルックアップを抑制できます。

$ tcpdump -n

7.2. パケットの方向

tcpdump は、インターフェースの着信トラフィックと発信トラフィックの両方をキャプチャします。 -Qフラグに続いて方向値in、out、またはinout を使用して、特定の方向のパケットをキャプチャできます。 たとえば、インターフェイスeth0で送信パケットのみをキャプチャできます。

$ tcpdump -i eth0 -Q out

7.3. パケット番号の印刷

tcpdump を作成して、-#フラグを使用して各出力行のパケット番号を表示できます。

$ tcpdump -#
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    1  10:33:50.254707 IP 927e94ccde39.55667 > 192.168.65.4.53: 36710+ AAAA? www.baeldung.com. (34)
    2  10:33:50.254897 IP 927e94ccde39.49841 > 192.168.65.4.53: 19808+ A? www.baeldung.com. (34)
    3  10:33:50.255044 IP 927e94ccde39.58436 > 192.168.65.4.53: 37800+ PTR? 4.65.168.192.in-addr.arpa. (43)

ご覧のとおり、各出力行には番号が付いています。 この数は順番に実行され、これまでにキャプチャされたパケットの数を示します。

8. 表現

使用できる無数のオプションフラグの他に、 tcpdump は、最後の引数として指定できる構文のセットも提供します。 式を使用して、プロトコルなどの属性に基づいてパケットをフィルタリングするルールセットを構築できます。

8.1. 構文構造

通常、式はプリミティブと修飾子で構成されます。

[qualifier...] qualifier primitive [and|or|not] [primitive...]

プリミティブは通常、数値または文字列です。 これらのプリミティブ自体には意味がありません。 これらのプリミティブに意味を与えるために、それらの前に1つ以上の修飾子を付けます。

構文には、 type dir 、およびprotoの3つの異なる修飾子があります。 type 修飾子は、プリミティブのタイプを指定します。 たとえば、 80 のプリミティブがタイプポートとともに指定されている場合、80のプリミティブ値はポート番号80を表します。 ]。 type 修飾子の可能な値は、 host net port 、およびportrangeです。 型修飾子が指定されていない場合、式の値hostが想定されます。

修飾子dirは、パケットの方向を指定します。 この修飾子に使用できる値には、 src dst srcまたはdst、およびsrcとdstがあります。

その上、修飾子 proto は、一致するパケットのプロトコルを表します。 この修飾子に指定できる値には、 ether ip ip6 arp tcp 、およびが含まれます。 ]udp

最後に、構文にはまたは not などの単語も含まれているため、プリミティブを組み合わせて複雑な式を作成できます。 のような彼らの象徴的な表現 && || 、 と 式パーサーによっても認識されます。

いくつかの例を見てみましょう。

8.2. ホストによるパケットのフィルタリング

パケットをフィルタリングする最も簡単な方法の1つは、ホストでフィルタリングすることです。 具体的には、ホスト構文を使用して、特定のホストに関連付けられているパケットをキャプチャできます。

$ tcpdump 'host www.baeldung.com'

上記のコマンドは、パケットがwww.baeldung.comから発信されているかwww.baeldung.comに送信されている場合にのみパケットをダンプします。

8.3. ポートでパケットをフィルタリングする

修飾子portを使用して、ポート番号でパケットをフィルタリングすることもできます。

$ tcpdump 'port 80'

上記のコマンドは、ポート80との間で送受信されるパケットのみをキャプチャします。 さらに、srcまたはdstを使用して、方向を特定できます。 たとえば、送信元フィールドがポート80の場合にのみパケットをキャプチャする場合は、式の前にsrcを付けることができます。

$ tcpdump 'src port 80'

さらに、修飾子portrangeを使用すると、からパケットをキャプチャするポート番号の範囲を指定できます。

$ tcpdump 'portrange 80-90'

上記の式を使用すると、 tcpdump は、80〜90のポート範囲内にあるすべてのパケットをキャプチャします。

8.4. ネットワークによるパケットのフィルタリング

ネット修飾子を使用して、パケットが属するネットワークに基づいてパケットをフィルタリングできます。 たとえば、 192.168.0.1 /16ネットワークからのパケットをキャプチャできます。

$ tcpdump 'net 192.168'

最後の2バイトを省略すると、tcpdumpは自動的にネットマスク/16をネットワークに適用します。

ネットマスクは、mask修飾子を使用して明示的に指定することもできます。

$ tcpdump 'net 192.168.0.1 mask 255.255.0.0'

2つの異なる式は、最終的に同じフィルターを構成します。

8.5. プロトコルによるパケットのフィルタリング

プロトコルでパケットをフィルタリングするには、修飾子protoとそれに続くプロトコル名を使用できます。 たとえば、UDPパケットのみをダンプできます。

$ tcpdump 'proto udp'

このツールは、 tcp udp icmp など、より一般的に知られているプロトコルのショートカットをいくつか提供します。 たとえば、上記のコマンドは、tcp式だけで書き直すことができます。

$ tcpdump 'udp'

8.6. その他の便利な表現

構文lessまたはgreaterを使用して、パケット長でパケットをフィルタリングできます。 たとえば、長さが40未満のパケットのみをキャプチャするには、次のようにします。

$ tcpdump 'less 40'

一方、長さが40を超える場合にのみパケットをキャプチャするには、次のようにします。

$ tcpdump 'greater 40'

フラグを使用する代わりに、修飾子インバウンドおよびアウトバウンドを使用して、パケットを方向でフィルタリングできます。 たとえば、着信パケットのみをキャプチャするには、inbound構文を使用できます。

$ tcpdump 'inbound'

同様に、構文 outbound を使用して、発信パケットのみをダンプできます。

$ tcpdump 'outbound'

8.7. 論理構文

tcpdump は、または not などの論理構造をサポートしており、より複雑なルールセットを構築できます。 たとえば、ホストwww.baeldung.comまたはwww.google.comのいずれかからのトラフィックのみをキャプチャするフィルターを作成できます。

$ tcpdump 'src host www.baeldung.com or www.google.com'

さらに、および演算子を使用して、ポート443のwww.baeldung.comからのパケットをキャプチャするフィルターを作成できます。

$ tcpdump 'host www.baeldung.com and port 443'

最後に、not演算子を使用して式を否定できます。 たとえば、192.168.0.1/16ネットワークからのパケットを除くすべてのパケットをキャプチャできます。

$ tcpdump 'not net 192.168'

9. 結論

この記事では、tcpdumpについて詳しく見てきました。

ツールの基本的な紹介から始めました。 次に、その基本的な使用法を示しました。 以降のセクションでは、ツールで使用できるフラグのいくつかを紹介します。

さらに、tcpdumpがダンプをファイルに書き込む方法を変更するために使用できるさまざまなフラグも確認しました。

最後に、さまざまな目的でパケットをフィルタリングするために式を構築する方法を示しました。