ARP とは|IP アドレスと MAC アドレスを結ぶ仕組みとルーター越えの違い

  • URLをコピーしました!
目次

はじめに

「同じセグメントの端末とは通信できるのに、別セグメントのサーバーとは通信できない」といった切り分けでは、ARP の動作をどう理解しているかによって確認する箇所が変わります。ARP は IP アドレスと MAC アドレスを結び付けるプロトコルですが、実務で迷いやすいのは「どの IP アドレスに対応する MAC アドレスを調べるのか」という点です。

本記事では 1 つの構成例を使い、同一セグメント宛てとルーター経由の別セグメント宛てで、ARP の解決対象がどう変わるかを比較します。あわせて、ARP テーブルとパケットキャプチャのどこを見ればよいかも整理します。

この記事でわかること
  • ARP が必要になる理由と Request / Reply の基本動作
  • 同一セグメント宛てと別セグメント宛てで変わる ARP の解決対象
  • ARP テーブル・MAC アドレステーブル・ルーティングテーブルの違い
  • Windows の arp -a と Wireshark で確認するポイント
  • GARP・Proxy ARP・IPv6 Neighbor Discovery との関係

結論として、ARP は送信元が経路選択で決めた「次ホップ」の IP アドレスについて、対応する MAC アドレスを調べる仕組みです。同一セグメント宛てでは宛先端末自身、ルーターを経由する別セグメント宛てでは通常、次ホップとなるルーターの MAC アドレスを解決します。どちらの場合も、IP ヘッダーの宛先 IP アドレスは最終的な宛先のまま変わりません。

ARP とは|IP アドレスと MAC アドレスを対応付ける仕組み

ARP(Address Resolution Protocol)は、IPv4 アドレスから、同じリンク上で使う MAC アドレスを求めるためのプロトコルです。RFC 826 で定義されており、Ethernet では EtherType 0x0806 のフレームとして送受信されます。

ARP が必要になる理由

IP パケットを Ethernet で送るには、IP パケットを Ethernet フレームに格納し、フレームの宛先 MAC アドレスを指定する必要があります。スイッチはこの MAC アドレスを見てフレームを転送するため、送信元は IP アドレスとは別に、フレームを渡す相手の MAC アドレスを知っておく必要があります。

一方、IP アドレスと MAC アドレスの間に計算で求められる関係はありません。IP アドレスは手動設定や DHCP で割り当てられ、MAC アドレスは主に NIC ごとの値です。そこで、必要になった時点で同じリンク上へ問い合わせて対応関係を得る仕組みとして、ARP が使われます。

ARP は IP アドレスを MAC アドレスへ置き換える仕組みではありません。IP ヘッダーの宛先 IP アドレスはそのまま残り、ARP で得た MAC アドレスは外側の Ethernet ヘッダーの宛先として使われます。

本記事の構成例と前提

以降の説明では、次の構成例を使います。説明用に作成した構成であり、実機検証の結果ではありません。MAC アドレスには、文書用に予約された範囲(00-00-5e-00-53-xx)を使用しています。

機器インターフェースIP アドレスMAC アドレスデフォルトゲートウェイ
PC-ANIC192.168.10.10/2400-00-5e-00-53-0a192.168.10.1
PC-BNIC192.168.10.20/2400-00-5e-00-53-14192.168.10.1
R1LAN1 側192.168.10.1/2400-00-5e-00-53-01
R1LAN2 側192.168.20.1/2400-00-5e-00-53-02
SV-CNIC192.168.20.30/2400-00-5e-00-53-1e192.168.20.1

物理構成は、PC-A・PC-B・R1 の LAN1 側インターフェースを SW1 に、R1 の LAN2 側インターフェースと SV-C を SW2 に接続した形です。SW1 と SW2 は L2 スイッチとし、それぞれ 192.168.10.0/24 と 192.168.20.0/24 のブロードキャストドメインを構成します。

  • 通常の Ethernet / IPv4 のユニキャスト通信を対象とする。
  • NAT、トンネル、Proxy ARP は使用しない。
  • PC-A のルーティングテーブルは、直接接続の 192.168.10.0/24 と、次ホップを 192.168.10.1 とするデフォルトルートのみとする。

ARP Request と ARP Reply の基本動作

