👏

HSRP切替時のARP/MACアドレステーブル動作実験

2021/03/14に公開

ネットワークエンジニアとして日々HSRPやVRRPを当たり前のように使っていますが、切替わり時のARP/MACアドレステーブル周りの動作理解が曖昧なので、Cisco CSR1000vへHSRP設定を行って実験してみました。

1. NW構成

CiscoのCML Personal 2.1を使って、同一セグメント内に4台の機器を配置し、csr2~csr3間でHSRPを組みました。csr1はARPテーブル、iosvl2はMACアドレステーブル確認用です。

ホスト名 仮想プラットフォーム バージョン
csr1,2,3 CSR1000v(IOS-XEベース) 16.11.1b
iosvl2 iosvl2(IOSベース) 15.2(CML_NIGHTLY_20190423)

2. HSRP設定

csr2とcsr3に、最低限必要なHSRP設定を行いました。

csr2
interface GigabitEthernet1
 ip address 10.1.1.2 255.255.255.0
 standby 1 ip 10.1.1.10
 standby 1 priority 110
 standby 1 preempt
csr3
interface GigabitEthernet1
 ip address 10.1.1.3 255.255.255.0
 standby 1 ip 10.1.1.10

showコマンドを見ると、csr2がActive、csr3がStandbyになっている事が分かります。

show standby brief
csr2#show standby brief
                     P indicates configured to preempt.
                     |
Interface   Grp  Pri P State   Active          Standby         Virtual IP
Gi1         1    110 P Active  local           10.1.1.3        10.1.1.10

csr3#show standby brief
                     P indicates configured to preempt.
                     |
Interface   Grp  Pri P State   Active          Standby         Virtual IP
Gi1         1    100   Standby 10.1.1.2        local           10.1.1.10

3.通常時の動作

3-1.ARPテーブル確認

csr1からcsr2,3の物理/仮想IPアドレス宛てにPingを行い、csr1でARPテーブル(show ip arp)を確認しました。

csr1
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  10.1.1.1                -   5254.001b.15c1  ARPA   GigabitEthernet1
Internet  10.1.1.2                5   5254.001a.9cad  ARPA   GigabitEthernet1
Internet  10.1.1.3                5   5254.0008.1e07  ARPA   GigabitEthernet1
Internet  10.1.1.10               5   0000.0c07.ac01  ARPA   GigabitEthernet1

仮想IPアドレス10.1.1.10に対するMACアドレスは、HSRP仮想MACアドレスの採番ルールに従って0000.0c07.ac01になっています。一方csr2,3の物理IPアドレス10.1.1.2, .3に対するMACアドレスは、物理的に割り振られたものが使われています。

ネットワークエンジニア御用達?の以下記事では、Activeルータの物理IPアドレス(今回はcsr2の10.1.1.2)は仮想MACアドレスが紐付けられると書かれていたのですが、今回の環境では違いました。(なぜ?)
https://www.infraexpert.com/study/tcpip3.5.html

3-2. ARPパケット確認

3-1.でPingした時のパケットをキャプチャしてみました。
ARP関連でフィルタしたところ、csr1からのARPリクエスト(No.12,28,43)と、csr2からのARPリプライ(No.13,29)、csr3からのARPリプライ(No.44)が送信されていました。

No.13の仮想IPアドレスに関するARPリプライは、csr2の仮想MACアドレスから送信されていました。

No.29のcsr2の物理IPアドレスに関するARPリプライは、csr2の物理MACアドレスから送信されていました。

これは3-1.のARPテーブル結果とも一致します。

3-3. MACアドレステーブル確認

iosvl2でMACアドレステーブル(show mac address-table)を取得しました。

iosvl2
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    0000.0c07.ac01    DYNAMIC     Gi0/1
   1    5254.0008.1e07    DYNAMIC     Gi0/2
   1    5254.001a.9cad    DYNAMIC     Gi0/1
Total Mac Addresses for this criterion: 3

