ネットワーク管理者として、ネットワークの問題のトラブルシューティングは日常業務の一部です。ネットワーク関連の問題に取り組む際に不可欠なツールの 1 つは、tcpdump Linux コマンドです。
このチュートリアルでは、一般的なネットワークの問題を診断する際に tcpdump がどのように役立つかについて、実際の例をいくつか紹介します。このチュートリアルの終わりまでに、tcpdump を活用してネットワークの問題をトラブルシューティングする方法について理解を深めることができます。
前提条件
このチュートリアルは実践的なデモンストレーションです。先に進みたい場合は、Linux マシンを持っていることを確認してください。このチュートリアルでは Ubuntu 20.04 を使用していますが、最新の Linux ディストリビューションであればどれでも機能します。
tcpdump Linux ツールのインストール
最新の Linux ディストリビューションのほとんど、特にサーバーには、すでに tcpdump があります。そうでない場合でも、インストールは汗をかかずに迅速に行えるため、心配する必要はありません。
1. お好みの SSH クライアントを使用して Linux コンピューターにログインします。
2. まず、以下のコマンドを実行して、tcpdump が既にインストールされているかどうかを確認します。
sudo apt list --installed tcpdump
マシンに tcpdump が存在する場合、以下のスクリーンショットと同様の出力が表示されます。

tcpdump が存在しない場合は、代わりに以下の結果が得られます。

3. tcpdump がインストールされていないことを確認したら、以下のコマンドを実行してインストールします。
# Update the package index
sudo apt update -y
# Install tcpdump
sudo apt install tcpdump -y

4. 最後に、以下のコマンドを実行して、インストールされている tcpdump のバージョンを確認します。
tcpdump --version
これを書いている時点で、Ubuntu リポジトリの最新の tcpdump バージョンは 4.9.3 です。

デフォルト インターフェイスでのパケット トラフィックのキャプチャ
tcpdump の主な用途は、パケットのキャプチャです。 pcap ライブラリのおかげで、このツールはイーサネット、Wi-Fi、PPP などのさまざまなネットワーク タイプからパケットをキャプチャできます。
tcpdump コマンドの基本形式の構文は次のとおりです。
tcpdump [options] [expression]
場所:
options
:さまざまな tcpdump オプションを設定します。オプションは、tcpdump がパケットをキャプチャして表示する方法を制御します。expression
:キャプチャするトラフィックの種類をフィルタリングまたは指定します。式については、このチュートリアルの後半で詳しく説明します。
tcpdump の最も基本的な使用例は、デフォルトのネットワーク インターフェース上のすべてのトラフィックをキャプチャし、データを標準出力に表示することです。
tcpdump
を実行します コマンドをオプションまたは式なしで使用して、デフォルト インターフェイスのすべてのトラフィックをキャプチャします。
sudo tcpdump
ネットワーク インターフェイスへのアクセスは特権操作であるため、tcpdump は root として実行するか、sudo プレフィックスを付けて実行する必要があります。
tcpdump
以下に示すように、ツールはパケットをキャプチャし、ターミナルに出力を出力します。十分な数のパケットをキャプチャしたと思われる場合は、CTRL+C
を押します キャプチャを停止します。

パケット キャプチャ カウントの制限
tcpdump
Linux コマンドは出力で端末をすぐに圧倒する可能性があるため、一度に少量のデータのみを取得することをお勧めします。
-c
を含めることができます パケット数を指定するオプション tcpdump
終了する前にキャプチャする必要があります。このオプションは、分析用に少量のデータのみをキャプチャする場合に適用できます。
これを行うには、以下のコマンドを実行し、-c
の後の数字を変更します。 オプション。この例では、最大 10 個のパケットのみをキャプチャし、自動的に終了します。
sudo tcpdump -c 10

冗長性の向上
パケットのキャプチャ中に、デフォルトの出力に詳細な情報が含まれていない、または表示されていないことがあります。幸いなことに、tcpdump Linux ツールは、-v、-vv、および -vvv フラグで表される 3 つのレベルの冗長性を提供します。
これらのオプションを使用する場合、tcpdump
Time to Live (TTL)、ID など、各パケットのより多くの情報を解析して出力します。
# Verbose
sudo tcpdump -v
# Even more verbose
sudo tcpdump -vv
# Most verbose
sudo tcpdump -vvv
より良い視点については、-v
の違いを詳細に比較した下の画像を参照してください。 と -vvv
.

特定またはすべてのインターフェイスでのパケットのキャプチャ
前の例では、tcpdump はデフォルトのネットワーク インターフェイスでパケットをキャプチャしていました。つまり、考慮すべきインターフェイスは 1 つだけです。しかし、複数のインターフェースがあり、特定のインターフェースまたはすべてのインターフェースでトラフィックをキャプチャしたい場合はどうでしょうか?
tcpdump Linux コマンドでは、-i フラグを使用してキャプチャするネットワーク インターフェイスを指定できます。このフラグはインターフェイス名を値として受け入れます。つまり、最初にインターフェイス名を知る必要があります。
1. -D オプションを指定して tcpdump コマンドを実行し、マシンで使用可能なすべてのインターフェースのリストを出力します。
sudo tcpdump -D
以下に示すように、このマシンには 7 つのインターフェイスがあります。お使いのコンピューターのネットワーク インターフェイスのセットが異なる場合があります。この例では、イーサネット ネットワーク インターフェイス、特に eth0 と eth1 のみに焦点を当てています。

2. 次に、以下のコマンドを実行して、必要な特定のインターフェイスでパケットのキャプチャを開始します。この例では、eth1 インターフェイスをキャプチャします。また、キャプチャされるパケットの数を制限するために、以下のコマンドは -c フラグの後にカウントを使用します。
sudo tcpdump -i eth1 -c 5