PC-A が PC-B(192.168.10.20)へ初めて通信する場面を例に、ARP の基本的なやり取りを示します。

  1. PC-A は ARP キャッシュに 192.168.10.20 のエントリがないため、「192.168.10.20 の MAC アドレスは何か」を問い合わせる ARP Request を作成します。送信元の欄には、PC-A 自身の IP アドレスと MAC アドレスを入れます。
  2. ARP Request は宛先 MAC アドレスを ff-ff-ff-ff-ff-ff とするブロードキャストで送信され、SW1 に接続された同じセグメントの機器(PC-B と R1 の LAN1 側)へ届きます。
  3. 問い合わせ対象の IP アドレスを持つ PC-B だけが ARP Reply を返します。Reply には PC-B の MAC アドレス(00-00-5e-00-53-14)が入り、通常は PC-A 宛てのユニキャストで送られます。
  4. PC-A は Reply の内容を ARP キャッシュに登録し、PC-B の MAC アドレスを宛先とした Ethernet フレームで IP パケットを送信します。

RFC 826 の受信処理では、Request を受け取った PC-B も、送信元である PC-A の IP アドレスと MAC アドレスの対応を自分のテーブルへ登録します。このため、PC-B が PC-A へ返信する際には、改めて ARP Request を送らずに済む場合があります。

ここで示したのは基本形です。RFC 826 自体も、キャッシュの有効性を確認する際に、Request をブロードキャストではなくテーブル上の MAC アドレスへ直接送る方法に触れています。また、RFC 5227 は Reply をブロードキャストで送ることも許容しています。

参考: RFC 5227 — IPv4 Address Conflict Detection
“it is also acceptable to deliver ARP Replies using broadcast”
(ARP Reply をブロードキャストで送ることも許容される)
https://www.rfc-editor.org/rfc/rfc5227

実際のキャプチャで Request がユニキャストで見えたり、Reply がブロードキャストで見えたりしても、それだけで異常とは判断できません。

ARP キャッシュと Request が発生する条件

ARP で得た対応関係は ARP キャッシュ(ARP テーブル)に保持され、以降の送信ではキャッシュが参照されます。キャッシュに有効なエントリがあれば、通信のたびに ARP Request が送られるわけではありません。

エントリの保持時間や、期限切れ前の再確認の方法は、OS や製品の実装によって異なります。RFC 826 も、テーブルのエージングやタイムアウトの実装はプロトコルの範囲外としています。特定の秒数を前提にせず、対象機器の仕様で確認することをおすすめします。

ARP で解決する IP アドレスの決まり方|同一セグメントとルーター越えの違い

ARP で MAC アドレスを調べる対象は、最終的な宛先 IP アドレスではなく、経路選択で決まった次ホップの IP アドレスです。この点が、同一セグメント宛てと別セグメント宛てで結果が変わる理由です。

経路選択で次ホップと送信インターフェースを決める

送信元は IP パケットを送る前に、自身のルーティングテーブルを参照し、宛先 IP アドレスに一致する経路を選びます。その結果、パケットを渡す相手(次ホップ)と送信インターフェースが決まり、送信インターフェースが Ethernet であれば、次ホップの IP アドレスを ARP で解決します。

参考: RFC 826 — An Ethernet Address Resolution Protocol
“routing determines the protocol address of the next hop for the packet”
(経路制御によって、パケットの次ホップのプロトコルアドレスが決まる)
https://www.rfc-editor.org/rfc/rfc826

宛先が直接接続のセグメント内にあれば、次ホップは宛先自身です。宛先が別セグメントにある場合は、一致した経路が示すルーターが次ホップになります。別セグメント宛ての次ホップが、常にデフォルトゲートウェイになるとは限りません。宛先に一致する個別の静的ルートがあれば、そのルートの次ホップが ARP の解決対象になります。本記事の構成例では PC-A に個別ルートがないため、デフォルトルートの次ホップである R1(192.168.10.1)が使われます。

宛先が同一セグメントかどうかは、IP アドレスとサブネットマスクから判断します。ネットワークアドレスの求め方は、サブネットマスクの計算方法で解説しています。

ケース 1: 同一セグメントの PC-B へ通信する場合

