ARPとは
ARP(Address Resolution Protocol)は、IPv4アドレスから、同一リンク上の対応するMACアドレスを解決するためのプロトコルです。RFC 826で定義されています。
イーサネット上でIPパケットを送信する際、IPヘッダには宛先IPアドレスが含まれていますが、実際にフレームを届けるにはイーサネットフレームの宛先MACアドレスが必要です。ARPは、IPアドレスをキーとして同一セグメント内にブロードキャストで問い合わせを行い、対応するMACアドレスを取得する役割を担います。
ARPパケットフォーマット
ARPパケットはイーサネットフレームのペイロードとして送信され、EtherType 0x0806 で識別されます。ハードウェアアドレス(MACアドレス、6バイト)とプロトコルアドレス(IPv4アドレス、4バイト)が32ビット境界に揃わないため、後半のアドレス部分は行をまたいで配置されます。
| フィールド名 | サイズ | 説明 |
|---|---|---|
| ハードウェアタイプ (Hardware Type) | 2 バイト | 下位層のアドレス種別。イーサネットの場合は 1。 |
| プロトコルタイプ (Protocol Type) | 2 バイト | 解決対象の上位プロトコル。IPv4の場合は 0x0800。 |
| ハードウェアアドレス長 (HLEN) | 1 バイト | ハードウェアアドレスのバイト長。イーサネットのMACアドレスは 6。 |
| プロトコルアドレス長 (PLEN) | 1 バイト | プロトコルアドレスのバイト長。IPv4アドレスは 4。 |
| オペレーション (Operation) | 2 バイト | メッセージ種別。1 = ARP Request、2 = ARP Reply。 |
| 送信元ハードウェアアドレス (Sender Hardware Address) | 6 バイト | 送信元のMACアドレス。 |
| 送信元プロトコルアドレス (Sender Protocol Address) | 4 バイト | 送信元のIPv4アドレス。 |
| 宛先ハードウェアアドレス (Target Hardware Address) | 6 バイト | 宛先のMACアドレス。Requestの場合は不明なため全て 0。 |
| 宛先プロトコルアドレス (Target Protocol Address) | 4 バイト | 解決したい宛先のIPv4アドレス。 |
ARPの動作
R1(192.168.0.1)がR2(192.168.0.2)のMACアドレスを知りたい場合、以下の流れで解決が行われます。同一リンク上にはR3(192.168.0.3)も存在するものとします。R1・R2・R3はいずれもGi1インターフェースでスイッチSWに接続されています。
sequenceDiagram
participant R1 as R1
192.168.0.1
participant SW as SW
participant R3 as R3
192.168.0.3
participant R2 as R2
192.168.0.2
Note over R1: 192.168.0.2に対応する
MACアドレスが未解決
R1->>SW: ARP Request(1パケット)
宛先MAC: FF:FF:FF:FF:FF:FF
Target Protocol Address: 192.168.0.2
Operation: 1
par SWが全ポートへフラッディング
SW->>R3: ARP Request
and
SW->>R2: ARP Request
end
Note over R3: Target Protocol Addressが
自分のIPと不一致のため破棄
Note over R2: Target Protocol Addressが
自分のIPと一致
R2->>R1: ARP Reply(ユニキャスト)
Sender Hardware Address: R2のMAC
Operation: 2
Note over R1: 192.168.0.2とR2のMACアドレスの
対応をARPキャッシュに記録
- R1は、宛先MACアドレスを
FF:FF:FF:FF:FF:FF(ブロードキャスト)としたARP Requestを送信する。パケット内のTarget Hardware Addressは00:00:00:00:00:00、Target Protocol AddressにはR2のIPアドレス(192.168.0.2)を設定する。 - 同一リンク上の全ホストがこのブロードキャストフレームを受信するが、Target Protocol Addressが自分のIPアドレスと一致するR2のみが応答する。R3はTarget Protocol Addressが自分のIPアドレスと一致しないため、このフレームを破棄する。
- R2は、自分のMACアドレスをSender Hardware Addressに設定したARP Replyを、R1に対してユニキャストで送信する(Operation =
2)。 - R1はARP Replyを受信し、R2のIPアドレスとMACアドレスの対応を自身のARPキャッシュに記録する。
| 方向 | 宛先MACアドレス | Operation |
|---|---|---|
| ARP Request | ブロードキャスト (FF:FF:FF:FF:FF:FF) | 1 |
| ARP Reply | ユニキャスト(Requestの送信元) | 2 |
実機での検証
実際にR1・R2・R3(Cisco IOS XE)を上記のとおり接続し、R1から ping 192.168.0.2 を実行してARPの動作をパケットキャプチャと各ルータのARPテーブルで確認しました。
ARP Requestのキャプチャ(R1 → ブロードキャスト)
Ethernet II, Src: 52:54:00:ce:70:87, Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Type: ARP (0x0806)
Address Resolution Protocol (request)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: request (1)
Sender MAC address: 52:54:00:ce:70:87
Sender IP address: 192.168.0.1
Target MAC address: 00:00:00:00:00:00
Target IP address: 192.168.0.2宛先MACアドレスがブロードキャスト(ff:ff:ff:ff:ff:ff)、Target MAC Addressが 00:00:00:00:00:00、Opcodeが request (1) になっており、前述の説明どおりの内容がR1から送信されていることが確認できます。
ARP Replyのキャプチャ(R2 → R1へユニキャスト)
Ethernet II, Src: 52:54:00:3b:94:2b, Dst: 52:54:00:ce:70:87
Type: ARP (0x0806)
Address Resolution Protocol (reply)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply (2)
Sender MAC address: 52:54:00:3b:94:2b
Sender IP address: 192.168.0.2
Target MAC address: 52:54:00:ce:70:87
Target IP address: 192.168.0.1Target Protocol Addressが自分(192.168.0.2)のIPアドレスと一致したR2だけが、R1宛てにユニキャストでOpcode reply (2) のARP Replyを返送しています。
各ルータのARPテーブルの比較
R1#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.0.1 - 5254.00ce.7087 ARPA GigabitEthernet1
Internet 192.168.0.2 11 5254.003b.942b ARPA GigabitEthernet1R2#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.0.1 11 5254.00ce.7087 ARPA GigabitEthernet1
Internet 192.168.0.2 - 5254.003b.942b ARPA GigabitEthernet1R3#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.0.3 - 5254.00d9.39cc ARPA GigabitEthernet1R1・R2それぞれのARPテーブルには、自分自身のエントリ(Age -、エージング対象外)に加えて、相手から学習したエントリ(Age 11分経過)が記録されています。一方、ARP Requestを受信したもののTarget Protocol Addressが自分宛てではなかったR3のARPテーブルには、自分自身のエントリしか存在しません。R3はARP Replyを送信していないため、R1・R2にR3のMACアドレスが学習されることもありません。
ARPキャッシュ(ARPテーブル)
一度解決したIPアドレスとMACアドレスの対応は、ARPキャッシュ(ARPテーブル)としてホストやルータ上に保持されます。これにより、同じ宛先への通信のたびにARP Requestをブロードキャストする必要がなくなります。
ARPキャッシュのエントリには有効期限(エージングタイム)が設定されており、一定時間経過したエントリは自動的に削除されます。これは、MACアドレスの変更(NICの交換など)やホストのIPアドレス変更に追従するための仕組みです。エージングタイムの既定値は機器・OSによって異なり、例えばCisco IOSルータでは既定で4時間(14,400秒)に設定されており、arp timeout コマンドで変更できます。
R1#show interfaces gigabitEthernet 1 | inc ARP Timeout
ARP type: ARPA, ARP Timeout 04:00:00
R1#arp コマンドでは、対応するMACアドレスを固定的に登録するスタティックエントリも設定できます(例: Cisco IOSの arp <IPアドレス> <MACアドレス> arpa)。この場合、エージングによる自動削除は行われません。| OS/機器 | ARPテーブル確認コマンド |
|---|---|
| Linux | ip neigh / arp -n |
| Windows | arp -a |
| Cisco IOS XE | show arp |
| Cisco IOS XR | show arp |
Gratuitous ARP
Gratuitous ARP は、送信元と宛先の両方のプロトコルアドレスを自分自身のIPアドレスに設定して送信するARP Requestです。通常のARPのように応答を要求する目的ではなく、以下のような用途で使用されます。
- IPアドレスの重複検出:起動時に自分のIPアドレスへのGratuitous ARPを送信し、応答があれば同一アドレスを使用する機器が既に存在すると判断できる。
- ARPキャッシュの更新通知:他のホストに対して、自分のIPアドレスとMACアドレスの対応をARPキャッシュに反映・更新させる。フェイルオーバー(VRRP/HSRPなど)で仮想IPアドレスの担当機器が切り替わった際に、周囲のARPキャッシュを即座に更新するために利用される。
Gratuitous ARPのキャプチャ
Ethernet II, Src: 52:54:00:ce:70:87 (52:54:00:ce:70:87), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Source: 52:54:00:ce:70:87 (52:54:00:ce:70:87)
Type: ARP (0x0806)
[Stream index: 0]
Padding: 000000000000000000000000000000000000
Address Resolution Protocol (reply/gratuitous ARP)
Hardware type: Ethernet (1)
Protocol type: IPv4 (0x0800)
Hardware size: 6
Protocol size: 4
Opcode: reply (2)
[Is gratuitous: True]
Sender MAC address: 52:54:00:ce:70:87 (52:54:00:ce:70:87)
Sender IP address: 192.168.0.1
Target MAC address: Broadcast (ff:ff:ff:ff:ff:ff)
Target IP address: 192.168.0.1Sender IP AddressとTarget IP Addressがどちらも送信元R1自身のIPアドレス(192.168.0.1)になっている点がGratuitous ARPの特徴で、Wiresharkもこれを検出して [Is gratuitous: True] と表示しています。このキャプチャではOpcodeが reply (2)、宛先MACアドレスはブロードキャスト(ff:ff:ff:ff:ff:ff)で送信されていますが、実装によってはOpcodeを request (1) として送信するケースもあり、Sender Protocol AddressとTarget Protocol Addressが一致しているかどうかでGratuitous ARPを判別する点は共通しています。
Proxy ARP
Proxy ARPは、ルータが本来自分宛てではないARP Requestに対して、自分のMACアドレスを応答する機能です。これにより、送信元ホストは宛先が別のセグメントにいるにもかかわらず、あたかも同一セグメント上にいるかのように通信できてしまいます。
設定によっては経路設計を簡略化できる一方、意図しないセグメント越えの通信を許してしまう副作用があるため、現在では明示的に必要な場合を除き無効化されていることが一般的です。なお、Cisco IOSルータではProxy ARPは既定で有効になっており、インターフェース単位で no ip proxy-arp コマンドにより無効化できます。
Reverse ARP(RARP)
Reverse ARP(RARP)は、ARPとは逆にMACアドレスから対応するIPアドレスを解決するためのプロトコルです。ディスクレスワークステーションのように、起動時点で自身のIPアドレスを保持していない機器が、既知の自分のMACアドレスを元にRARPサーバーへ問い合わせ、割り当てられたIPアドレスを取得するために使用されました。
セキュリティ上の注意点:ARPスプーフィング
ARPには送信元を認証する仕組みがなく、Requestを受け取っていなくても任意のホストがARP Replyを送信できてしまいます。これを悪用し、偽のARP Replyを送りつけて他ホストのARPキャッシュを不正に書き換える攻撃をARPスプーフィング(ARPポイズニング)と呼びます。攻撃者は、本来別の機器宛てのトラフィックを自分に誘導し、盗聴や中間者攻撃(MITM)に悪用できます。
対策として、スイッチのDynamic ARP Inspection(DAI)機能や、DHCP Snoopingと連携したバインディングテーブルによる正当性検証などが用いられます。