3. 1 つのインターフェイスを指定する代わりに、すべてのインターフェイスで同時にパケットをキャプチャすることもできます。これを行うには、-i のパラメーター値として any を設定します。
sudo tcpdump -i any -c 5
すべてのインターフェイスでパケットをキャプチャする必要があるのはなぜですか?いくつかの一般的な理由を次に示します。
1 つは、すべてのインターフェイスでトラフィックをキャプチャすることで、システムを宛先としていない場合でも、システムを通過するすべてのトラフィックを確認できることです。
また、ネットワークを通過するサービスとプロトコルを確認できます。この情報は、特に新しいサーバーを構築する際に、ファイアウォール ルールやその他のセキュリティ対策を構成する際に役立ちます。
tcpdump Linux コマンドへのフィルターの追加
乱暴にパケットをキャプチャすることが常に最善の方法であるとは限りません。データの量がわかりにくくなり、トラブルシューティングの妨げになる可能性があります。なんで?状況に関係のないトラフィックをキャプチャしている可能性があるためです。
このような場合にフィルタが役立ちます。 tcpdump ツールには、特定の種類のトラフィックをキャプチャするための組み込みフィルターが多数あります。これらのフィルタを組み合わせて、関連するトラフィックのみをキャプチャできます。以下にいくつかの例を示します。
ポート番号によるフィルタリング
たとえば、SSH サーバーの問題をトラブルシューティングしている場合、ネットワークを通過する他の種類のトラフィックは気にしないでしょう。
以下のコマンドを実行して、ポート 22
宛てのすべてのトラフィックをキャプチャします。 、デフォルトの SSH ポート。
sudo tcpdump -c 5 port 22
ご覧のとおり、ツールはソースまたは宛先としてポート 22 トラフィックのみをキャプチャしました。

HTTP トラフィックだけに関心がある場合はどうでしょうか?ポート番号を HTTP ポート (デフォルトではポート 80) に置き換えるだけです。
sudo tcpdump -c 1 port 80

注:tcpdump ツールは、ポート番号の代わりにサービス プロトコル名を認識するほどスマートです。たとえば、SSH トラフィックをフィルタリングするためにポート 22 を指定する代わりに、代わりにポート ssh を指定できます。同じことが、HTTP トラフィックのポート 80、ポート http にも当てはまります。
プロトコルによるフィルタリング
名前を tcpdump
にしないでください TCP トラフィックでしか機能しないと思い込ませてください。このツールは、ICMP や UDP などの非 TCP トラフィックもキャプチャできます。
たとえば、次のコマンドは任意のインターフェースからパケットをキャプチャしますが、UDP トラフィックのみをフィルタリングします。
sudo tcpdump -i any -c 5 udp
その結果、以下の結果は UDP トラフィックのみを示しており、これは NTP および DNS 操作に関するパケットのようです。

DNS 関連のトラフィックのみをキャプチャする必要がある場合はどうすればよいでしょうか?その場合、フィルター udp
を組み合わせることができます と port 53
.このようにして、意図した出力には DNS 関連のパケットのみが表示されます。
sudo tcpdump -i any -c 5 udp port 53
今回は、UDP トランスポート プロトコルに制限された DNS 関連 (A、PTR、AAA ルックアップ、および応答) トラフィックのみをキャプチャしました。

ネットワークで ping フラッド攻撃が発生していると思われますか? tcpdump
を使用してソースと宛先を見つけてみませんか? ?これを行うには、以下のコマンドを実行して、任意のインターフェイスで ICMP トラフィックをリッスンします。
-n
フラグは、tcpdump がホスト名を解決しようとするのを防ぎ、代わりに IP アドレスを表示します。このような状況では、名前解決をバイパスするとパフォーマンスが向上する可能性があります。
sudo tcpdump -n -i any icmp

tcpdump
フィルタは強力で柔軟です。さまざまなフィルターを組み合わせることで、目的の結果に関連するトラフィックをキャプチャできます。
tcpdump フィルタの詳細については、tcpdump のマニュアル ページを参照してください。
キャプチャしたパケットをディスク上のファイルに保存する
パケット キャプチャをオンザフライで画面に表示することは、短いキャプチャでは問題ありません。しかし、大量のパケット キャプチャを生成している場合、画面上の出力は実用的ではなくなります。後で分析または共有するために、キャプチャしたデータをファイルにエクスポートする方法が必要です。
幸いなことに、tcpdump は、キャプチャしたパケットをディスク上のファイルに保存する機能をサポートしています。 -w オプションの後にファイル パスを指定する必要があります。
以下のコマンドを実行して、システムを通過するすべてのトラフィックを /tmp/capture.pcap というファイルに保存します。このコマンドは、任意のインターフェイスでリッスンし、自動的に終了する前に最大 20 パケットをキャプチャします。
sudo tcpdump -i any -w /tmp/capture.pcap -vv -c 20

これで、パケット キャプチャ ファイルが作成されました。必要な場合は、ファイルを端末に読み込むことができます。ファイルからパケット キャプチャを読み取るには、-r
を追加します。 オプションの後にパケット キャプチャ ファイル名が続きます。
sudo tcpdump -r /tmp/capture.pcap

結論
このチュートリアルでは、tcpdump Linux コマンドを使用してネットワーク トラフィックをキャプチャして分析する方法を説明しました。一般的なオプションと組み合わせたフィルターを使用して、正確なパケット キャプチャを生成しました。また、このツールを使用して、後で分析するためにパケットをファイルにキャプチャし、ファイルをターミナルに読み戻しました。
tcpdump Linux ツールは、すべてのネットワーク管理者のツールボックスに不可欠です。このチュートリアルで得た知識は、ネットワークの問題のトラブルシューティングを効果的かつ効率的に行うのに役立ちます。