仮想MACアドレス向けのパケットはGi0/1から送信されるようになっています。Gi0/1の先にはActiveルータcsr2が接続されていますので、想定通りの動きですね。

3-4. HSRP Helloパケット確認

csr2で取得したHSRP関連のパケットです。Active、Standbyルータそれぞれから定期的にHelloパケットが送信されています。

No.2のStandbyルータからのHelloパケットを見ると、送信元MACアドレス、送信元IPアドレスともに物理アドレスが使われています。

一方No.3のActiveルータでは、送信元IPアドレスは物理アドレスですが、送信元MACアドレスは仮想アドレスが使われています。

RFC2281を見ると、これはブリッジ(スイッチ)が仮想MACアドレスの接続先を学習し、MACアドレステーブルへ反映するためのMUST要件のようです。

If and only if the router is in the Active state, the router MUST use the group’s virtual MAC address as the source MAC address for its Hello messages. This is necessary in order to allow learning bridges to be able to determine which LAN segment the virtual MAC address currently belongs to.

ここまでで、Activeルータの物理IPアドレスから送信されるパケットには、ARPリプライのように物理MACアドレスが使われる場合と、Helloパケットのように仮想MACアドレスが使われる場合がある事が分かりました。

4. HSRP切替わり時の動作

csr2のインターフェースを閉塞し、HSRP切替わり時の動作を確認してみました。

4-1.ARPテーブル確認

csr1のARPテーブルを確認したところ、Ageこそ違うものの、他は3-1.と同じでした。

4-2. ARPパケット確認

切替わり時のARPパケットをキャプチャしてみました。
No.22,23,28の通り、仮想IPアドレスに対するGratuitous ARP(GARP)が、仮想MACアドレスを送信元として送信されていました。

No.22のパケット詳細

4-3. MACアドレステーブル確認

3-3.と比較すると、仮想MACアドレス向けの出力ポートがGi0/1からGi0/2に切り替わっています。ActiveルータはGi0/2の先にいるcsr3ですので、期待通りの動きですね。

iosvl2
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    0000.0c07.ac01    DYNAMIC     Gi0/2
   1    5254.0008.1e07    DYNAMIC     Gi0/2
   1    5254.001a.9cad    DYNAMIC     Gi0/1
Total Mac Addresses for this criterion: 3

4-4. HSRP Helloパケット確認

csr3がActiveルータに切替わり、Helloパケットが送信されています。

No.2のHelloパケットを見ると、3-4.ではcsr3の送信元MACアドレスは物理アドレスでしたが、切替わりによって仮想アドレスに変わっています。

5. ここで疑問

「HSRP切替わり時、ARPテーブルは変化しない。MACアドレステーブルはおそらくHelloパケットがあれば切替わる。だとしたらGARPいらなくない?」という疑問が湧きました。
必要そうなシナリオを考えてみました。

5-1. 仮想MACアドレスをルータによって変える場合

csr2の仮想MACアドレスはデフォルトのまま、csr3の仮想MACアドレスを別のものに変更する場合は、切替わり時、GARPによってARPテーブルの仮想MACアドレスも更新されました。(このような設計が必要なケースは無さそうですが。。)

csr3
interface GigabitEthernet1
 standby 1 mac-address 0000.0c11.1111
csr1
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  10.1.1.1                -   5254.001b.15c1  ARPA   GigabitEthernet1
Internet  10.1.1.3              130   5254.0008.1e07  ARPA   GigabitEthernet1
Internet  10.1.1.4              117   5254.0006.8001  ARPA   GigabitEthernet1
Internet  10.1.1.10               3   0000.0c11.1111  ARPA   GigabitEthernet1

最後に

今回残したのは、デフォルトのHSRP version1の実験結果ですが、HSRP version2やVRRPでも、仮想MACアドレス採番ルールこそ違うものの、似たような動作で同じ疑問にぶつかりました。
IOSの12点台でも試しましたが同じで、自分の実験の仕方が悪いのか、本当にGARPいらないのか分からなくなってきました。。

Discussion