Linux で tcpdump を使用してイーサネットフレームを分析する

CompTIABeginner
オンラインで実践に進む

はじめに

この実験では、強力なコマンドラインツールである tcpdump を使用して、Linux システムにおけるネットワークトラフィック分析の基本を学びます。主な目的は、データリンク層でイーサネットフレームをキャプチャして検査することであり、ローカルネットワークを介した送信のためにデータがどのように構造化されているかについて実践的な経験を提供します。低レベルのネットワーク通信を特定し、解釈するための実践的なスキルを習得できます。

まず、tcpdump のインストールとアクティブなネットワークインターフェイスの特定を含む環境の準備から始めます。次に、リアルタイムでネットワークアクティビティを監視するためにライブパケットキャプチャを開始します。さまざまな通信パターンを理解するために、ping コマンドを使用したユニキャストトラフィックと、ARP を介したブロードキャストトラフィックの両方を生成します。キャプチャされた出力を調べることで、イーサネットフレームヘッダーを分析し、ユニキャストとブロードキャストの MAC アドレスを区別する方法を学びます。

tcpdump のインストールとネットワークインターフェースの特定

このステップでは、ネットワーク分析の準備を行います。これには、強力なコマンドラインパケットスニファーである tcpdump のインストールと、プライマリネットワークインターフェイスの名前の特定という 2 つの主要な作業が含まれます。パケットスニファーを使用すると、ネットワーク上を流れるデータを「見る」ことができ、tcpdump は監視対象の特定のネットワーク接続を知る必要があります。

まず、tcpdump がインストールされていることを確認しましょう。これは標準的なツールですが、その存在を確認しておくことは良い習慣です。ここでは apt パッケージマネージャーを使用します。sudo apt update コマンドは、パッケージリストをソフトウェアリポジトリと同期させ、sudo apt install tcpdump -y コマンドは、-y オプションによりインストールを自動的に確認してツールをインストールします。

ターミナルで以下のコマンドを実行してください。

sudo apt update
sudo apt install tcpdump -y

インストールが完了したら、tcpdump のバージョンを確認して検証できます。

tcpdump --version

以下のような出力が表示され、ツールが使用可能であることを確認できるはずです。バージョン番号は異なる場合があります。

tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]

次に、監視するネットワークインターフェイスの名前を見つける必要があります。コンピューターには複数のインターフェイス(例:有線イーサネット、Wi-Fi、仮想ネットワーク用)がある場合があります。ip addr コマンドを使用して、利用可能なすべてのネットワークインターフェイスとその設定を一覧表示します。

このコマンドを実行してください。

ip addr

出力にはいくつかのインターフェイスが一覧表示されます。プライマリのアクティブなインターフェイスを探してください。多くの場合、eth0 または enp0s3 という名前が付いています。inet アドレス(IP アドレス)を持ち、UP 状態の項目を探してください。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159786sec preferred_lft 1892159786sec
    inet6 fe80::216:3eff:fe01:beb3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

上記の例の出力から、インターフェイス名は eth0 です。次のステップで必要になるため、ご自身のインターフェイス名をメモしておいてください。

広範なキャプチャを開始し、トラフィックを監視する

このステップでは、ライブネットワークトラフィックのキャプチャを開始します。データリンク層(レイヤー 2)におけるデータの基本単位は イーサネットフレーム です。各フレームはデジタル封筒のようなもので、送信されるデータだけでなく、送信元と宛先の MAC アドレス のような重要なアドレス情報も含まれています。ここでは、これらのレイヤー 2 の詳細を特に表示するために、-e オプション付きの tcpdump を使用します。この最初のキャプチャはフィルタリングされていないため、ネットワーク上のすべてのアクティビティを把握できます。

それでは、キャプチャプロセスを開始しましょう。前のステップで特定したインターフェイス名(例:eth0)が必要です。ネットワークパケットをキャプチャするには管理者権限が必要なため、sudo を使用します。また、tcpdump が IP アドレスをホスト名に解決するのを防ぐために -n フラグを、出力をよりクリーンにするために -q フラグを追加します。

ターミナルで tcpdump コマンドを実行します。eth0 を実際のインターフェイス名に置き換えることを忘れないでください。

## ステップ 1 で特定した実際のインターフェイス名に eth0 を置き換えてください
sudo tcpdump -i eth0 -e -n -q

このコマンドの内訳を見てみましょう。

  • sudo: このようにネットワークインターフェイスにアクセスするために必要なスーパーユーザー権限でコマンドを実行します。
  • tcpdump: パケットキャプチャツール自体です。
  • -i eth0: -i フラグは、リッスンするネットワーク interface を指定します。
  • -e: このオプションは、この実験にとって非常に重要です。これは、tcpdump に各パケットのリンクレベル(イーサネット)ヘッダーを表示するように指示します。これには送信元と宛先の MAC アドレスが含まれます。
  • -n: ホスト名の解決を防止し、生の IP アドレスを表示します。
  • -q: 「Quiet」モードで、プロトコル固有の出力量を減らします。

