tcpdump は、システムを通過するネットワークトラフィックをキャプチャして分析できるコマンドラインユーティリティです。フィルタリングオプションに応じて、このツールを使用して、あらゆる種類のネットワーク問題のトラブルシューティングを効果的に行うことができます。これは、これらの機能のためにシステム管理者エンジニアによって非常に一般的に使用されるツールです。
このチュートリアルでは、 tcpdumpを使用するいくつかの方法を分析します。 、 すべてではありません。これは、このコマンドに含まれるフィルタリングオプションが多すぎるため、すべてを網羅することはできません。ここでは、一般的に使用されるオプションの一部のみを見ていきます。残りはmanページにあります。
tcpdumpコマンドのインストール
システムにtcpdump
があるかどうかを確認できます コマンド、入力して
tcpdump --version
出力にインストールされていないことが示されている場合は、システムのパッケージマネージャーを使用して直接取得できます。
注 :パケットをキャプチャするため、昇格されたアクセス許可が必要です。 ( sudo 必要とされている)。すべてのtcpdump
のプレフィックスを付けます sudo
を使用したコマンド 結果として。
パケットキャプチャのインターフェイスを一覧表示する
パケットをアクティブにキャプチャする前に、tcpdump
で使用可能なインターフェイスを確認します。 。
-Dを使用してインターフェースを一覧表示できます (表示)オプション。
sudo tcpdump -D