PC-A(192.168.10.10/24)から PC-B(192.168.10.20)への通信では、宛先が PC-A と同じ 192.168.10.0/24 に含まれるため、直接接続の経路に一致します。次ホップは PC-B 自身となり、PC-A は 192.168.10.20 を ARP で解決します。

送信される Ethernet フレームの宛先 MAC アドレスは PC-B の 00-00-5e-00-53-14、IP ヘッダーの宛先 IP アドレスは 192.168.10.20 です。この通信に R1 は関与しません。

ケース 2: ルーターを経由して SV-C へ通信する場合

PC-A から SV-C(192.168.20.30)への通信では、宛先が 192.168.10.0/24 に含まれないため、デフォルトルートに一致します。次ホップは R1 の LAN1 側(192.168.10.1)です。

このとき PC-A が ARP で調べるのは SV-C ではなく、次ホップである R1(192.168.10.1)の MAC アドレスです。PC-A が送るフレームは、宛先 MAC アドレスが R1 の 00-00-5e-00-53-01、IP ヘッダーの宛先 IP アドレスが SV-C の 192.168.20.30 という組み合わせになります。

フレームを受け取った R1 は、IP ヘッダーの宛先 192.168.20.30 をもとに自身のルーティングテーブルを参照し、LAN2 側の直接接続セグメントへ転送すると判断します。そこで R1 が 192.168.20.30 を ARP で解決し、送信元 MAC アドレスを R1 の LAN2 側(00-00-5e-00-53-02)、宛先 MAC アドレスを SV-C(00-00-5e-00-53-1e)とした新しい Ethernet フレームで送り出します。Ethernet ヘッダーはルーターを通過するたびに作り直されますが、宛先 IP アドレスは変わりません。

SV-C からの戻りの通信にも同じ考え方が当てはまり、SV-C は自身のデフォルトゲートウェイである 192.168.20.1 を ARP で解決します。

比較表と図で見る ARP の解決対象

項目ケース 1: PC-A → PC-Bケース 2: PC-A → SV-C
最終的な宛先 IP アドレス192.168.10.20192.168.20.30
一致する経路直接接続(192.168.10.0/24)デフォルトルート(0.0.0.0/0)
次ホップPC-B 自身R1 LAN1 側(192.168.10.1)
PC-A が ARP で解決する IP アドレス192.168.10.20192.168.10.1
PC-A が送るフレームの宛先 MAC アドレス00-00-5e-00-53-14(PC-B)00-00-5e-00-53-01(R1 LAN1 側)
IP ヘッダーの宛先 IP アドレス192.168.10.20192.168.20.30(R1 通過後も同じ)
ルーターが行う ARPなしR1 が 192.168.20.30 を解決

「ARP で解決する IP アドレス」と「IP ヘッダーの宛先 IP アドレス」が一致するのは、ケース 1 だけです。ケース 2 で PC-A の ARP キャッシュに 192.168.20.30 のエントリが作られないのは、正常な結果です。

ARP ブロードキャストはルーターを越えない

ARP Request のブロードキャストは、同じブロードキャストドメイン(同じセグメントや VLAN)の範囲にだけ届きます。ルーターは通常、ブロードキャストフレームを別のインターフェースへ転送しないため、PC-A の ARP Request が SW2 側の SV-C に届くことはありません。

このため、Proxy ARP などの特別な構成を除き、送信元が別セグメントの宛先を直接 ARP で解決することはありません。ルーターが区間ごとに ARP を行い、フレームを作り直して中継します。VLAN によるブロードキャストドメインの分割は、VLAN 設計の基礎で解説しています。

ARP テーブル・MAC アドレステーブル・ルーティングテーブルの違い

通信の確認では 3 つのテーブルを見ることが多いですが、保持する情報と使われる場面は異なります。

テーブル主に保持する機器対応付ける内容使われる場面
ARP テーブルIPv4 で通信する端末、ルーター、L3 スイッチなどIPv4 アドレスと MAC アドレス(インターフェースごと)次ホップ宛てフレームの宛先 MAC アドレスを決める
MAC アドレステーブルL2 スイッチMAC アドレスと接続ポート(VLAN ごと)受信したフレームを転送するポートを決める
ルーティングテーブル端末、ルーター、L3 スイッチ宛先ネットワークと次ホップ・送信インターフェースパケットの次ホップを決める