コマンドを実行すると、tcpdump はリッスンを開始します。最初にメッセージが表示され、その後ターミナルにキャプチャされたパケットが表示され始めます。ネットワークによっては、目的のものに関連しない多くのトラフィックが表示される場合があります。これには、ARP リクエスト、バックグラウンドサービスなどが含まれる可能性があります。

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80

これを数秒間実行してアクティビティを観察し、その後 Ctrl+C を押してキャプチャを停止します。これは、忙しい環境で特定の情報を見つけることの難しさを示しています。

ICMP フィルターでキャプチャを絞り込む

前ステップで見たように、フィルタリングされていないキャプチャはノイズが多くなります。分析したい特定のトラフィックに焦点を当てるために、キャプチャフィルター を使用できます。ping コマンドは ICMP プロトコルを使用するため、tcpdump に ICMP パケットのみをキャプチャするように指示します。また、tcpdump が IP アドレスをホスト名に解決するのを停止するために -n フラグを、出力をよりクリーンにするために -q フラグを追加します。これにより、出力の分析がはるかに容易になります。

それでは、tcpdump を再度開始しますが、今回は icmp フィルターと新しいフラグを追加します。

## ステップ 1 で特定した実際のインターフェイス名に eth0 を置き換えてください
sudo tcpdump -i eth0 -e -n -q 'icmp'

コマンドの 'icmp' 部分がフィルターです。これは、ICMP プロトコルを使用するパケット以外のすべてのパケットを無視するように tcpdump に指示します。

このコマンドを実行すると、tcpdump は再びリッスンしますが、現在は ICMP トラフィックを特に待機しているため、ターミナルは静かになるはずです。

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

重要: このターミナルを実行したままにしてください!tcpdump は、次のステップで生成するトラフィックをキャプチャするためにアクティブな状態を維持する必要があります。後続のコマンドを実行するには、新しいターミナルタブまたはウィンドウ を開く必要があります。これは、ターミナルパネルの + アイコンをクリックすることで実行できます。

'ping'でユニキャストトラフィックを生成し、フレームヘッダーを分析する

このステップでは、ユニキャスト トラフィックを生成して観察します。ユニキャストは、ネットワーク上の単一の宛先に単一の送信元からフレームが送信される、1 対 1 の通信方法です。これを行うために、一般的な ping ユーティリティを使用します。これは、接続を確認するためにターゲットホストに ICMP(Internet Control Message Protocol)パケットを送信します。これらのパケットは、送信のためにイーサネットフレーム内にカプセル化されます。

最初のターミナルで tcpdumpicmp フィルター付き)を実行したまま、ネットワークアクティビティを生成する必要があります。

ターミナルパネルの + アイコンをクリックして、新しいターミナル を開きます。この新しいターミナルで、ping コマンドを使用して google.com にいくつかのパケットを送信します。-c 4 オプションを使用して、正確に 4 つのパケットを送信してから停止します。

ping -c 4 google.com

2 番目のターミナルには、Google のサーバーからの応答を示す、これに似た出力が表示されます。

PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms

次に、tcpdump が実行されている最初のターミナルに戻ります。ping を実行している間にキャプチャされた、いくつかの新しい出力行が表示されます。

送信される「echo request」パケットの 1 つを分析してみましょう。これは次のようなものになります(MAC アドレスと IP アドレスはシステムによって異なります)。

10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64

この行の意味は次のとおりです。

  • 10:25:01.123456: フレームがキャプチャされた時刻のタイムスタンプです。
  • 00:16:3e:01:be:b3: 送信元 MAC アドレス(VM の MAC)です。
  • >: トラフィックの方向(送信元から宛先へ)を示す区切り文字です。
  • de:ad:be:ef:00:01: 宛先 MAC アドレス です。これは、Google のサーバーではなく、ローカルネットワークのゲートウェイ(ルーター)である可能性が高いことに注意してください。VM はフレームをゲートウェイに送信し、ゲートウェイはそれをインターネットに向けて転送します。
  • ethertype IPv4: このフィールドは、イーサネットフレームのデータペイロードが IPv4 パケットであることを示します。
  • 172.16.50.8 > 142.250.191.174: これはレイヤー 3(IP)情報で、送信元と宛先の IP アドレスを示します。
  • ICMP echo request: これは、パケットが ping リクエストの一部であることを識別します。

対応する「echo reply」フレームが返ってくるのも表示されます。送信元と宛先の MAC アドレスが入れ替わっていることに注意してください。

最後に、tcpdump ターミナルに戻り、Ctrl+C を押してキャプチャを停止します。

ARP 経由でブロードキャストトラフィックを生成し、ブロードキャスト MAC アドレスを特定する

