はじめに
ネットワークエンジニアならば深く理解しておきたいARPについて解説します。
ARPとは
IPアドレスからMACアドレスを求めるために使用されるプロトコルです。
ネットワーク用語辞典の説明がわかりやすいので抜粋します。
https://atmarkit.itmedia.co.jp/aig/06network/arp.html
TCP/IPネットワークでイーサネットフレームを送信するには、あて先のMACアドレスを指定する必要がある。ARPは、MACアドレスをあて先のIPアドレスから求めるためのプロトコル。
あて先MACアドレスが分からない場合、送信元はIPアドレスのMACアドレスを問い合わせるARPリクエストをブロードキャストで送信する。このリクエストに対して、指定されたIPアドレスを持っていないマシンは応答しないが、持っているマシンはMACアドレスを通知するARPリプライを返す。これにより、送信元はMACアドレスを入手でき、イーサネットフレームを作成できるようになる。
取得したMACアドレスは、IPアドレスとひも付けされてARPテーブルに保存される。以降のデータ通信は、ARPテーブルを参照して送信される。ただし、MACアドレスに割り振られたIPアドレスは変更されることがある。そこで、ARPテーブルでは保存する期間をARPキャッシュとして指定し、一定時間が経つとクリアして再度ARPリクエストを求める。ARPキャッシュのクリア時間はOSなどによって異なる
赤字で強調した箇所は、proxy-arpを理解するため前提となります。指定されたIPアドレスを持っていない場合でも、ルーティングテーブルにそのIPアドレス宛の経路情報があれば、ARPリプライを返す機能がproxy-arpのためです。
構成図
今回は以下の構成図で検証を行いたいと思います。
【基本情報】
- csr1000v-0 Gi1:192.168.0.1
- csr1000v-1 Gi1:192.168.0.254、Gi2:172.16.0.254
- csr1000v-2 Gi2:172.16.0.1
- Proxy-ARPは全てのI/Fで有効化
確認
各機器でARPテーブルを確認すると、自身のI/FのIPアドレス以外のエントリーがあることを確認することができます。動的に学習した場合は、(min)の箇所に経過時間が表示されます。このエントリーを使用しない場合は、一定時間経過すると、ARPテーブルから削除されます。
GARPとは
IPアドレスの重複を検出したり、同一セグメントのARPキャッシュを更新したりすることができるARPです。こちらをご参照ください。
構成図
今回は以下の構成図で検証を行いたいと思います。
パケットキャプチャを取ることでGARPがどのように流れているか確認したいと思います。
csr1000v-3,csr1000v-4でHSRPを設定しました。
csr1000v-4がPriority、preemptは有効化しています。
csr1000v-3:192.168.0.252
csr1000v-4:192.168.0.253
VIP:192.168.0.254
alpine-0:192.168.0.1
とします。
確認
ここで、csr1000v-3でpriorityをcsr1000v-4よりも高くします
その後、csr1000v-4はActiveからStandbyに変化します。
この時のパケットキャプチャが以下となります。
GARPが送信されていることが確認できました。
1つずつ見ていきましょう。
csr1000v-3とcsr1000v-4からGARPが送られていることが確認できました。
予想外なのは、Real-IPから送られていないことです。何故でしょうか。
わかりませんでした。すみません。
また、予想外のARPも確認できました。
検索したところ、次のような解説が出てきました。初めて知りました。
※ 01-00-0c-cd-cd-cd は、Cisco でDummy Multicast と呼ばれているマルチキャストアドレスです。
Spanning Tree Protocol のUplinkFast でも、Uplink の切り替わり時に送信するマルチキャストパケットに用いられています。
RARPとは
RARP(Reverse Address Resolution Protocol)は、IPネットワークにおいて、MACアドレスからIPアドレスを取得するためのプロトコルです。RARPは、IPアドレスを持たないネットワーク機器が、自分自身のMACアドレスからIPアドレスを取得するために使用されます。RARPは、ブロードキャストを使用して、ネットワーク上のすべてのホストに対してMACアドレスをIPアドレスにマッピングするように要求します。RARPサーバーは、自分自身のIPアドレスを持つホストからの要求に応答し、MACアドレスをIPアドレスにマッピングします。
要するに、送信元がAというMACアドレスを要求してきて、RARPサーバがそのMACアドレスの情報を保持している場合、そのMACアドレスに紐づいているIPアドレスを送信元に対して返します。そうすることで、送信元の端末がIPアドレスを取得することが可能です。
調べたところ、過去に情報処理技術者試験で出題されているようです。
電源オフ時にIPアドレスを保持することができない装置が,電源オン時に自装置のMACアドレスから自装置に割り当てられているIPアドレスを知るために用いるデータリンク層のプロトコルで,ブロードキャストを利用するものはどれか。
ネットワークスペシャリスト平成21年秋期 午前Ⅱ 問11
Proxy-ARPとは
Proxy-ARP とは、自分宛ではない ARP 要求に対し、ルートを知っている IP であれば、その IP の端末の代わりに ARP 応答を返す機能です。
ARP 応答を受け取った端末は、Proxy-ARP で ARP 応答した端末にパケットを送ってきますが、その端末はルートを知っているので、ルーティングによりさらにパケットを転送します。
検証
proxy-arpを無効にすることで、何がどう変化するのか、実際に検証してみました。
構成図
今回は以下の構成図で検証を行いたいと思います。
【基本情報】
- csr1000v-0 Gi1:192.168.0.1
- csr1000v-1 Gi1:192.168.0.254、Gi2:172.16.0.254
- csr1000v-2 Gi2:172.16.0.1
- PROXY-ARPは全てのI/Fで有効化
検証に伴う準備
- csr1000v-1(真ん中のルータ)で双方向NATを有効化
- csr1000v-0(左側)~csr1000v-1(真ん中のルータ)を内部ネットワーク、csr1000v-2(右側)~csr1000v-1(真ん中のルータ)を外部ネットワークとします。つまり、interface Gi1でip nat inside、interface Gi2でip nat outsideを投入しています。
- inside globalは172.16.0.200、outside localは192.168.0.200とします。
- csr1000v-1(真ん中のルータ)でproxy-arpを無効化
①内部ネットワーク、外部ネットワークを定義
②内部から着信する送信元IPアドレスの変換を実施
③外部から着信する送信元IPアドレスの変換を実施
ここで、少し本題とは逸れますが、外部ネットワークにおけるNATの注意事項を説明します。
外部ネットワークの場合、NAT変換されるはルーティングされたあとになります。
そのため、csr1000v-2(右側)のルータから172.16.0.200(inside global)に対して、PINGを実行すると、csr1000v-0からの戻りのパケット(宛先が192.168.0.200(outside local))がルーティングテーブルに従い、interface Gi1、つまりcsr1000v-0に接続しているI/Fから出力されてしまいます。TTLが0になったらパケットが破棄されますが、それまではループすることになり、もちろんPINGは失敗します。
そこで、no-alias add-routeを投入することで、ルーティングテーブルに192.168.0.200の静的ルーティング情報が挿入されます。
下の図にある「S」と表記がある箇所が、このコマンドによる静的ルートとなります。
via 172.16.0.1となっているので、再帰的に「C 172.16.0.0/24」を参照する結果、interface Gi2、つまりcsr1000v-2(右側のルータ)に接続するI/Fからパケットを送ることになります。これにより、送信元のcsr1000v-2へパケットを送ることができます。PINGも成功します。
④Proxy-ARPを無効化
csr1000v-2(右側のルータ)からpingを実施
試しにinside globalなIPアドレスである172.16.0.200に対してPINGを行います。
すると、PINGが失敗します。
この時、172.16.0.200へのARP要求は無事に解決されていることが確認できます。
csr1000v-1(真ん中のルータ)でNAT変換の状態を確認すると、問題なく変換されていることが確認できました。Protocolの列でicmpと表示されている箇所が該当します。
ここで、csr1000v-0(左側のルータ)のARPテーブルを確認すると、なんということでしょう。192.168.0.200(outside local)に対するARP要求が失敗しており、Incompleteを表示されていることが確認できました。これは、csr1000v-1(真ん中のルータ)のinterface Gi1でproxy-arpを無効化したことにより、192.168.0.200(outside local)宛のARP要求を192.168.0.254のIPアドレスを持つinterface Gi1から応答することができないためです。
Proxy-ARPを再度有効化
csr1000v-1のinterface Gi1にてProxy-ARPを有効化します。
そして、もう一度csr1000v-2(右側のルータ)から172.16.0.200(inside global)宛にPINGを実行すると、PINGが成功します。
csr1000v-0(左側のルータ)で再度、ARPテーブルを確認すると、Incompleteとなっていた箇所にMACアドレスが格納されていることが確認できました。
Local Proxy-ARPとは
同じセグメントのホスト同士が直接通信できないネットワークで、ホスト同士の通信を可能にするために使用されます。Local Proxy-ARPを設定したインタフェース自身が所属するセグメントのARPリクエストを受信した時に、自身のMACアドレスを使用して代理応答をします。
構成図
Local Proxy-ARPでは次の構成図のNWで検証したいと思います。
【基本情報】
- csr1000v-5 Gi1:192.168.0.1
- csr1000v-6 Gi1:192.168.0.2
- csr1000v-7 Gi1:192.168.0.254
- csr1000v-7のGi1でip local proxy-arpコマンドを投入
ローカルProxy-ARPを有効化
確認
csr1000v-5から192.168.0.2にPINGした後にARPテーブルの状態を確認します(※)。
すると、図のようにMACアドレスが5254.000a1c78になりました。
このMACアドレスがどのルータのI/FのMACアドレスなのか確認すると、csr1000v-7のI/FのMACアドレスでした。
csr1000v-5は一度csr1000v-7へパケットを転送し、その後、csr1000v-6へパケットを送っている構図となります。不思議ですねえ。
※補足
csr1000v-5からping 192.168.0.2を行うと、普通にcsr1000v-6のI/FのMACアドレスが学習されます。そのため、ARPリクエストが全て失敗するよう、csr1000v-6のI/FでACLで全てのパケットを拒否する設定を入れた上で、csr1000v-5からping 192.168.0.2を行います。pingは失敗しますが、ARPテーブルを見るとcsr1000v-7のI/FのMACアドレスで学習されていることが確認できます。今回は、ローカルProxy-ARPの機能を確認するために、わざとひと手間加えています。
参考
【図解】RARPとは?ネットワーク初心者向けにわかりやすく1分で解説 | ビズドットオンライン (it-biz.online)
【図解】Proxy(プロキシ)-ARPの仕組みと設定(cisco/fortigate)、ローカルProxy-ARP | SEの道標 (nesuke.com)
コメント