送信側の処理順で見ると、ルーティングテーブルで次ホップを決め、ARP テーブルで次ホップの MAC アドレスを得て、経路上の L2 スイッチが MAC アドレステーブルでフレームを転送します。L2 スイッチは IP アドレスを見てフレームを転送しないため、ARP テーブルがなくても中継できます。なお、管理用 IP アドレスを持つスイッチは、管理通信のために ARP テーブルを持ちます。

ARP を確認できても通信の正常性は保証されない

ARP テーブルに次ホップのエントリがあることは、同じセグメント内で次ホップの MAC アドレスを解決できたことを示すにとどまります。ケース 2 で PC-A に R1 のエントリがあっても、次の事項は別に確認が必要です。

  • R1 に 192.168.20.0/24 への経路があり、SV-C の MAC アドレスを解決できていること
  • SV-C から PC-A への戻りの経路があること
  • 経路上のフィルタリングやファイアウォールで通信が許可されていること
  • SV-C のアプリケーションが対象ポートで待ち受け、正常に応答していること

また、エントリが存在していても、機器交換などで相手の MAC アドレスが変わった直後は、古い情報が残っている可能性があります。

ARP の確認方法|arp -a と Wireshark で見るポイント

ここでは、Windows の arp -a と Wireshark の表示フィルター arp を使い、構成例のケース 2 を確認する場合の見方を説明します。掲載する出力とキャプチャの内容は説明用に作成した例であり、実機で取得したものではありません。

Windows の arp -a で ARP テーブルを確認する

arp -a は、現在の ARP キャッシュのエントリを表示するコマンドです。複数のネットワークインターフェースがある場合は、インターフェースごとに分けて表示されます。

参考: Microsoft Learn — arp
“If multiple network interfaces use ARP, entries for each interface are displayed.”
(複数のネットワークインターフェースで ARP を使用している場合、インターフェースごとのエントリが表示される)
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/arp

arp -a

特定のインターフェースに絞る場合は、-N にそのインターフェースの IP アドレスを指定します。Microsoft Learn では、このパラメーターは大文字と小文字を区別すると説明されています。

arp -a -N 192.168.10.10

PC-A で SV-C と通信した後の表示例は、次のとおりです。

Interface: 192.168.10.10 --- 0xb
  Internet Address      Physical Address      Type
  192.168.10.1          00-00-5e-00-53-01     dynamic
  192.168.10.20         00-00-5e-00-53-14     dynamic
  192.168.10.255        ff-ff-ff-ff-ff-ff     static

この表示例で確認するポイントは、次の 3 点です。

  • Interface 行の IP アドレスが、SV-C への通信に使うインターフェース(192.168.10.10)であること
  • 次ホップの 192.168.10.1 に、R1 LAN1 側の MAC アドレス 00-00-5e-00-53-01 が対応付けられていること
  • 最終的な宛先である 192.168.20.30 のエントリがないこと

Type 列の dynamic は ARP で学習したエントリ、static は手動で追加したエントリや、ブロードキャストアドレスなど OS が固定で保持するエントリを示します。インターフェース番号や表示されるエントリは環境によって異なり、日本語版の Windows では見出しや種類が日本語で表示されます。

arp -d でキャッシュを削除すると Request を観測しやすくなりますが、削除直後は再解決が完了するまで通信へ影響が出る場合があります。通常の確認では、表示による確認にとどめることをおすすめします。

Wireshark の表示フィルター arp で ARP のやり取りを確認する

Wireshark では、表示フィルターに arp を指定すると、ARP のパケットだけを表示できます。

arp

参考: Wireshark — Display Filter Reference: Address Resolution Protocol
“Protocol field name: arp”
(プロトコルのフィールド名は arp)
https://www.wireshark.org/docs/dfref/a/arp.html

ケース 2 で R1 とのやり取りだけに絞る場合は、ARP の送信元 IP アドレスまたはターゲット IP アドレスが 192.168.10.1 のパケットを指定します。

arp.src.proto_ipv4 == 192.168.10.1 or arp.dst.proto_ipv4 == 192.168.10.1

