GARP

読み:がーぷ / 英語表記:Gratuitous ARP

自分のIPv4アドレスとMACアドレスの対応を、相手の問い合わせを待たずにブロードキャストで知らせるARPの使い方。機器の切り替えに伴うARPキャッシュの更新やIPアドレスの重複検出に利用される。

イマシルちゃんの解説

同じIPアドレスを新しい機器へ引き継いでも、通信相手には古いMACアドレスが記録されていることがあるんだ。
そのままでは前の機器へ送ろうとして、通信が届かなくなることがあるよ。
GARPは「このIPアドレスを使う機器のMACアドレスはこれだよ」と、自分から周囲に知らせるARPの使い方なんだ。
同じLANへ一斉に届けるブロードキャストで送り、相手が持つアドレスの対応表であるARPキャッシュの更新を促すよ。
相手から問い合わせてもらうのを待たずに、新しい届け先を伝えられるんだ。

より深い解説

相手を調べるのではなく自分の対応を知らせる

通常のARPによるアドレス解決では、通信先のIPv4アドレスに対応するMACアドレスを問い合わせる。これに対してGARPは、機器が自分のIPv4アドレスとMACアドレスの対応を自発的に通知する。インタフェースの有効化や、冗長化した機器の切り替えなどで使われる。

受信した機器はARPメッセージに含まれる送信元のアドレス情報を参照する。RFC 826の受信処理では、送信元のIPアドレスが既に対応表に登録されていれば、そのMACアドレスを更新する。この処理は自分宛ての要求かどうかの判定より先に行われるため、他の機器にも自分の対応を伝えられる。

利点は、通信相手による再問い合わせや古い登録の期限切れを待たずに、アドレスの対応を更新できることである。 通知が届く範囲は同じブロードキャストドメインであり、通常のルータによるIP転送で別のネットワークまで運ばれるものではない。

どのアドレスを入れて送るか

RFC 5227は、自分のアドレスの使用を知らせるARP要求をARP Announcementと呼ぶ。送信元IPアドレスと対象IPアドレスの両方に、通知する同じIPv4アドレスを入れることが特徴である。

例えばIPv4アドレス192.0.2.50とMACアドレス02-00-00-00-00-0Bを使う機器が通知する場合、主な値は次のようになる。この表はRFC 5227の要求形式の例であり、他のGARP実装ですべての値が同じになるとは限らない。

フィールドこの例の値
イーサネットの宛先MACアドレスFF-FF-FF-FF-FF-FF
イーサネットの送信元MACアドレス02-00-00-00-00-0B
ARPのOpcode1(ARP要求)
ARPの送信元MACアドレス(SHA)02-00-00-00-00-0B
ARPの送信元IPアドレス(SPA)192.0.2.50
ARPの対象MACアドレス(THA)00-00-00-00-00-00
ARPの対象IPアドレス(TPA)192.0.2.50

SHAはSender Hardware Address、SPAはSender Protocol Addressであり、通知する側のMACアドレスとIPv4アドレスを表す。THAはTarget Hardware Address、TPAはTarget Protocol Addressであり、要求の対象を表す。この形式のTHAは受信処理で使われず、0で埋めることが推奨されている。

自分のIPアドレスを対象にしていても、イーサネットの宛先はブロードキャストである。 自分だけに送り返しているわけではない。また、表のIPアドレスはARPメッセージ内の値である。ARPはIPパケットに包まずイーサネットフレームで直接運ばれる。

GARPにはARP応答形式を使う実装もあるが、RFC 5227の通知は既存実装との互換性を考慮してARP要求形式を使う。通知自体は返答を前提としない。ただしアドレスが重複している場合などに応答や別のARP通知が届くことはあるため、「必ず応答がない」とは考えない。

機器を切り替えた後の通信を追う

サーバAが使っていた192.0.2.50を、Aの停止後にサーバBへ引き継ぐ例を考える。ここでは両者のMACアドレスが異なり、それぞれMAC-A、MAC-Bとする。端末Pには「192.0.2.50 → MAC-A」という古い対応が残っている。

Bが同じIPアドレスで動き始めただけでは、Pの記録が自動的にMAC-Bへ変わるとは限らない。Pが古い対応を使うと、フレームはMAC-A宛てに送られてしまう。そこでBがGARPを送り、PのARPキャッシュの更新を促す。

