ARP


ARPはIPアドレスからMACアドレスを解決(取得)するプロトコルです。

ARPの役割


企業や家庭のLANではL2がEthenet、L3にIPを用いています(IPoE)。我々が普段目にするのはIPアドレスですが、実際に通信するときにはMACアドレスが必要になります。ARP(Address Resolution Protocol、アドレス解決プロトコル、アープ)はIPアドレスからMACアドレスを解決するときに用いられます。

ARPの流れ

  1. ARP Request(ARP要求)をブロードキャストします。
  2. 要求されたIPアドレスを持つ端末はARP Reply(ARP応答)をユニキャストします。
  3. 受信したMACアドレスとIPアドレスを対応付けて記録(キャッシュ)します。

192.168.1.1(0000.0000.0011)が192.168.1.2(0000.0000.0022)のARPを実行する場合、192.168.1.1が送信するARP Requestは以下のような内容になります。
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
0000.0000.0011 192.168.1.1 0000.0000.0000 192.168.1.2
また、192.168.1.2が送信するARP Replyは以下のような内容です。
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
0000.0000.0022 192.168.1.2 0000.0000.0011 192.168.1.1
使用されていないIPアドレスに対してARPを実行すると、ARP Replyは誰からも送信されないためARPは失敗します。多くの場合では解決に失敗したこともキャッシュします。

ARPパケット

ARPパケットのフォーマットは以下のとおりです。
フィールド名 フィールド長(ビット) 説明
ハードウェア種別 16 ネットワークの物理的な媒体は何か。イーサネットは0x0001。
プロトコル 16 ARPの上位プロトコルは何か。IPは0x0800。
HLEN 8 ハードウェアアドレスの長さ。MACアドレスは6。
PLEN 8 上位プロトコルのアドレスの長さ。IPv4は4。
動作 16 ARPの動作の種類。ARP Requestは1、ARP Replyは2、RARP Requestは3、RARP Replyは4。
送信元ハードウェアアドレス HLEN*8 送信元のハードウェアアドレス
送信元プロトコルアドレス PLEN*8 送信元の上位プロトコルアドレス
宛先MACアドレス HLEN*8 宛先のハードウェアアドレス
宛先IPアドレス PLEN*8 宛先の上位プロトコルアドレス
これを見て分かる通り、IPアドレスからMACアドレスを解決するのがARPであるという説明は厳密には正しくありません。IP、MAC以外のアドレス解決も行えます。

RARP

Reverse ARPはMACアドレスからIPアドレスを求めるときに使います。ARPが元々持つ機能ですが、普通は利用することはありません。RARPの場合はパケットフォーマットの動作フィールドが3または4となります。
私は使う場面に出くわしたことはありませんが、組み込み機器など制約がある場合に使われることがあるかもしれません。

ARPテーブル

ARPの結果はIPアドレスとMACアドレスの組として(内部のデータ構造はさておき)以下のように表として保存されます。この表をARPテーブルといいます。また、ARPキャッシュそのものをARPテーブルと呼ぶこともあります。
IPアドレス MACアドレス
192.168.1.1 0000.0000.0001
192.168.1.2 0000.0000.0002
なおARPテーブルのMACアドレスにincompleteや無効と表示されている場合、そのIPアドレスはARPに失敗しています。つまりIPアドレスを持つ機器はネットワーク上にないということです。incompleteとなっているIPアドレスにはARPを試みず、上位の通信はそのまま失敗します。通常は数秒程度でARPテーブルから削除され、再度ARPを実行するようになります。
IPアドレス MACアドレス
192.168.1.1 (incomplete)
Windowsではコマンドプロンプトで「arp -a」または「arp -av」を実行するとARPテーブルを確認できます。「arp -a」では失敗したARPキャッシュは表示されません。

GARP