マシンで使用可能なすべてのインターフェースのリストが表示されます。これはシステムごとに異なるため、私の場合は Dockerなどの他のインターフェースがいくつかあります。 、Dockerサービスが実行されているため、通常のネットワークインターフェイスは別として。
特別なインターフェース任意 任意のでキャプチャできます アクティブなインターフェース。
マシンで使用可能なインターフェースがわかったので、パケットのキャプチャを開始しましょう!
tcpdumpを使用してパケットをキャプチャする
任意のすべてのパケットをキャプチャします 次のコマンドを実行してインターフェースを設定します:
sudo tcpdump -i any
これにより、インターフェースが任意に指定されます 、前述の特別なインターフェース。
tcpdump 割り込みを受信するまでパケットをキャプチャし続けます 信号。 Ctrl+C
を押すと、キャプチャを中断できます 。
出力には、tcpdump
を終了するための割り込み信号が受信されるまでのすべてのパケットキャプチャが一覧表示されます。 。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108 10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116 10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 ... ... ^C 264 packets captured 361 packets received by filter 91 packets dropped by kernel
ご覧のとおり、tcpdump
264パケットをキャプチャしました。たとえば、ssh
を使用してこのサーバーに接続しているため 、 tcpdump これらすべてのパケットをキャプチャしました。
パケットキャプチャの数を制限する
キャプチャされるパケットの数を制限し、tcpdump
を停止するには 、-c
を使用します (キャプチャ制限)オプション:
sudo tcpdump -i any -c 2
これにより、tcpdumpコマンドは2パケット後に自動的にキャプチャを停止します。この場合、割り込み信号を使用して手動で終了する必要はありません。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108 10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36 2 packets captured 16 packets received by filter 8 packets dropped by kernel
このオプションは、ネットワークに問題がある場合に、問題のトラブルシューティングのためにネットワーク接続を監視するのに非常に役立ちます。
名前とポートの解決を無効にする
デフォルトでは、 tcpdump コマンドは、IPアドレスとポートを名前( vultr.com.ssh など)に解決します 、IPアドレスとポートからの名前解決を行います。
ネットワークの問題をトラブルシューティングするときは、多くの場合、IPアドレスとポート番号を使用する方が簡単です。オプション-n
を使用して、名前解決を無効にできます -nn
を使用したポート解決 。
sudo tcpdump -i any -c 2 -nn
上記のコマンドは、ポート解決を無効にしながら、任意のインターフェイスで2つのパケットをキャプチャします。
そのため、出力は名前解決を停止し、IPアドレスとポート番号を返すだけです。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108 11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36 2 packets captured 8 packets received by filter 0 packets dropped by kernel
ここで、出力の行を調べてみましょう。
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
これは典型的なTCP パケットキャプチャ。他のプロトコルパケットとフォーマットは、tcpdumpコマンドのマニュアルページで参照できます。
最初のフィールド、 11:00:36.459922 、ローカルクロックに従って受信したパケットのタイムスタンプを表します。
次に、IP
ネットワーク層プロトコルを表します。この場合、IPv4
。 IPv6
の場合 パケットの場合、値はIP6
です。 。
次のフィールド、 111.11.111.11.22 、は送信元IPアドレスとポートです。この後に、 123.45.678.90.48006で表される宛先IPアドレスとポートが続きます。 。
基本的な出力形式がわかったので、tcpdump
のいくつかのフィルタリングオプションを分析してみましょう。
パケットのフィルタリング
tcpdumpの1つ コマンドの最も強力な機能は、フィルタリングする機能です。 送信元と宛先のIPアドレス、ポート、プロトコルなど、さまざまなパラメータを使用してキャプチャされたパケット。最も一般的なものをいくつか見てみましょう。
プロトコルに基づくフィルター
プロトコルに基づいてパケットをフィルタリングするには、コマンドでプロトコルを指定する必要があります。
ICMPをキャプチャするには パケットのみ、 ICMPに基づいてフィルタリングできます プロトコル。
sudo tcpdump -i any -c 5 icmp
ping
以降 コマンドはICMPを使用します パケット、ping
による着信パケットを分析できます 別のマシンから。
現在のマシンにpingを実行し、着信pingパケットをキャプチャしてみましょう。
別のマシンでターミナルセッションを開き、次のように入力します
ping IP_ADDRESS_MACHINE_1
さて、tcpdump
で ターミナルセッションでは、ICMPping応答パケットをキャプチャしていることがわかります。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64 11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64 11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64 11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64 11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64 5 packets captured 6 packets received by filter 0 packets dropped by kernel
ここで、123.45.678.90はです tcpdump
にpingを送信するマシン(マシン2)のIPアドレス システム、および 111.11.111.11 はパケットフィルタリングマシン(マシン1)のIPアドレスです。
ssh
を使用していたので ping要求を送信するには、vultr.com
へのドメイン解決があります(ただし、名前解決はありません)。 。
ホストに基づくフィルター
キャプチャを特定のホストに関連するパケットのみに制限するには、host
を使用できます フィルタ
sudo tcpdump -i any -c5 -nn host 192.168.1.2
この例では、 tcpdump ホスト192.168.1.2
との間のパケットのみをキャプチャして表示します 。
ポートに基づくフィルター
目的のサービスまたはポートに基づいてパケットをフィルタリングするには、port
を使用します フィルター。たとえば、このコマンド(port 22 )を使用して、sshセッションに関連するパケットをキャプチャします。 フィルタリング):
sudo tcpdump -i any -c5 -nn port 22
ソースIP/ホスト名に基づくフィルター
送信元または宛先のIPアドレスまたはホスト名に基づいてパケットをフィルタリングすることもできます。たとえば、ホスト192.168.1.2
からパケットをキャプチャするには
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
dst
を使用できます 宛先IP/ホスト名でもフィルタリングします。
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
パケットキャプチャの保存
パケットキャプチャの結果は、後で分析するためにファイルに保存できます。
パケットを画面に表示する代わりにファイルに保存するには、オプション-w
を使用します :
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
このコマンドは、出力をsample.pcap
という名前のファイルに保存します 。 .pcap
拡張子は「パケットキャプチャ」の略で、このファイル形式の規則です。
結論
このチュートリアルでは、tcpdump
を使用して、さまざまなオプションに基づいてパケットのキャプチャとフィルタリングを実行する方法を学習しました。 コマンド。