HSRP では、アクティブルータに障害が起きると、スタンバイルータがそれを検知して、アクティブに切り替わります。このとき、アクティブルータが自分から「やめます」と知らせられるかどうかで、切り替わるまでの時間が変わります。この記事では、アクティブルータを再起動したときと、LAN 側のケーブルを抜いたときの動きを確認します。
- 再起動や shutdown では、アクティブルータが Resign を送り、すぐに切り替わること
- ケーブルの抜線や電源断では、ホールドタイムが過ぎるまで切り替わらないこと
- 切り替わりを速くするには、Hello とホールドタイムを短くすること
構成は、自動切り戻しの記事と同じです。R2(優先度 105)がアクティブ、R3(優先度 100)がスタンバイで、PC は仮想 IP アドレス 192.168.23.254 をデフォルトゲートウェイにしています。
アクティブルータをコマンドで再起動したとき
R2 のコンソールから、手動で再起動してみます。
R2
R2#reload
Proceed with reload? [confirm]
*Jun 2 08:46:29.906: %HSRP-5-STATECHANGE: FastEthernet0/0.23 Grp 1 state Active -> Init
ログのとおり、reload を実行するとすぐに、HSRP の状態が Active から Init に変わります。R2 と R3 の間のパケットをキャプチャすると、再起動のタイミングで、R2(アクティブ)から R3(スタンバイ)に Resign メッセージが送られています。
この記事のパケットキャプチャの画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| Time | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 5.814534 | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 7.498014 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 8.304584 | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 10.458270 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 11.111470 | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 13.277644 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 13.773793 | 192.168.23.2 | 224.0.0.2 | HSRP | Resign (state Active) |
| 13.783856 | 192.168.23.3 | 224.0.0.2 | HSRP | Advertise (state Active) |
| 13.783984 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
| 16.714755 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
| 19.436946 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
| 22.220355 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
| 24.859158 | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
1▸ Ethernet II, Src: All-HSRP-routers_01 (00:00:0c:07:ac:01)▸ 802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 23▸ Internet Protocol Version 4, Src: 192.168.23.2, Dst: 224.0.0.2▸ User Datagram Protocol, Src Port: 1985, Dst Port: 1985▾ Cisco Hot Standby Router Protocol Version: 02 Op Code: Resign (2)3 State: Active (16) Hellotime: Default (3) Holdtime: Default (10) Priority: 105 Group: 1 Reserved: 0 Authentication Data: Default (cisco) Virtual IP Address: 192.168.23.254
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Src: 00:00:0c:07:ac:01 | アクティブルータは、HSRP の仮想 MAC アドレス(グループ 1 なので末尾が 01)から送っている |
| 2 | Op Code: Resign (2) | アクティブをやめるときに送る Resign メッセージ |
| 3 | State: Active (16) | 送った時点の R2 の状態は Active |
Resign メッセージは、アクティブルータが停止するときなど、アクティブの役割をやめるときに送られます。このメッセージで、スタンバイルータにすぐアクティブの役割を引き継ぐように知らせます。一覧を見ると、R2 の Resign(13.773793 秒)の約 0.01 秒後には、R3 が Active として Hello を送っています。
アクティブルータの LAN 側のインターフェース(192.168.23.2)をコマンドで shutdown したときも、アクティブルータから Resign が送られ、スタンバイルータはすぐにアクティブに変わりました。ただし、この動きは OS のバージョンなどによって違う可能性があります。
アクティブルータの LAN 側のケーブルを抜いたとき
ケーブルを抜いた場合、アクティブルータは、スタンバイルータに状態の変化を知らせることができません。スタンバイルータは、ホールドタイムが過ぎてもアクティブルータからの Hello が届かないことをきっかけに、自分でアクティブに切り替わります。
| Time | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 300.47… | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 300.63… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 303.26… | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 303.27… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 305.86… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 306.16… | 192.168.23.2 | 224.0.0.2 | HSRP | Hello (state Active) |
| 308.47… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 310.96… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 313.80… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Standby) |
| 316.19… | 192.168.23.3 | 224.0.0.2 | HSRP | Advertise (state Active) |
| 316.19… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
| 319.01… | 192.168.23.3 | 224.0.0.2 | HSRP | Hello (state Active) |
R2 の最後の Hello(306.16 秒)のあと、R3 は Standby のまま Hello を送り続け、約 10 秒後の 316.19 秒に Active になっています。この 10 秒が、ホールドタイムの既定値です。Hello は約 3 秒ごとに送られているので、3 回分の Hello が届かなかったことになります。
PC から R5 のループバックアドレス(5.5.5.5)へ連続で ping を実行すると、次のように通信が途切れます。
PC
84 bytes from 5.5.5.5 icmp_seq=20 ttl=254 time=29.554 ms 84 bytes from 5.5.5.5 icmp_seq=21 ttl=254 time=21.816 ms 84 bytes from 5.5.5.5 icmp_seq=22 ttl=254 time=28.936 ms 84 bytes from 5.5.5.5 icmp_seq=23 ttl=254 time=30.966 ms 84 bytes from 5.5.5.5 icmp_seq=24 ttl=254 time=28.974 ms 84 bytes from 5.5.5.5 icmp_seq=25 ttl=254 time=24.053 ms 84 bytes from 5.5.5.5 icmp_seq=26 ttl=254 time=30.113 ms 84 bytes from 5.5.5.5 icmp_seq=27 ttl=254 time=23.963 ms 5.5.5.5 icmp_seq=28 timeout 5.5.5.5 icmp_seq=29 timeout 5.5.5.5 icmp_seq=30 timeout 5.5.5.5 icmp_seq=31 timeout 5.5.5.5 icmp_seq=32 timeout 5.5.5.5 icmp_seq=33 timeout 84 bytes from 5.5.5.5 icmp_seq=34 ttl=254 time=46.706 ms
icmp_seq=28 から 33 までの 6 回分の応答がなく、そのあと R3 経由で通信が戻っています。アクティブルータの電源ケーブルを抜くなど、ルータが突然止まった場合も、この動きになります。
切り替わりを速くするには
ケーブルの抜線や電源断のように Resign が送られない障害では、通信が途切れる時間は、最大でホールドタイムほどになります。途切れる時間をもっと短くするには、Hello の間隔とホールドタイムを既定値より短くします。
| 項目 | 既定値 | 設定コマンド |
|---|---|---|
| Hello の間隔 | 3 秒 | standby 1 timers Hello の間隔 ホールドタイム |
| ホールドタイム | 10 秒 |
standby 1 timers msec 200 msec 750 のように、ミリ秒単位でも設定できます。ただし短くしすぎると、CPU の負荷が一時的に上がったときなどに Hello が少し遅れただけで切り替わってしまうことがあります。ホールドタイムは Hello の間隔の3倍以上にし、グループ内のルータで同じ値にそろえます。
まとめ
| 障害 | 切り替わり |
|---|---|
| 再起動、shutdown | アクティブルータが Resign を送るので、スタンバイルータがすぐにアクティブになる |
| ケーブル抜線、電源断 | Resign が送られないので、ホールドタイム(既定 10 秒)が過ぎてからアクティブになる |
| 速くするには | standby timers で Hello とホールドタイムを短くする |
コメント