HSRPの実機演習

CCNAの復習がてらHSRPの実機演習してみました。CCNAを学習中の方や実機を買っていろいろ試したい方向けに書いています。 HSRPはルータでもL3機器でも使えますが、文字数の関係で本文中はルータの機能として説明します。

HSRPとは

HSRPとは、ルータを冗長化するための技術です。これらの機器は1台でも機能しますが、耐障害性を考えると1台だと心もとありません。通常時は1台で運用し、故障時にもう1台の予備系統へ切り替えるというのが一般的です。この切り替わりを自動で、瞬時に切り替えるためにHSRPが使われます。Ciscoが特許を取得している技術の為、Cisco機器以外で冗長化する場合は標準化されているVRRPを使います。

HSRPでは複数のルータでグループを作り、一つの仮想的なルータを作ります。さらに、仮想のルータに仮想のIPアドレス(VIP)と仮想のMACアドレス(vMAC)を持たせます。こうすることで、端末側からはデフォルトゲートウェイを1つの仮想ルータに指定できます。

HSRPのグループ(以後スタンバイグループ)にはActiveとStandbyという役割があります。 ルータ2台でHSRPの有効にすると、必ずどちらかがActive、もう一方がStandbyになります。この役割の選出方法は以下の通りです。

①プライオリティの大きいルータがActiveになる

②HSRPを有効にしたポートのIPアドレスを比較し、大きいほうのルータがActiveになる

①のプライオリティが等しい場合のみ②で決めます。 一般的には①で決まるように、Activeにしたいルータのプライオリティを高く設定します。 Activeルータへパケットが届かないような事態が発生すると、StandbyルータがActiveルータとして切り替わります。

なお、HSRPは最大4台までVIPを共有できます。ActiveとStandby以外の機器はその他のルータという位置づけになります。Activeルータがダウンした場合、同じようにStandbyルータがActiveとなり、その他のルータから新たにStandbyルータが選出されます。ただし、コストパフォーマンスの観点から、3台以上で冗長を組むということはまずありません。

HelloタイマーとHoldタイマー

ActiveルータとStandbyルータは、定期的にHelloパケットを送りあっています。Helloパケットとは、お互いが問題なく機能しているか確認する死活監視用のパケットです。デフォルトでは3秒に1回送信します。送信先のアドレスは224.0.0.2というマルチキャストアドレスを使います。HSRPを有効化したルータはこのマルチキャストグループに参加します。

Holdタイマーは、受け取ったHelloパケットをルータが保持している時間です。デフォルトでは10秒間です。Holdタイムが切れるまでHelloパケットを受け取らなかった場合、StandbyルータはActiveに切り替わります。

検証構成

今回の検証では以下を使います。

  • PC2台
  • ルータ2台(Cisco 891FJ,バージョン:15.3(3))
  • L2スイッチ2台(Catalyst 2960,バージョン:12.2(53))
  • LANケーブル6本
  • コンソールケーブル1本

検証構成図

論理構成図

物理構成図

注意 今回の検証の中心はHSRPの為、VLANの設定方法の説明は割愛しています。設定するためのConfigを最後に置いておくので、もし設定に詰まった場合はご活用ください。グローバルコンフィグレーションモードで丸ごとコピペして設定を流し込むことも可能です。

構築①HSRP以外の部分を設定してみよう

HSRPを設定する前に、まずは構成どおり組んでみましょう。PCのアドレス設定はまだしなくて大丈夫です。 注意点としてはルータのL2ポートを使用している点です。設定が簡単なL3ポート(IPアドレスを指定できる物理的なポート)はあえて使用していません。CCNAのL3スイッチのVLAN間ルーティングをしっかり理解していればできる内容になっています。ただし、ルータでのVLANの確認コマンド(スイッチのshow vlanにあたるコマンド)はshow vlan-switchなので間違えないようにしましょう。 

構成が組めたら、通常の疎通ができるか確認してみてましょう。

疎通確認①

PC1のデフォルトゲートウェイを192.168.10.1、PC2のデフォルトゲートウェイを192.168.20.1にして PC1→PC,PC2→PC1のpingが飛ぶこと

疎通確認②

PC1のデフォルトゲートウェイを192.168.10.2、PC2のデフォルトゲートウェイを192.168.20.2にして PC1→PC,PC2→PC1のpingが飛ぶこと

構築②HSRPの基本設定を入れてみよう

第二段階では設定方法に触れつついくつかクイズを出します。さっそくやっていきましょう。

