1. 監視つきVRRPの必要性

通常、VRRP等のFHRP(first hop redundancy protocol)は監視設定と併用して使用される事が多いです。 恐らく一番有名な設計パターンはCCNPでよく出題されるInterface監視のHSRPでしょう。 しかし、このInterface監視のHSRPは以下のような間接リンク障害を検知する事はできません。 なぜならば、R1のinterfaceはup状態だからです。

このような不都合に対応するため、VRRPを構成するルータはインターネットへのping監視を行い、監視結果が正常な状態のみVRRPマスターになるように設定します。 赤線のようなping監視を行う事によってインターネット接続の障害を検知する事ができます。

2. watch-groupの定義

Cisco機の場合はIP SLAとオブジェクトトラッキング(Object Tracking)を組み合わせる手法を採用しますが、 NEC IXルータはwatch-groupというグループを定義します。 watch-groupは監視などのイベントを定義し、そのイベントとアクションを紐付る事ができます。

以下のように"watch-group"コマンドを使うとwatch-groupを定義するモードに入る事ができます。 その後、"event"コマンドでイベントを定義します。

Router(config)# watch-group <name> <seq>
Router(config-watch-<name>-<seq>)# event <seq> ip unreach-host <interface>

"action"コマンドでイベントに紐づくアクションを定義する事ができます。 "shutdown-vrrp"を指定する事でVRRPをdown状態にする事ができます。

Router(config)# watch-group <name> <seq>
Router(config-watch-<name>-<seq>)# action <seq> ip shutdown-vrrp <vrrp_group_mum>

具体的な設定例は以下の通りです。 この設定は、Gi0.0から8.8.8.8(google)を監視し、もし8.8.8.8への疎通不能となる場合はVRRPをdown状態にします。

watch-group sample 10
 event 10 ip unreach-host 8.8.8.8 GigaEthernet0.0
 action 10 ip shutdown-vrrp 254

3. watch-groupの開始

"network-monitor"コマンドで、定義したwatch-groupに基づく監視を開始する事ができます。

Router(config)# network-monitor <name> enable

4. watch-groupの状態確認

watch-groupによる監視成功失敗は、"show watch-group detail"コマンドによって確認する事ができます。 私は用語の使い方に違和感を感じるのですが、 "restoration"は監視結果がOKである事を意味し、"variance"は監視結果がNGである事を意味します

Router(config)# show watch-group detail
Watch-group 'sample' is enabled
  Sequence 10
    Status: normal
    Profile variance counts: 3
    Profile restore counts: 3
    Suppress variance counts: 0
    Suppress restoration counts: 0
    Profile history
      Time                Event      Status
      2014/02/13 19:50:58 variance   stand
      2014/02/13 20:17:47 restorer   normal
      2014/02/13 20:18:10 variance   stand
      2014/02/13 20:22:32 restorer   normal
      2014/02/13 20:22:55 variance   stand
      2014/02/13 20:23:27 restorer   normal
    Event:
      Event 10 ip unreach-host 8.8.8.8 GigaEthernet0.0
        Status: normal
        Event variance counts: 1
        Event restore counts: 1
        Probe success counts: 47
        Probe failure counts: 8
        Probe history
          Time                Result  Round trip
          2014/02/13 20:29:32 success      38.048 ms
          2014/02/13 20:29:42 success      38.072 ms
          2014/02/13 20:29:52 success      38.108 ms
          2014/02/13 20:30:02 success      38.047 ms
          2014/02/13 20:30:12 success      38.026 ms
          2014/02/13 20:30:22 success      38.071 ms
          2014/02/13 20:30:32 success      38.113 ms
          2014/02/13 20:30:42 success      38.017 ms
          2014/02/13 20:30:52 success      38.528 ms
          2014/02/13 20:31:02 success      38.079 ms
          round-trip (ms)  min/avg/max = 38.017/38.110/38.528
    Event history
      Sequence    Time                Event
      10          2014/02/13 19:50:58 variance
      10          2014/02/13 20:18:10 variance
      10          2014/02/13 20:22:55 variance
      10          2014/02/13 20:23:27 restorer
    Action:
      Action 10 ip shutdown-vrrp 10
        Status: restoration
Router(config)#

5. watch-group 閾値の定義

watch-groupは状態遷移が起きるまでの回数を定義する事ができます。 インターネットは不安定なものなので1パケット落ちただけでVRRPが切り替わってしまうのは迷惑に感じるかもしれません。 そこで、"probe-timer"や"probe-counter"というコマンドを使用する事で連続でパケットが落ちた場合に切替を行うようにする事ができます。

"probe-timer"コマンドで監視を行う間隔を定義する事ができます。 restorer, variance, waitはそれぞれ、"正常な状態の監視間隔", "障害発生時の監視間隔", "ping監視のタイムアウト時間"を表します。

Router(config)# watch-group <name> <seq>
Router(config-watch-<name>-<seq>)# probe-timer restorer <sec>
Router(config-watch-<name>-<seq>)# probe-timer variance <sec>
Router(config-watch-<name>-<seq>)# probe-timer wait <sec>

"probe-counter"コマンドで監視を行う回数を定義する事ができます。 restorer, variance, waitはそれぞれ、"障害が発生していると見なすまでの連続監視失敗回数", "障害が復旧したと見なすまでの連続監視成功回数", "一回の監視で送信するpingの数"を表します。

Router(config)# watch-group <name> <seq>
Router(config-watch-<name>-<seq>)# probe-counter restorer <count>
Router(config-watch-<name>-<seq>)# probe-counter variance <count>
Router(config-watch-<name>-<seq>)# probe-counter wait <count>

6. 迂回ルートの注意

VRRPを構成しているルータ同士のルーティングには注意して下さい。 例えば、R1, R2のそれぞれでデフォルトルートをAdvertiseし、互いにOSPF neighborを確立しているような状況を想定します。

このような場合、R1側で障害が発生したとしても、watch-groupによる監視パケットがR2を迂回してしまい障害を検知する事ができません。 これは私が実務で実際に経験した失敗なのですが、watch-groupのような監視依存の切り替わり設定は机上レビューが非常に難しいです。 監視に基づく切り替わり設定は、一通りのリンク障害, ボックス障害の切り替わり試験をお勧めします。

このようなトラブルに対応する機能が、送信元IPアドレスの明示指定やネクストホップの明示指定です。 以下のようにeventコマンドはネクストホップなどを明示指定する事ができます。 シンタックスが若干紛らわしいのですが、<interface>は出力インターフェースを表し、 <source_interface>は送信元IPアドレスとなるインターフェースを表します。

Router(config)# watch-group <name> <seq>
Router(config-watch-<name>-<seq>)# event <seq> ip unreach-host <interface> [ <next_hop> ] [ source <source_interface> ]