Gratuitous ARP(余計なARP)はIPアドレスを使用しているか調べるためのARPのことです。機器にIPアドレスを設定しようとすると、機器はそのIPアドレス宛てのARP Requestを送信してARP Replyを待ちます。もし既にそのIPアドレスを使用している機器があるとその機器がARP Replyを返します。逆に言うと「ARP Requestを送信して応答がない」ならば「同セグメントにそのIPアドレスを持つ端末はいない」ということになります。これによりIPアドレスの衝突を事前に防ぐことができます。
MACアドレス0000.0000.0011が192.168.1.10を使用したい場合に送信されるARP要求は以下です。送信元IPアドレスはすべて0とします。
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
0000.0000.0011 0.0.0.0 0000.0000.0000 192.168.1.10
IPアドレスが使用しているか調べる場合には送信元IPアドレスを必ず0にします。送信元IPアドレスにこれから使用したいアドレスを設定すると、各ネットワーク機器のARPキャッシュを更新してしまうためです。
ARP要求を受信したすべてのホストは、以下のように動作するよう仕様で定められています。
  1. 送信元IPアドレスのARPキャッシュを保持しているか確認します。
    • キャッシュを保持している場合は、受信したARPの送信元MACアドレスでキャッシュを上書きします。
      • ここでARPキャッシュが更新されてしまいます。
  2. 宛先IPアドレスが自分のIPアドレスであるか確認します。
    1. 送信元IPアドレスのARPキャッシュを保持しているか確認します。
      • キャッシュを保持していない場合、キャッシュに送信元IPアドレス・送信元MACアドレスの組を追加します。
    2. 自分宛てのARPであればARP応答を返します。
これを利用するとARPキャッシュの更新を強制的に行わせることができます。冗長化などで、機器のIPアドレスを別の機器が引き継ぐような場合に使われます。
MACアドレス0000.0000.0011が192.168.1.10を使用する場合に送信されるARP要求は以下です。
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
0000.0000.0011 192.168.1.10 0000.0000.0000 192.168.1.10
なお、ACD(Address Collision Detection、RFC5227)ではIPアドレス重複確認のためのGARPをARP探知(ARP Probe)、ARPキャッシュ更新(IPアドレス使用通知)のためのGARPをARP通知(ARP Announcement)と呼んでいます。

PARP

Proxy ARPはその名の通りARP Requestをルータなどが代理応答する機能です。
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (proxyARP.png)
上図の構成を例に説明します。2つのサブネットがルータで接続されています。ホストAはサブネットマスクが24ビットになっており、192.168.1.0/24のネットワークに接続しているつもりです。ホストAから見るとホストBは同じネットワーク上にいます。
この場合に、ホストAがホストBと通信する場合を考えます。
  1. ホストAはホストBのMACアドレスを解決するためにARP Requestをブロードキャストします。
  2. ルータ(およびホストAと同じセグメントの機器)はブロードキャストを受信します。
    • ルータはブロードキャストを転送しないためホストBにARP Requestが到達することはありません。
  3. ホストAはホストBからのARP Replyを受信することはありません。

ルータでProxy ARPが有効な場合、以下のように動作します。
  1. ホストAはホストBのMACアドレスを解決するためにARP Requestをブロードキャストします。
  2. ルータ(およびホストAと同じセグメントの機器)はブロードキャストを受信します。
    • ルータはホストBが別のサブネットに存在し、かつそのサブネットへ到達できることを知っています。
  3. ルータは自身のMACアドレス00-00-00-00-00-feを192.168.1.1のMACアドレスとして返します。
    • 結果的にデフォルトゲートウェイのMACアドレスを返すことになります。

ホストBが送信するARP Request
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
00-00-00-00-00-f1 192.168.1.129 00-00-00-00-00-00 192.168.1.1
ルータが送信するARP Reply
送信元MACアドレス 送信元IPアドレス 宛先MACアドレス 宛先IPアドレス
00-00-00-00-00-fe 192.168.1.1 00-00-00-00-00-f1 192.168.1.129

ProxyARPは他にもNATが使われるケースなどで利用されます。

ARPスプーフィング

ARPスプーフィング(ARP SpoofingまたはARP Cache Poisoning)は嘘のARPフレームを投げることでARPキャッシュを書き換えてしまう攻撃です。ARPは送信元が正当なホストがどうか確認する手段を持たないため、LANにPCをだれでも接続できる環境だと用意にARPキャッシュを書き換えることが可能です。これを利用すると中間者攻撃(Man in the middle)が行えます。
最終更新:2014年04月19日 23:23