HSRPの有効化の設定

HSRPはL3インターフェースで有効にします。同じスタンバイグループに所属できるのは、同じネットワークに所属するインターフェースのみです。

今回の構成においては、どのインターフェースがHSRPの設定対象になるでしょうか。

  1. L3(物理)ポート
  2. L2ポート
  3. SVI

少し考えてみてください。

正解は③のSVIです。①に設定も可能ですが、今回の構成では物理のL3ポートは使用していません。②のL2ポートも違います。IPアドレスを持たないL2ポートではHSRPを有効化できません。今回HSRPを有効化するのは、L2ポートを通じて内部に存在するSVIになります。

では、ActiveルータにするRT1から設定していきます。 HSRPを有効化するコマンドは、有効にするインターフェースのインターフェースコンフィグレーションモードで以下のコマンドを使います。

(config-if)#standby [グループ番号] ip [仮想IPアドレス]

VLAN10側のインターフェースに設定するコマンドは下記のとおりです。

RT1(config)#interface vlan 10

RT1(config-if)#standby 10 ip 192.168.10.254

グループ番号はわかりやすくVLANの番号と揃えてますが、何でもよいです。ただし、同じグループに属するルータと揃えなければいけません。 IPアドレスは実際のIPアドレスではなく仮想IPアドレス(VIP)である点にも注意です。これはPC1に設定するデフォルトゲートウェイのアドレスになります。

Hello/Holdタイマーの設定

次にHelloタイマーとHoldタイマーを設定します。デフォルトではそれぞれ3秒、10秒です。HoldタイマーはHelloタイマーの3倍以上に設定しなければいけません。以下のコマンドを使います。

(config-if)#standby [グループ番号] timers [Helloタイマー(秒)] [Holdタイマー(秒)]

今回はHelloタイマーを1秒、Holdタイムを3秒にセットします。コマンドは下記のとおりです。

RT1(config-if)#standby 10 timers 1 3

プライオリティの設定

次にプライオリティを設定します。コマンドは以下を使います。

(config-if)#standby [グループ番号] priority [プライオリティ値]

プライオリティ値には0~255を指定できますが、省略した場合は100となります。 RT1をActiveルータにするので、デフォルトより大きく設定します。

RT1(config-if)#standby 10 priority 105

RT1の設定はいったん以上にします。

Standbyルータの設定

ルータ2の設定に入る前に、ここでクイズです。RT1では、

  • HSRPの有効化(VIP指定)
  • Hello/Holdタイマー
  • プライオリティ

の3つを設定しましたが、今回の構成でStandbyルータに必須の設定はどれでしょうか。 予想してみましょう。

答えはHSRPの有効化のみです。ちなみにVIPも指定しなくて問題無いです。

RT2(config)# interface vlan 10

RT2(config-if)#standby 10 ip

HSRPではスタンバイグループでVIP、Hello/Holdタイマーが揃っている必要があります。しかし、Standbyルータではこれらを設定しなくて勝手に適用されます。

なぜかというと、自分よりプライオリティの高いルータからのHelloパケットを受け取った場合、そのルータの設定に従うからです。ここで言う設定とはActiveルータのVIPやHello/Holdタイマーであり、これらはHelloパケットに情報として含まれています。もちろんプライオリティも含まれます。ですが、プライオリティ値は手動で設定しない場合100に設定される仕様です。Activeルータより低ければ問題ないので、今回は必須ではありません。

さて、ここまで設定できたらRT1とRT2の設定内容を確認してみましょう。HSRPの設定確認は、#show standby コマンドでできます。 要約情報を表示するには#show standby briefです。

HSRPの動作の確認

設定ができたらHSRPが機能しているか確認してみましょう。PC1のデフォルトゲートウェイを192.168.10.254に設定し、コマンドプロンプトで下記のようにVIPにpingを送り続けます。

ping -t 192.168.10.254

今はActiveルータであるRT1にpingが飛んでいるので、RT1のgi1のケーブルを抜いてどうなるか見てみましょう。 一瞬Holdタイマーの時間だけ通信が止まりますが、すぐに通信の再開を確認出来たら成功です。

さて、このときルータの周りの機器では何が起きているのでしょうか。今までRT1に向けてpingを送っていたのに、すぐにRT2ヘ経路を変更したようです。 なぜこのような動作になるのか、これにはGARPと仮想MACアドレスが関係しています。

GARPと仮想MACアドレス(vMAC)

