CiscoルータやL3スイッチでHSRP(Hot Standby Router Protocol)を設定する際、アクセスリスト(ACL)の設定ミスで気づかないうちにHSRPが機能しなくなるケースがあります。原因はシンプルで、HSRPが使用するマルチキャストアドレスをACLでdenyしてしまっていることです。
本記事では、HSRPとACLの関係、よくあるミスとその確認・対処方法を解説します。
アクセスリストを使って不要なトラフィックを制限する作業をしていたとき、インターフェースにACLを適用した直後にHSRPのステータスが怪しくなっていることに気づきました。
原因を調べると、HSRPが使用するマルチキャストアドレス(224.0.0.2)をACLにpermitする記述を入れ忘れていました。暗黙のdeny any anyに引っかかってHSRPのHelloパケットがブロックされ、ネイバーが組めなくなりかけていた状況です。
気づいて即座にACLにpermitを追加したことで実害は免れましたが、もし本番環境で適用していたらActiveルータが切り替わらない障害につながっていたと思うとヒヤッとしました。ACLを設定する際はHSRP・OSPF・EIGRPなどのプロトコルが使うマルチキャストを必ず意識することの重要さを改めて実感した案件です。
HSRPはActiveルータとStandbyルータの間でHelloパケットを交換して死活監視を行います。このHelloパケットはマルチキャストアドレス宛に送信されます。
| プロトコル | マルチキャストアドレス | UDPポート | 用途 |
|---|---|---|---|
| HSRPv1 | 224.0.0.2 | 1985 | Hello / Coup / Resign |
| HSRPv2 | 224.0.0.102 | 1985 | Hello / Coup / Resign |
| OSPF | 224.0.0.5 / 224.0.0.6 | —(IP proto 89) | Hello / LSA |
| EIGRP | 224.0.0.10 | —(IP proto 88) | Hello / Update |
HSRPv1は224.0.0.2、HSRPv2は224.0.0.102と異なります。使用しているバージョンに合わせてACLに記述してください。バージョンは show standby で確認できます。
ip access-list extended INBOUND
10 permit ip 192.168.1.0 0.0.0.255 any ← 内部からの通信は許可
20 permit ip 10.0.0.0 0.0.255.255 any ← 拠点間通信を許可
! ← ここにHSRPのマルチキャストpermitが抜けている
! 末尾の暗黙deny any anyで224.0.0.2宛がブロックされてしまうip access-list extended INBOUND
10 permit ip 192.168.1.0 0.0.0.255 any
20 permit ip 10.0.0.0 0.0.255.255 any
! ▼ HSRPv1のマルチキャストを許可
30 permit udp any host 224.0.0.2 eq 1985
! ▼ HSRPv2を使っている場合はこちらも追加
40 permit udp any host 224.0.0.102 eq 1985
! ▼ OSPFも動いていれば忘れずに
50 permit ospf any any
! ▼ EIGRPも動いていれば
60 permit eigrp any anyACLをインターフェースのinbound方向に適用している場合、対向ルータからのHSRP Helloパケットがブロックされます。outbound方向でも自分が送信するHelloが出て行かなくなるケースがあるため、両方向で確認が必要です。
Router# show standby brief
P indicates configured to preempt.
|
Interface Grp Pri P State Active Standby Virtual IP
Gi0/1 1 110 P Active local 192.168.1.2 192.168.1.254
↑Active正常 ↑Standbyが見えていればOKStandbyがUnknownや空欄になっている場合、HelloパケットがブロックされてStandbyルータを認識できていません。
Router# show ip access-lists INBOUND
Extended IP access list INBOUND
10 permit ip 192.168.1.0 0.0.0.255 any (12455 matches)
20 permit ip 10.0.0.0 0.0.255.255 any (8821 matches)
30 permit udp any host 224.0.0.2 eq 1985 (0 matches) ← ここが0のままならHSRPが届いていない
! 末尾に暗黙のdeny any anyがある(matchesが増えていたら何かがブロックされている)HSRPのpermitエントリのmatchesが増えていれば正常に許可できています。0のままであれば、ACLがインターフェースの正しい方向に適用されているか・バージョンが合っているかを再確認してください。
Router# show ip interface GigabitEthernet0/1
GigabitEthernet0/1 is up, line protocol is up
Inbound access list is INBOUND ← in方向に適用されているACL名
Outbound access list is not set ← out方向はACLなしインターフェースにACLを適用する前に、そのインターフェースで動作しているプロトコルを必ず確認してください。
show standby でHSRPグループとバージョンを確認。v1なら224.0.0.2、v2なら224.0.0.102をpermitに追加。
OSPFなら permit ospf any any、EIGRPなら permit eigrp any any を追加。
適用直後にネイバーが落ちていないか・HSRPのStandbyが消えていないかを確認します。問題があれば即座にACLをインターフェースから外してください。
show ip access-lists で意図しないDENYが増えていないか確認します。
図1: ACL設定時にpermitし忘れやすいプロトコルとマルチキャスト
ACL設定時はルーティングプロトコルや冗長化プロトコルが使うマルチキャストを必ず意識してください。
- HSRPv1は
224.0.0.2 UDP 1985、v2は224.0.0.102 UDP 1985を必ずpermitする - OSPFは
permit ospf any any、EIGRPはpermit eigrp any anyを忘れない - ACL適用直後に
show standbyとshow ip access-listsで即確認する - HSRPが組めなくなると冗長化が機能せず、Active障害時にフェイルオーバーできなくなる重大障害につながる

