【入門編】 ARP要求(Request)と応答(Reply)のパケット構造 – ネットワーク基礎とWebセキュリティ実践ガイド

こんにちは!インフラの現場を渡り歩き、日々パケットのささやきに耳を傾けているネットワークセキュリティスペシャリストの私です。

ネットワークやインフラの世界へようこそ!
最初は「OSI参照モデル?」「TCP/IP?」「MACアドレスってなんだっけ?」と、横文字の呪文のような用語のオンパレードに圧倒されてしまいますよね。でも、安心してください。どんなに巨大なインターネットも、基本の「お使い(通信)」の積み重ねで動いています。

今回は、そんなネットワークの基礎の基礎、そして私たちが普段何気なく使っているIP通信の裏側でこっそり、しかし猛烈なスピードで働いている「ARP(Address Resolution Protocol)」の仕組みについて、郵便配達のたとえを交えながら優しく、深く紐解いていきましょう!

一歩ずつ、確実に理解していきましょうね。

—

1. そもそもARPってなんだろう?(現実世界でのたとえ話)

私たちが普段、PCからWebサイトを見たり、社内ニートワークのプリンターに印刷データを飛ばしたりするとき、宛先として使っているのは「IPアドレス(例: 192.168.1.10)」ですよね。

「よし、あて先のIPアドレスは分かった!じゃあパケットを飛ばすぞ!」と意気込むOSですが、実はこれ、人間界で例えると「相手の『名前』と『住所(都道府県・市区町村)』しか知らない状態」なんです。

実際の郵便配達(ネットワークカード同士の通信)で本当に必要なのは何でしょうか? そう、最終的に手紙をポストに投函するための「宛先の名前(MACアドレス)」ですよね。同じLAN(ローカルエリアネットワーク)という同じ町内の中では、郵便物はMACアドレスという固有の識別子なしには配達できません。

「IPアドレス(住所)は知っているけれど、相手のMACアドレス(表札)がわからない……」
そんなときに登場するのが、今回主役のARP(Address Resolution Protocol)です。

ARPの働きを郵便配達でイメージしてみる

あなたが会社のフロア(同一セグメント)にいて、隣の席に座っている同僚の「内線番号(IPアドレス)」は知っているけれど、彼の「顔や名前(MACアドレス)」をうっかり忘れてしまったとしましょう。

1. あなたはフロア全体に向けて大声で叫びます。
> 「おい! 192.168.1.50 のIPアドレスを使っている人、あなたのMACアドレス(表札)を教えてください!」
2. フロアにいる全員がその声を聞きます(これがARP要求 / ARP Requestです)。
3. 名指しされた本人(192.168.1.50 の端末)だけがこう返事をします。
> 「あ、それ俺だわ! 俺のMACアドレスは aa:bb:cc:dd:ee:ff だよ!」
4. あなたは無事に相手のMACアドレスを知ることができ、無事にデータを届けることができます(これがARP応答 / ARP Replyです)。

ネットワークの世界でも全く同じことが、ミリ秒以下の瞬間で行われているんです。ロマンチックだと思いませんか?

—

2. ARPパケットの裏側をのぞいてみよう

さて、ここから少しだけ技術的な話をしますね。「ヘッダー」という言葉を聞くと身構えてしまうかもしれませんが、郵便封筒に書く「宛名書きのフォーマット」だと思えば怖くありません。

ARPがやり取りするパケットの中身(ARPヘッダー)には、次のような大切な情報が詰め込まれています。

  • ハードウェアタイプ(Hardware Type)
  • ネットワークの「種類」を表します。私たちが普段使うEthernet(イーサネット)の場合は、通常 1 という値が入ります。
  • プロトコルタイプ(Protocol Type)
  • どのネットワーク層のプロトコルを解決したいかを示します。IPアドレス(IPv4)を解決したい場合は、おなじみのEthernetタイプである 0x0800 が指定されます。
  • オペコード(Opcode:操作コード)
  • いま流れているパケットが「誰かを探しているのか(要求)」それとも「返事をしているのか(応答)」をズバリ教えるコードです。
  • 1 なら ARP要求(Request)
  • 2 なら ARP応答(Reply)
  • 送信元/宛先のMAC・IPアドレス
  • 「誰が(送信元IP/MAC)」「誰を探しているのか(宛先IP、※宛先MACはこの時点では分からないので 00:00:00:00:00:00 やブロードキャストの ff:ff:ff:ff:ff:ff になる)」の組み合わせです。

難解な英語の仕様書を見ると気が遠くなりますが、要するに「EthernetでIPv4を使うよ! 今から探すよ(Opcode=1)!」という意思表示の封筒なんですね。

—

3. 実践!パケットキャプチャとCLIでARPをのぞき見する

百聞は一見にしかず。インフラエンジニアの必須ツールを使って、実際に私たちのPCがどうやってARPを使っているのかをこの目で確かめてみましょう。

自分のPCのARPテーブル(住所録)を見てみよう

WindowsやLinux、macOSの端末を開いて、現在のARPキャッシュ(一度調べたIPとMACの対応表)を覗いてみます。

コマンドプロンプトやターミナルを開いて、以下のコマンドを打ってみてください。

# Windowsの場合のARPキャッシュ確認コマンド
arp -a

