ARP
Address Resolution Protocol ・ あーぷ
IPアドレスから同じLANにいる相手のMACアドレスを調べるプロトコル。L3とL2の橋渡し。
✦ 30秒で試す — 航海LANの中では、名乗った者勝ちで住所録が書き換わるこのとき、PCのログインの通信は?予想してみる概要
ARP(Address Resolution Protocol)は、IPアドレスからMACアドレスを調べるためのプロトコルです。「192.168.1.10 にパケットを届けたいが、その機器のMACアドレスは何か」を同じネットワークの全員に問いかけ、本人から答えをもらう — この一往復がARPのすべてです。
なぜそんな変換が必要かというと、インターネット越しの宛先指定に使うIPアドレスと、ケーブルや無線で隣の機器へフレームを実際に届けるときに使うMACアドレスは、役割の異なる別の住所だからです。アプリケーションはIPアドレスしか知りませんが、LANの中でデータを運ぶEthernetやWi-FiはMACアドレスでしか宛先を指定できません。この2つの世界の橋渡しを、通信のたびに裏で黙々と行っているのがARPです。
普段は意識せずに済む縁の下のプロトコルですが、「pingは通るのに一部の機器とだけ通信できない」といったLAN内トラブルの調査で arp -a を叩く場面や、ARPスプーフィングと呼ばれる古典的な攻撃の文脈で、突然表舞台に現れます。
なぜ生まれたか
1980年代初頭、TCP/IPをEthernet上で動かそうとしたとき、素朴な問題に突き当たりました。IPアドレスはネットワーク設計者が論理的に割り当てる住所であるのに対し、EthernetのMACアドレスは製造時にハードウェアへ焼き込まれる識別子で、両者の間に計算で導ける関係が何もないのです。IPパケットをEthernetフレームに載せて送るには宛先のMACアドレスが必須なのに、それを知る手段がありませんでした。
すべての機器の対応表を手作業で管理する方法は、機器の追加・交換のたびに全員の表を更新する必要があり、すぐに破綻します。そこで1982年に RFC 826 としてまとめられたのがARPです。「このIPアドレスを持っている人、いたらMACアドレスを教えて」とネットワーク全体に呼びかけ、本人だけが返事をする — 対応表を誰も管理しなくても、必要なときに動的に解決できる仕組みが生まれました。当時のLANは研究室や組織の内側にある信頼できる場所だったので、返事が本物かどうかを確かめる仕組みは入れられませんでした。この割り切りが、のちの攻撃の入口になります。
詳細
ブロードキャストで尋ね、ユニキャストで答える
ARPの動作は「全員への問いかけ」と「本人からの返答」の一往復です。ホストAが同じLANにいるホストB(192.168.1.20)へ通信したいのにMACアドレスが分からないとき、次の流れで解決します。
ARP要求は、宛先MACアドレスを全ビット1のブロードキャストアドレス(ff:ff:ff:ff:ff:ff)にして送るため、スイッチはそれを全ポートへ流し、同じネットワークの全機器に届きます。各機器は要求の中のIPアドレスを自分のものと見比べ、一致した機器だけが自分のMACアドレスを添えて、送信元へ直接(ユニキャストで)返答します。このとき返答する側も、要求に書かれていた送信元のIPアドレスとMACアドレスを自分の表に書き込むので、すぐ後に来る返信のために改めて尋ねる必要がありません。
ARPテーブル — 毎回聞かないためのキャッシュ
通信のたびにブロードキャストを流すのは無駄が多いため、解決した「IPアドレス ↔ MACアドレス」の対応は、各機器がARPテーブルにキャッシュします。エントリには数十秒〜数分程度の有効期限があり、期限が切れると再度ARPで解決し直します。この期限があるおかげで、機器の交換やIPアドレスの付け替えがあっても、しばらくすれば自然に正しい対応へ収束します。逆に言えば、付け替え直後は古いキャッシュが残って通信できない時間が生じることがあり、「NICを交換したら一部の機器から届かなくなった」という古典的トラブルの原因になります。arp -a(Linux なら ip neigh)でテーブルを確認し、必要なら削除するのが定石です。
この古いキャッシュの問題を先回りして解くのが、Gratuitous ARP(GARP)です。誰にも尋ねられていないのに「192.168.1.1 は私、MACはこれです」と自分からブロードキャストするARPで、2つの用途があります。1つは起動時の重複検知で、自分のIPアドレスを問いかけて誰かが返事をすれば、同じアドレスを使う機器がいると分かります。もう1つは切り替えの通知で、冗長構成のルータ(VRRP)やクラスタのサーバが障害で予備機に切り替わったとき、予備機が「このIPは今から私のMACです」と全員に知らせ、周りの機器のキャッシュを一斉に書き換えさせます。頼まれていない応答でも表を書き換える、というこの性質は、次の攻撃でも使われます。
デフォルトゲートウェイとARPの守備範囲
重要なのは、ARPが働くのは同じネットワーク(同じブロードキャストドメイン)の中だけという点です。ブロードキャストはルータを越えないので、別のネットワークにいる相手のMACアドレスは、問いかけても誰も答えません。宛先IPアドレスが別のネットワークに属する場合、ホストは宛先本人のMACアドレスを調べるのではなく、デフォルトゲートウェイであるルータのMACアドレスをARPで調べ、そこへフレームを託します。どちらになるかは、自分のサブネットマスクで宛先と自分のネットワーク部を比べて決めます。
つまり「IPアドレスで最終目的地を指し、MACアドレスで次の一区間の相手を指す」というOSI参照モデルのレイヤ2とレイヤ3の分業を、実際につなぎ合わせているのがARPです。インターネットを渡るパケットは、ルーティングで決まった次のルータのMACアドレスを区間ごとにARPで調べながら、バケツリレーで運ばれていきます。
なお、IPv6 ではARPは使われず、同じ役割を ICMPv6 の上に作られた近隣探索(NDP: Neighbor Discovery Protocol)が担います。全員宛てのブロードキャストの代わりに、対象を絞ったマルチキャストで問いかけるなどの改良はありますが、「論理アドレスからリンク層のアドレスを動的に調べる」という課題設定はそのまま引き継がれています。
ARPスプーフィング — 性善説の代償
ARPには認証がありません。「私が 192.168.1.1 です」という応答を、誰でも、頼まれなくても送りつけられ、受け取った機器は多くの場合それを信じて表を書き換えます。これを悪用するのがARPスプーフィング(ARPポイズニング)です。攻撃者が「ゲートウェイのIPアドレスは私のMACアドレスです」という偽のARP応答をLAN内にばらまくと、各機器のARPテーブルが汚染され、外向きの通信がすべて攻撃者経由になります。攻撃者は盗聴・改ざんしてから本物のゲートウェイへ転送すれば、被害者は異変に気づきません。典型的な中間者攻撃(MITM)です。本物のゲートウェイが応答すれば表は正しく戻るので、攻撃者は偽の応答を一定間隔で送り続けます。
下の部品で、攻撃者の偽の応答をPCへ運んでみてください。ARPテーブルのゲートウェイの行が書き換わり、そのPCのフレームが攻撃者を通って外へ出るようになります。上位層を HTTPS に切り替えると、何が変わるかも確かめられます。
まず PC-A を押して、外の Web サーバへ送ってみてください。ゲートウェイの MAC を ARP で調べるところから始まります。そのあと、攻撃者の偽の ARP 応答(朱のチップ)を PC へドラッグします。
LANの内側は信頼できるという1980年代の前提が、この脆さの根本にあります。対策としては、スイッチ側でDHCPの払い出し記録(DHCPスヌーピングの表)と突き合わせて、つじつまの合わないARP応答を捨てる Dynamic ARP Inspection(DAI)や、重要な機器のエントリを静的に固定する方法があります。ただし、どれもLANの管理者が設定して初めて効くものです。より本質的な防波堤は、「経路が信頼できなくても内容を守る」TLS などの上位層の暗号化と、そもそもネットワークの内側を信頼しないゼロトラストの考え方です。経路を曲げられても、HTTPS なら中身は読めず、改ざんは証明書の検証で見破られます。ARPスプーフィングは「公衆Wi-FiでもHTTPSなら大丈夫、HTTPは危ない」と言われる理由を最も具体的に説明してくれる攻撃です。
試問
LAN に PC-A・PC-B・攻撃者・ゲートウェイ(外への出口)がスイッチでつながっています。PC を押すと外の Web サーバへログインの通信を送り、攻撃者の「偽の ARP 応答」(朱のチップ)を PC やスイッチへドラッグすると、その PC の ARP テーブル(出口の IP アドレスと、実際に渡す相手の MAC アドレスの対応表)が書き換わります。上の切り替えで、送る通信を HTTP(平文)と HTTPS(TLS で暗号化)から選べます。
まず PC-A を押して、外の Web サーバへ送ってみてください。ゲートウェイの MAC を ARP で調べるところから始まります。そのあと、攻撃者の偽の ARP 応答(朱のチップ)を PC へドラッグします。