Gratuitous ARPARPの一種で、自身のMACアドレスIPアドレスの関連付けについてブロードキャストします。これはARP Replyのフォーマットで送られ、ネットワーク内のMACアドレステーブルを更新する役割があります。 GARPと言うと、PCでIPアドレスを設定した際に使われるARP ProbeとARP Announcementがあります。これらはIPアドレスの重複確認と周囲のARPテーブル更新の役割がありますが、広義のGARPとして区別されます。詳しくは別の記事で解説したいと思います。

HSRPにおいては、Activeルータの障害により新しくActiveになったルータがGARPを送出します。 このGARPで通知されるIPアドレスMACアドレスが仮想IPアドレス(VIP)と仮想MACアドレス(vMAC)です。このパケットを受け取ったスイッチは、MACアドレステーブルのvMACの対応付けを変更します。 ※vMACは00-00-0C-07-AC-XXが使われます。(XXはHSRPグループの番号)

わかりにくいと思われがちなとこですが、HSRPを設定したルータと周辺の機器のアドレスまわりは理解しておくと良いです。

上記から以下のような動作につながる

  • 通常時、ActiveルータからvMACを使用したパケットが常にスイッチにも届くので、スイッチはActiveルータが接続されているポートをMACアドレステーブルで把握できる
  • Activeルータ異常時、新たなActiveルータからGARPを受け取ったスイッチはMACアドレステーブルを更新し、Activeルータが接続されているポートを把握できる
  • スイッチのMACアドレステーブルは、Standbyルータ側インターフェースに実MACアドレス、Activeルータ側インターフェースに実MACとvMACが登録される

経路の切り替わりの様子はスイッチのMACアドレステーブルだったり、ルータでの#debug standby terse コマンドだったりで確認できるので見てみると面白いです。パケットキャプチャをしてみるともっと面白いです。

構築③ プリエンプトを設定しよう

さて、このままでも通信はできますが、もとの状態に戻す必要があります。もう一台のルータに何か問題が起きたら、全く通信できなくなってしまうからです。加えて、復旧したルータは再びActiveになることが望ましいです。現在動いている予備のルータが、元のActiveルータと比べて性能が低かったりしたら不便ですよね。 ただ、この状態でケーブルを戻してもActiveルータはもとのRT1には戻りません。show standbyやスイッチのshow mac-address-tableで確認しても、元に戻っていないことがわかると思います。

そこで、プリエンプトという機能を使います。 プリエンプトは、「スタンバイグループのうち、プライオリティが高いほうのルータが常にActiveとなる」という機能です。 HSRPではプリエンプトはデフォルトでオフになっています。

では、有効に設定してみましょう。 設定するのはActiveとして使いたいほうのルータです。ただし、Standby側にも設定して問題はありません。以下のコマンドを使います。

(config-if)#standby [グループ番号] preempt

今回の場合は下記のとおりです

RT1(config-if)#standby 10 preempt

これで今後は常にRT1がActiveになります。show standby briefで確認してみましょう。 先ほどまではなかったPの文字がついていると思います。これはpreemptが有効であることを意味します。

構築④オブジェクトトラッキングを設定してみよう

さて、ここまでVLAN10のみで障害と復旧の確認をしていましたが、VLAN10とVLAN20が通信する場合のことを考えてみます。 今度はPC1からPC2へpingを送ってみます。通常時は問題なく疎通できますが、先ほど同様にRT1のgi1からケーブルを抜くとどうなるでしょうか。

結果、先ほどとは異なりルータの経路切り替えが発生せず、疎通不可となってしまいます。

障害発生時、VLAN10側のインターフェースではHSRPが機能してActiveルータの切り替わりが発生します。PC1からのpingはRT2に向かて飛ぶようになります。 しかし、VLAN20側のインターフェースは違います。VLAN20側の機器はRT1のgi1に異常が起きたことには気づけません。 VLAN20側のスタンバイグループはお互いにHelloパケットを送り合えている(死活監視できている)ので、特に異常はないと認識しているのです。

このような事態を避けるためには、トラッキングという機能を使います。トラッキングとは、通信状況やインターフェースの状態を監視し、異常があったら通知する機能です。 CCNAではインターフェーストラッキングというワードが出てきますが、インターフェースのみしか監視対象に指定できないため一般的にはオブジェクトトラッキングが使われます。 オブジェクトトラッキングではルーティング情報やICMP到達性などをオブジェクト=監視対象とし、異常時に通知します。インタフェーストラッキングと同じように使う場合、「インターフェースのリンクが確立しているか」を監視対象をとします。

