【HSRP】切替動作(Resign / ホールドタイム)

HSRP では、アクティブルータに障害が起きると、スタンバイルータがそれを検知して、アクティブに切り替わります。このとき、アクティブルータが自分から「やめます」と知らせられるかどうかで、切り替わるまでの時間が変わります。この記事では、アクティブルータを再起動したときと、LAN 側のケーブルを抜いたときの動きを確認します。

この記事でわかること
  1. 再起動や shutdown では、アクティブルータが Resign を送り、すぐに切り替わること
  2. ケーブルの抜線や電源断では、ホールドタイムが過ぎるまで切り替わらないこと
  3. 切り替わりを速くするには、Hello とホールドタイムを短くすること

構成は、自動切り戻しの記事と同じです。R2(優先度 105)がアクティブ、R3(優先度 100)がスタンバイで、PC は仮想 IP アドレス 192.168.23.254 をデフォルトゲートウェイにしています。

アクティブルータをコマンドで再起動したとき

R5 5.5.5.5/32 192.168.25.0/24 192.168.35.0/24 R2 R3 Priority 105 Priority 100 .2 .3 192.168.23.0/24 HSRP グループ 1 仮想 IP .254 PC(.100) デフォルトゲートウェイ 192.168.23.254 reload(再起動) Init Active Resign(アクティブをやめる)
図1 アクティブの R2 を再起動する

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 メッセージが送られています。

画面イメージについて

この記事のパケットキャプチャの画面は、実際の画面ではなく、検証時の画面から見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

パケットキャプチャ(Wireshark):R2 の Resign画面イメージ
TimeSourceDestinationProtocolInfo
5.814534192.168.23.2224.0.0.2HSRPHello (state Active)
7.498014192.168.23.3224.0.0.2HSRPHello (state Standby)
8.304584192.168.23.2224.0.0.2HSRPHello (state Active)
10.458270192.168.23.3224.0.0.2HSRPHello (state Standby)
11.111470192.168.23.2224.0.0.2HSRPHello (state Active)
13.277644192.168.23.3224.0.0.2HSRPHello (state Standby)
13.773793192.168.23.2224.0.0.2HSRPResign (state Active)
13.783856192.168.23.3224.0.0.2HSRPAdvertise (state Active)
13.783984192.168.23.3224.0.0.2HSRPHello (state Active)
16.714755192.168.23.3224.0.0.2HSRPHello (state Active)
19.436946192.168.23.3224.0.0.2HSRPHello (state Active)
22.220355192.168.23.3224.0.0.2HSRPHello (state Active)
24.859158192.168.23.3224.0.0.2HSRPHello (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
図2 R2 が Resign を送り、R3 がすぐにアクティブになる(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Src: 00:00:0c:07:ac:01アクティブルータは、HSRP の仮想 MAC アドレス(グループ 1 なので末尾が 01)から送っている
2Op Code: Resign (2)アクティブをやめるときに送る Resign メッセージ
3State: Active (16)送った時点の R2 の状態は Active

Resign メッセージは、アクティブルータが停止するときなど、アクティブの役割をやめるときに送られます。このメッセージで、スタンバイルータにすぐアクティブの役割を引き継ぐように知らせます。一覧を見ると、R2 の Resign(13.773793 秒)の約 0.01 秒後には、R3 が Active として Hello を送っています。

アクティブルータの LAN 側のインターフェース(192.168.23.2)をコマンドで shutdown したときも、アクティブルータから Resign が送られ、スタンバイルータはすぐにアクティブに変わりました。ただし、この動きは OS のバージョンなどによって違う可能性があります。

アクティブルータの LAN 側のケーブルを抜いたとき

ケーブルを抜いた場合、アクティブルータは、スタンバイルータに状態の変化を知らせることができません。スタンバイルータは、ホールドタイムが過ぎてもアクティブルータからの Hello が届かないことをきっかけに、自分でアクティブに切り替わります。

R5 5.5.5.5/32 192.168.25.0/24 192.168.35.0/24 R2 R3 Priority 105 Priority 100 .2 .3 192.168.23.0/24 HSRP グループ 1 仮想 IP .254 PC(.100) デフォルトゲートウェイ 192.168.23.254 LAN 側のケーブルを抜く (通知なし) Active ホールドタイム(10 秒)Hello が来ない
図3 アクティブの R2 の LAN 側のケーブルを抜く
パケットキャプチャ(Wireshark):ケーブル抜線のとき画面イメージ
TimeSourceDestinationProtocolInfo
300.47…192.168.23.2224.0.0.2HSRPHello (state Active)
300.63…192.168.23.3224.0.0.2HSRPHello (state Standby)
303.26…192.168.23.2224.0.0.2HSRPHello (state Active)
303.27…192.168.23.3224.0.0.2HSRPHello (state Standby)
305.86…192.168.23.3224.0.0.2HSRPHello (state Standby)
306.16…192.168.23.2224.0.0.2HSRPHello (state Active)
308.47…192.168.23.3224.0.0.2HSRPHello (state Standby)
310.96…192.168.23.3224.0.0.2HSRPHello (state Standby)
313.80…192.168.23.3224.0.0.2HSRPHello (state Standby)
316.19…192.168.23.3224.0.0.2HSRPAdvertise (state Active)
316.19…192.168.23.3224.0.0.2HSRPHello (state Active)
319.01…192.168.23.3224.0.0.2HSRPHello (state Active)
図4 R2 の最後の Hello から約 10 秒後に R3 がアクティブになる(実際の画面ではなく、表示内容のポイントを示したイメージです)

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 あり) R2 の Resign 13.773793 R3 が Active 13.783856 約 0.01 秒 ケーブル抜線(通知なし) R2 の最後の Hello 306.16… R3 が Active 316.19… 約 10 秒
図5 Resign があるときとないときの、切り替わるまでの時間

切り替わりを速くするには

ケーブルの抜線や電源断のように 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 とホールドタイムを短くする

コメント