# LinuxやmacOSの場合のARPキャッシュ確認コマンド
ip neigh
# または
arp -an

実行すると、以下のようなリストが表示されます。

インターフェイス: 192.168.1.10 --- 0x3
  インターネット アドレス     物理アドレス      種類
  192.168.1.1           cc:2d:e0:xx:xx:xx   動的 (dynamic)
  192.168.1.254         14:75:90:xx:xx:xx   動的 (dynamic)

「おっ、ルーター(192.168.1.1)のMACアドレスはこうなっているんだな」と、PCがしっかりメモ帳(ARPキャッシュ)に記録しているのが分かりますよね。このキャッシュがあるおかげで、通信のたびに毎回大声でARP要求を叫ばずに済んでいるのです。

—

4. Pythonで簡易的なARPスキャナーの挙動をイメージしてみる

ネットワークの動作原理をより深く理解するために、Pythonのセキュリティライブラリ(Scapyなど)をイメージした、ARPの概念的なコードの動きを見てみましょう。実務のトラブルシューティングやセキュリティの脆弱性診断でも、このARPの仕組みをコードで理解していることが大きな武器になります。

from scapy.all import ARP, Ether, srp

def simple_arp_scan(ip_range):
    """
    指定したIPアドレスの範囲に対してARP要求をブロードキャストし、
    応答があったホストのIPとMACアドレスのペアを表示するサンプルコード
    
    ※実際の実行にはroot権限とscapyライブラリが必要です
    """
    print(f"[*] ARPスキャンを開始します: {ip_range}")

    # 1. イーサネット層のブロードキャストフレームを作成
    # 宛先MACアドレスを 'ff:ff:ff:ff:ff:ff' にすることで、同一セグメントの全員に届きます
    ether_layer = Ether(dst="ff:ff:ff:ff:ff:ff")

    # 2. ARPレイヤーを作成
    # Opcodeはデフォルトで要求(1)になります。pdstに調べたいIPレンジを指定。
    arp_layer = ARP(pdst=ip_range)

    # 3. パケットを結合して送信(srp = Send and Receive Packets at layer 2)
    packet = ether_layer / arp_layer
    answered_list, unanswered_list = srp(packet, timeout=2, verbose=False)

    # 4. 返ってきた応答(ARP Reply)を解析して表示
    print("\n--- 応答があったデバイス一覧 ---")
    for sent, received in answered_list:
        print(f"IPアドレス: {received.psrc} ==> MACアドレス: {received.hwsrc}")

# 使用例(実際の環境に合わせてIPレンジを変更してください)
# simple_arp_scan("192.168.1.0/24")

このコードの何が面白いかというと、「ネットワーク層(IP)の宛先を調べるために、データリンク層(MAC)の全体向けブロードキャストを使っている」というOSI参照モデルの階層をまたいだ連携の妙が、コードの構造からもありありと読み取れる点です。

—

5. セキュリティスペシャリストからのワンポイントアドバイス

ここまでARPの便利な仕組みを見てきましたが、実はこのARP、「設計上の大きな弱点(脆弱性)」を抱えています。

それは何かと言うと、「ARPには『認証の仕組み』が一切ない」ということです。
先ほどの郵便配達のたとえで言うと、「私こそが 192.168.1.1 のルーターです!」と、誰かが嘘の表札を掲げて大声で叫んでも、誰もその身分証明書を確認しないまま信じ込んでしまうのです。

この脆弱性を悪用した攻撃が、有名な「ARPスプーフィング(ARPキャッシュポイズニング)」です。悪意ある攻撃者が偽のARP応答を送りつけることで、ネットワーク上の通信を盗聴したり、通信をハイジャックしたりすることができてしまいます。

現代の企業ネットワークやゼロトラストアーキテクチャにおいては、こうしたレイヤー2の脆弱性をカバーするために、スイッチ側の機能(DAI: Dynamic ARP Inspectionなど)を使って正当なARPトラフィックだけを厳しく監視・制御するセキュリティ対策が欠かせません。

「基本のプロトコルがどう動いているか」を知ることは、そのまま「ネットワークのどこにリスクが潜んでいるか」を見抜く目に直結しているのです。

—

まとめ

いかがでしたでしょうか?
今回は、ARP要求と応答のパケット構造、そしてIPアドレスからMACアドレスを解決するプロセスを、郵便配達のたとえや実際のコマンド、コードのイメージを交えて解説しました。

  • IPアドレス(宛先の名前)だけでは、同一LAN内でも直接荷物は送れない!
  • だからこそ、ARPを使って「このIPの人のMACアドレス(表札)を教えて!」とみんなに叫ぶ(ARP要求: Opcode 1)。
  • 本人が「私だよ!」と自分のMACアドレスを元気よくお返事する(ARP応答: Opcode 2)。
  • 一度知ったペアはARPキャッシュに記憶して効率よく通信する。

ネットワークの技術は、一見すると冷たくて複雑なルールの集まりに見えますが、その中身を紐解いていくと、非常に人間味あふれる泥臭い工夫や対話の積み重ねで成り立っていることが分かります。

ぜひ、ご自身のPCでも arp -a を叩いて、身近なネットワークの息づかいを感じてみてくださいね。それでは、また次回の技術解説でお会いしましょう!

コメント

タイトルとURLをコピーしました