このステップでは、ユニキャストトラフィックとブロードキャスト トラフィックを対比させます。ユニキャストは 1 対 1 のメッセージですが、ブロードキャストはローカルネットワークセグメント上のすべてのデバイスに送信される 1 対すべて(one-to-all)のメッセージです。この主な例がARP(Address Resolution Protocol)です。これは、特定の IP アドレスに関連付けられた MAC アドレスを見つけるために使用されます。「この IP アドレスを持っているのは誰ですか?」とブロードキャストフレームを送信することで行われます。

まず、新しい tcpdump キャプチャを開始しましょう。今回は、ARP パケットのみを表示するようにフィルターを追加します。また、tcpdump が IP アドレスをホスト名に解決するのを防ぐために -n フラグを、出力をよりクリーンにするために -q フラグを使用します。

ターミナルで、ステップ 1 のインターフェイス名に eth0 を置き換えることを覚えて、次のコマンドを実行します。

## eth0 を実際のインターフェイス名に置き換えてください
sudo tcpdump -i eth0 -e -n -q 'arp'

tcpdump は現在リッスンしていますが、ARP トラフィックのみを対象としています。

次に、ARP 要求をトリガーする必要があります。確実な方法は、システムの ARP キャッシュをクリアしてから、ゲートウェイ ルーターのようなローカルネットワーク上の別のデバイスに接続を試みることです。キャッシュをクリアすると、システムは ARP を使用してゲートウェイの MAC アドレスを再検出する必要があります。

新しいターミナルを開きます。まず、ip route コマンドでゲートウェイの IP アドレスを見つけます。

ip route | grep default

出力にはデフォルトルートが表示され、「via」の後にリストされている IP アドレスがゲートウェイです。

default via 172.16.50.1 dev eth0

注: ゲートウェイの IP アドレスは異なる可能性が高いです。以下のステップで、この コマンドからの IP アドレスを使用することが重要です。よくある間違いは、172.17.0.1 のような別の IP を使用することですが、これはローカル Docker ネットワークのゲートウェイであることが多く、この演習では正しい結果が得られません。

この例では、ゲートウェイは 172.16.50.1 です。次に、ip neigh flush コマンドを使用して ARP キャッシュをクリアします。これにより、既知の MAC アドレスのマッピングが削除され、システムはそれらを再度見つけるために ARP を使用する必要があります。

sudo ip -s -s neigh flush dev eth0

削除されたエントリを確認する出力が表示される場合があります。最後に、ゲートウェイを 1 回だけ ping して ARP ルックアップをトリガーします。

## 172.16.50.1 を実際のゲートウェイ IP に置き換えてください
ping -c 1 172.16.50.1

次に、tcpdump が実行されている最初のターミナルに戻ります。生成された ARP トラフィックが表示されます。「Request」行を探します。

10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28

このブロードキャストフレームを分析しましょう。

  • 00:16:3e:01:be:b3: 送信元 MAC アドレス(VM)。
  • ff:ff:ff:ff:ff:ff: これは特別なブロードキャスト MAC アドレスです。スイッチがこの宛先アドレスを持つフレームを見ると、すべてのポートからすべての接続デバイスに転送します。
  • ethertype ARP: これはフレームのペイロードが ARP パケットであることを示します。
  • ARP, Request who-has 172.16.50.1 tell 172.16.50.8: これは ARP メッセージ自体であり、ネットワーク全体に対して 172.16.50.1 の MAC アドレスを尋ねるブロードキャスト質問です。

ゲートウェイから VM の MAC アドレスに直接送信されるユニキャストフレームである「Reply」パケットも表示されます。

これで、tcpdump ターミナルで Ctrl+C を押してキャプチャを停止できます。

まとめ

この実験では、Linux 環境で tcpdump を使用してイーサネットフレームを分析する基本的なプロセスを学びました。まず、apt パッケージマネージャーで tcpdump ユーティリティをインストールし、ip addr コマンドを使用してプライマリネットワークインターフェイスを特定することを含むシステム準備を行いました。次に、パケットキャプチャを開始する方法を学びました。まず、すべてのネットワークトラフィックを観察し、フィルタリングの必要性を理解するためにフィルタリングされていないキャプチャを実行しました。最初のキャプチャを停止した後、分析したいトラフィックに具体的に焦点を当てるために sudo tcpdump -i eth0 -e -n -q 'icmp'icmp フィルターを適用する方法を学びました。

その後、実験では 2 つの主要なタイプのネットワークトラフィックを生成および分析しました。ping コマンドを使用してユニキャストトラフィックを作成し、フィルタリングされた tcpdump 出力を調べて、イーサネットフレームヘッダー内の特定の送信元および宛先 MAC アドレスを特定しました。その後、別の arp フィルタリングされたキャプチャで ARP 要求を開始してブロードキャストトラフィックを生成し、ローカルネットワークセグメント上のすべてのデバイスを対象としたフレームであることを示す、特別なブロードキャスト MAC アドレス ff:ff:ff:ff:ff:ff を認識する方法を学びました。