メインコンテンツへスキップ
  1. ネットワーク 記事一覧/
  2. IPv4記事一覧/

ARP(Address Resolution Protocol)

目次

ARPとは

ARP(Address Resolution Protocol)は、IPv4アドレスから、同一リンク上の対応するMACアドレスを解決するためのプロトコルです。RFC 826で定義されています。

イーサネット上でIPパケットを送信する際、IPヘッダには宛先IPアドレスが含まれていますが、実際にフレームを届けるにはイーサネットフレームの宛先MACアドレスが必要です。ARPは、IPアドレスをキーとして同一セグメント内にブロードキャストで問い合わせを行い、対応するMACアドレスを取得する役割を担います。

ARPはIPv4専用のプロトコルです。IPv6では同等の機能をICMPv6の一部であるNDP(Neighbor Discovery Protocol)が担っており、ARPは使用されません。

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キャッシュに記録
  1. 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)を設定する。
  2. 同一リンク上の全ホストがこのブロードキャストフレームを受信するが、Target Protocol Addressが自分のIPアドレスと一致するR2のみが応答する。R3はTarget Protocol Addressが自分のIPアドレスと一致しないため、このフレームを破棄する。
  3. R2は、自分のMACアドレスをSender Hardware Addressに設定したARP Replyを、R1に対してユニキャストで送信する(Operation = 2)。
  4. 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 → ブロードキャスト)

ARP Request
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へユニキャスト)

ARP Reply
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.1

Target Protocol Addressが自分(192.168.0.2)のIPアドレスと一致したR2だけが、R1宛てにユニキャストでOpcode reply (2) のARP Replyを返送しています。

各ルータのARPテーブルの比較

R1 show 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   GigabitEthernet1
R2 show arp
R2#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   GigabitEthernet1
R3 show arp
R3#show arp
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.0.3             -   5254.00d9.39cc  ARPA   GigabitEthernet1

R1・R2それぞれのARPテーブルには、自分自身のエントリ(Age -、エージング対象外)に加えて、相手から学習したエントリ(Age 11分経過)が記録されています。一方、ARP Requestを受信したもののTarget Protocol Addressが自分宛てではなかったR3のARPテーブルには、自分自身のエントリしか存在しません。R3はARP Replyを送信していないため、R1・R2にR3のMACアドレスが学習されることもありません。

arp.pcap をダウンロード

ARPキャッシュ(ARPテーブル)

一度解決したIPアドレスとMACアドレスの対応は、ARPキャッシュ(ARPテーブル)としてホストやルータ上に保持されます。これにより、同じ宛先への通信のたびにARP Requestをブロードキャストする必要がなくなります。

ARPキャッシュのエントリには有効期限(エージングタイム)が設定されており、一定時間経過したエントリは自動的に削除されます。これは、MACアドレスの変更(NICの交換など)やホストのIPアドレス変更に追従するための仕組みです。エージングタイムの既定値は機器・OSによって異なり、例えばCisco IOSルータでは既定で4時間(14,400秒)に設定されており、arp timeout コマンドで変更できます。

Cisco IOS XE 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テーブル確認コマンド
Linuxip neigh / arp -n
Windowsarp -a
Cisco IOS XEshow arp
Cisco IOS XRshow arp

Gratuitous ARP

Gratuitous ARP は、送信元と宛先の両方のプロトコルアドレスを自分自身のIPアドレスに設定して送信するARP Requestです。通常のARPのように応答を要求する目的ではなく、以下のような用途で使用されます。

  • IPアドレスの重複検出:起動時に自分のIPアドレスへのGratuitous ARPを送信し、応答があれば同一アドレスを使用する機器が既に存在すると判断できる。
  • ARPキャッシュの更新通知:他のホストに対して、自分のIPアドレスとMACアドレスの対応をARPキャッシュに反映・更新させる。フェイルオーバー(VRRP/HSRPなど)で仮想IPアドレスの担当機器が切り替わった際に、周囲のARPキャッシュを即座に更新するために利用される。

Gratuitous 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.1

Sender 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を判別する点は共通しています。

garp.pcap をダウンロード

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アドレスを取得するために使用されました。

RARPは、IPアドレス以外の情報(デフォルトゲートウェイやDNSサーバーなど)を配布できないという制約があり、現在ではより多くの情報を配布できるBOOTP、およびその拡張であるDHCPに置き換えられています。

セキュリティ上の注意点:ARPスプーフィング

ARPには送信元を認証する仕組みがなく、Requestを受け取っていなくても任意のホストがARP Replyを送信できてしまいます。これを悪用し、偽のARP Replyを送りつけて他ホストのARPキャッシュを不正に書き換える攻撃をARPスプーフィング(ARPポイズニング)と呼びます。攻撃者は、本来別の機器宛てのトラフィックを自分に誘導し、盗聴や中間者攻撃(MITM)に悪用できます。

対策として、スイッチのDynamic ARP Inspection(DAI)機能や、DHCP Snoopingと連携したバインディングテーブルによる正当性検証などが用いられます。

参考

関連記事