オブジェクトトラッキングを使ったHSRPの障害時の動きは下記のとおりです。

  1. HSRPで監視してない(HSRPが有効ではない、もしくは別のスタンバイグループなど)別のネットワークのインターフェースの状態を監視
  2. 監視対象のインターフェースがダウンすると、HSRPのプライオリティを指定した数だけ下げる。
  3. Standbyルータはプライオリティが相対的に大きくなり、プリエンプト機能によってActiveルータに昇格する

オブジェクトトラッキングを有効にするのはActiveルータでHSRPを有効にしているインターフェースです。また、③の条件をクリアするためにはStandbyルータもプリエンプト機能を有効する必要があります。順番にコマンドを記述します。

まずは監視対象とするオブジェクトを作成します。下記のコマンドを使います。

(config)#track [オブジェクト番号] interface [インターフェース] line-protocol

VLAN10側はVLAN20側のインターフェースを監視します。逆も同様です。

RT1(config)#track 1 interface GigabitEthernet1 line-protocol

RT1(config)#track 2 interface GigabitEthernet2 line-protocol

続いて、作成したオブジェクトをHSRPのスタンバイグループに紐づけます。コマンドは下記になります。

(config)#interface [インタフェース]

(config-if)#standby [グループ番号] track [オブジェクト番号] decrement [プライオリティの減算値]

VLAN10側のスタンバイグループではgi1を監視対象とします。RT1のプライオリティは105なので、RT2の100より低くなるように減算値を設定すれば障害発生時にStandbyになります。今回は10で指定します。

RT1(config)#interface vlan 10

RT1(config-if)#standby 10 track 2 decrement 10

VLAN20側にも設定してみましょう。 設定が完了したら、疎通確認をします。

疎通確認①

  • PC1→PC2,PC2→PC1へpingを送り続ける
  • RT1のgi1のケーブルを抜いてpingが続くことを確認
  • ケーブルを挿し直してpingが続くことを確認

疎通確認②

  • PC1→PC2,PC2→PC1へpingをを送り続ける
  • RT1のgi2のケーブルを抜いてpingが続くことを確認
  • ケーブルを挿し直してpingが続くことを確認

まとめ

実際にやってみると疑問が尽きなかったですが、いくつかは解消できてよかったと思います。今回はHSRPv1を題材に検証しましたが、IPv6に対応したHSRPv2やVRRPについても機会を見て触れてみたいと思います。軽く触れた程度ですが、オブジェクトトラッキングはいろいろできそうなので触ってみると面白そうです。参考になる記事を目指して頑張ります。

コンフィグ置き場(流し込み・確認用)

・L2SW1

interface FastEthernet0/1

switchport access vlan 10

no shutdown

!

interface FastEthernet0/2

switchport access vlan 10

no shutdown

!

interface FastEthernet0/5

switchport access vlan 10

no shutdown

!

end

・L2SW2

interface FastEthernet0/1

switchport access vlan 20

no shutdown

!

interface FastEthernet0/2

switchport access vlan 20

no shutdown

!

interface FastEthernet0/5

switchport access vlan 20

no shutdown

!

end

・RT1

vlan 10,20

!

track 1 interface GigabitEthernet1 line-protocol

!

track 2 interface GigabitEthernet2 line-protocol

!

interface GigabitEthernet1

switchport access vlan 10

no ip address

!

interface GigabitEthernet2

switchport access vlan 20

no ip address

!

interface Vlan10

ip address 192.168.10.1 255.255.255.0

standby 10 ip 192.168.10.254

standby 10 timers 1 3

standby 10 priority 105

standby 10 preempt

standby 10 track 2 decrement 10

!

interface Vlan20

ip address 192.168.20.1 255.255.255.0

standby 20 ip 192.168.20.254

standby 20 timers 1 3

standby 20 priority 105

standby 20 preempt

standby 20 track 1 decrement 10

!

end

・RT2

vlan 10,20

!

track 1 interface GigabitEthernet1 line-protocol

!

track 2 interface GigabitEthernet2 line-protocol

!

interface GigabitEthernet1

switchport access vlan 10

no ip address

!

interface GigabitEthernet2

switchport access vlan 20

no ip address

!

interface Vlan10

ip address 192.168.10.2 255.255.255.0

standby 10 ip 192.168.10.254

standby 10 preempt

!

interface Vlan20

ip address 192.168.20.2 255.255.255.0

standby 20 ip 192.168.20.254

standby 20 preempt

!

end