絞り込んだパケットは、パケット詳細の Address Resolution Protocol と Ethernet II の各フィールドで確認します。Request と Reply は arp.opcode の値(1 が Request、2 が Reply)で区別できます。ケース 2 の表示例は次のとおりです。

確認項目フィールド名ケース 2 の Requestケース 2 の Reply
種別arp.opcode1(Request)2(Reply)
送信元 MAC アドレスarp.src.hw_mac00:00:5e:00:53:0a(PC-A)00:00:5e:00:53:01(R1)
送信元 IP アドレスarp.src.proto_ipv4192.168.10.10192.168.10.1
ターゲット MAC アドレスarp.dst.hw_mac未知のため意味を持たない(実装により 00:00:00:00:00:00 など)00:00:5e:00:53:0a(PC-A)
ターゲット IP アドレスarp.dst.proto_ipv4192.168.10.1192.168.10.10
フレームの宛先 MAC アドレスeth.dstff:ff:ff:ff:ff:ff00:00:5e:00:53:0a

Request のターゲット IP アドレス(Target IP address)が、最終的な宛先の 192.168.20.30 ではなく 192.168.10.1 になっていることが、ケース 2 の解決対象を確かめる直接的なポイントです。Reply の送信元 MAC アドレスが arp -a の表示と一致していれば、ARP テーブルとキャプチャの情報がそろっていることになります。Info 列には、Request が「Who has 192.168.10.1? Tell 192.168.10.10」、Reply が「192.168.10.1 is at 00:00:5e:00:53:01」のような形式で表示されます。

キャプチャに ARP が現れない場合もあります。PC-A の ARP キャッシュに有効なエントリがあれば、新しい Request は送られません。また、Reply は通常ユニキャストのため、PC-A 以外の端末でキャプチャするとスイッチの転送先から外れ、Reply が見えないことがあります。確認する際は、送信元の PC-A 上か、PC-A を接続したポートのミラーでキャプチャすることをおすすめします。表示フィルターの組み合わせ方は、Wireshark のフィルタ書き方と複数条件の使い分けで解説しています。

関連する仕組み|GARP・Proxy ARP・IPv6 Neighbor Discovery

ARP の基本動作と区別しておきたい仕組みを短く紹介します。いずれも本記事の構成例では使用していません。

Gratuitous ARP(GARP)

他の機器から問い合わせを受けていない状態で、機器が自分の IP アドレスと MAC アドレスの対応を同じリンクへ通知する ARP です。IP アドレスの設定時や冗長構成の切り替え時に、周囲の ARP キャッシュを更新する目的で使われます。RFC 5227 はアドレス重複を確認する ARP Probe と使用開始を通知する ARP Announcement を定義していますが、製品が送る GARP の形式やタイミングは実装によって異なります。冗長構成との関係は、FortiGate VRRP の設定手順でも触れています。

Proxy ARP

ルーターなどが、自分以外の IP アドレスを対象とする ARP Request に、自分の MAC アドレスで応答する仕組みです。これを使う構成では、送信元が別セグメントの宛先 IP アドレスを ARP で解決する場合があるため、本記事の比較表の結果は当てはまりません。

IPv6 の Neighbor Discovery

IPv6 では ARP を使わず、RFC 4861 で定義された Neighbor Discovery の Neighbor Solicitation と Neighbor Advertisement(ICMPv6)でリンク層アドレスを解決します。問い合わせにはブロードキャストではなくマルチキャストが使われます。

まとめ

ARP は、経路選択で決まった次ホップの IP アドレスから、Ethernet フレームの宛先 MAC アドレスを求める仕組みです。同一セグメント宛てとルーター越えの通信を比べると、ARP の解決対象と IP ヘッダーの宛先の違いが明確になります。

  • ARP は IPv4 アドレスから同じリンク上の MAC アドレスを求める。
  • 解決対象は最終的な宛先ではなく、経路選択で決まった次ホップ
  • 別セグメント宛てでは通常、次ホップのルーターの MAC アドレスを解決する。
  • IP ヘッダーの宛先 IP アドレスはルーターを経由しても変わらない。
  • キャッシュに有効なエントリがあれば ARP Request は送られない。
  • ARP の解決は、宛先までの通信やアプリケーションの正常性を示さない。
  • arp -a では次ホップのエントリ、Wireshark ではターゲット IP を確認

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次