次の図は、同じLAN上のPがGARPを受け入れて既存の登録を更新する例である。スイッチによる中継と他の端末への配信は省略している。

上から下へ順に通信が進む。
新サーバB
端末P
  1. Aは停止済み
    Bが192.0.2.50を引き継ぐ
  2. 古い対応が残る
    192.0.2.50 → MAC-A
  3. BからPへ。
    GARPを送信
    ブロードキャスト
    192.0.2.50 → MAC-B
  4. ARPキャッシュを更新
    192.0.2.50 → MAC-B
  5. PからBへ。
    IPv4のデータを送信
    フレームの宛先はMAC-B

GARPが変更するのは周囲の機器が持つアドレスの対応であり、Pの宛先IPアドレスを変更するわけではない。また、どのサーバを稼働させるかの決定や障害の検知は、冗長化を管理する別の機能が担当する。GARP自体が機器の切り替えを決めるプロトコルではない。

二つの対応表を区別する

GARPの送信には、端末やルータが持つARPキャッシュの更新だけでなく、L2スイッチのMACアドレステーブルの学習を促す働きもある。ただし両者は記録内容も、学習に使う情報も異なる。

対応表記録する対応
ARPキャッシュIPv4アドレス → MACアドレス
MACアドレステーブルMACアドレス → スイッチのポート(VLANごと)

端末やルータはARPメッセージに含まれる送信元のIPアドレスとMACアドレスを参照する。一方、L2スイッチは受信したイーサネットフレームの送信元MACアドレスと受信ポートから接続位置を学ぶ。通常のMAC学習ではARPの内容を読んでIPアドレスとの対応を登録するわけではない。

VRRPのように仮想IPアドレスと仮想MACアドレスを引き継ぐ構成では、端末が使う「IPアドレス → MACアドレス」の対応は変わらない。それでも、スイッチにはそのMACアドレスへ到達する新しいポートを学習させる必要がある。GARPを仮想MACアドレスを送信元とするフレームで送れば、この学習にも利用できる。

VRRPでは、仮想MACアドレスを送信元とするVRRP広告もMAC学習に使われる。仮想ルータの役割や切り替え手順はVRRPの記事で扱う。標準での位置付けはRFC 9568の2.4節・3節を参照できる。

重複の検出と使用開始前の確認

別の機器から届いたARPに、自分と同じ送信元IPアドレスと、自分とは異なる送信元MACアドレスが入っていれば、IPアドレスの重複を検出できる。GARPはこのような検出のきっかけにもなる。ただし、GARPを一度送って返事がなかっただけで重複がないと保証できるわけではない。

RFC 5227では、アドレスを使い始める前の確認にARP Probeを使う。これは送信元IPアドレスを0.0.0.0とし、対象IPアドレスに使用候補のアドレスを入れたARP要求である。まだ使用を確定していないアドレスを自分のものとして通知し、周囲のARPキャッシュを書き換えてしまうことを避ける。

これに対し、使用を開始することを知らせるARP Announcementでは、送信元と対象に同じIPv4アドレスを入れる。使用前に確かめる処理と、使用することを周囲に知らせる処理を分けて理解する。 確認・通知・使用中の重複検出の関係はRFC 5227の2節で定められている。

利用するときの制約

注意:GARPを送れば、すべての機器の記録が必ず更新されるわけではない。 受信側の実装や設定によっては通知を無視したり、既存の項目だけを更新したりする。静的に登録した対応がある場合も、GARPだけで変更できると考えず設定を確認する。

切り替え後に通信できない場合は、通知が同じVLAN内へ届いているか、相手のARPキャッシュが新しいMACアドレスになっているか、スイッチが正しいポートを学習しているかを区別して調べる。例えばCiscoのACI技術資料でも、冗長化機器の切り替えでMACアドレスが変わる構成では、GARPによる更新に必要なARPの配信を考慮している。

また、ARPには通知内容の正当性を認証する仕組みがない。偽の対応を知らせるARPスプーフィングとの関係や対策はARPの記事で扱う。IPv6ではARPを使わず、近隣探索プロトコルの近隣広告などが対応する役割を担う。

この用語が出てくる記事

↑