これまで見てきた冗長構成のIPv6ネットワークで、いずれかのルータが通信障害を起こしたとします。この時、ホストはどのようにして問題を検知し、通信路を切り替えるのでしょうか?
ここでは、実験的に問題を起こしてWindows 7の挙動を見ていきます。
まず、問題が発生していない通常の状態で、netstatコマンドを用いてIPv6ルーティングを確認します。
・Windows 7でのIPv6ルーティングテーブルの確認例
C:\>netstat -r ... IPv6 ルート テーブル =========================================================================== アクティブ ルート: If メトリック ネットワーク宛先 ゲートウェイ 12 276 ::/0 fe80::beef:1 12 276 ::/0 fe80::cafe:1 1 306 ::1/128 リンク上 13 58 2001::/32 リンク上 12 28 2001:db8:beef::/64 リンク上 12 28 2001:db8:cafe::/64 リンク上 12 276 fe80::/64 リンク上 12 276 fe80::c414:4e77:b627:40e7/128 リンク上 =========================================================================== 固定ルート: なし
ルータAの“beef”の経路とルータBの“cafe”の経路が同一の優先度(メトリック 276)で登録されています。
次に、IPv6の近隣キャッシュ(IPv4のARPテーブルに相当)を確認します。
・Windows 7でのIPv6近隣キャッシュの確認例
C:\>netsh interface ipv6 show neighbor ... インターフェイス 12: ローカル エリア接続 インターネット アドレス 物理アドレス 種類 -------------------------------------------- ----------------- ----------- 2001:db8:beef::1 00-12-e2-f8-3f-f2 到達可能 (ルーター) 2001:db8:cafe::1 00-12-e2-f8-40-56 到達可能 (ルーター) fe80::beef:1 00-12-e2-f8-3f-f2 到達可能 (ルーター) fe80::cafe:1 00-12-e2-f8-40-56 到達可能 (ルーター)
ルータAの“beef”とルータBの“cafe”の両方が通信可能であることが分かります。
ここで、ルータAのIPv6機能をOFFにします。ルータAのインターフェイスで“no ipv6 enable”とし、配線やポートの状態は変更せずIPv6の通信機能だけを停止させます。ルータBの設定は変更しません。
・変更後のルータAの設定内容
interface vlan 100 ipv6 address 2001:db8:beef::1/64 ipv6 address fe80::beef:1 link-local no ipv6 enable no ipv6 nd suppress-ra
念のため、netstatコマンドでルーティングを確認すると、ルーティングテーブルは何も変化せず、ホストはルータAの“beef”とルータBの“cafe”の両方のルートを保持しています。これはケーブルが抜けるなどの物理的な問題が発生していないためホストがリンクダウンせず、ルーティング上の問題を検出できないことに起因します。
この状態でもう一度、“www.kokatsu.jp”宛ての通信路を確認すると、ルーティングテーブルには変化がないのに、もともとルータAの“beef”を経由していた通信が、ルータBの“cafe”へ自動的に変更されていることが確認できます。
・[ルータAで障害発生中]Windows 7で"www.kokatsu.jp"宛ての通信路を確認した例
C:\>tracert -h 1 www.kokatsu.jp www.kokatsu.jp [2001:dc2:1000:2008::5456] へのルートをトレースしています 経由するホップ数は最大 1 です: 1 <1 ms * <1 ms 2001:db8:cafe::1 トレースを完了しました。
さらに、ホストの近隣キャッシュを確認すると、ルータAの“beef”は利用できないことが確認できます。
・[ルータAで障害発生中]Windows 7でのIPv6近隣キャッシュの確認例
C:\>netsh interface ipv6 show neighbor ... インターフェイス 12: ローカル エリア接続 インターネット アドレス 物理アドレス 種類 -------------------------------------------- ----------------- ----------- 2001:db8:beef::1 00-12-e2-f8-3f-f2 Stale (ルーター) 2001:db8:cafe::1 00-12-e2-f8-40-56 到達可能 (ルーター) fe80::beef:1 到達不可 到達不可 (ルーター) fe80::cafe:1 00-12-e2-f8-40-56 到達可能 (ルーター)
このようにホストは、通信可能かどうかの状態も含めて、近隣のホストやルータの情報を常に確認し、最適な通信路を自動的に選択する機能を持っています。
この近隣検出とキャッシュの仕組みは、NDP(Neighbor Discovery Protocol)を基にしていて、IPv6を実装するすべてのルータおよびノード(ホストやサーバ)で機能するようRFCで定義されています。このため、メーカーや機種を問わず共通して利用できます。
これまでホストの自動制御に主眼を置いて冗長制御の仕組みを見てきましたが、ここからは視点を変えて、ルータネットワークの場合やサーバ接続の用途を前提にした冗長化の仕組みを簡単にまとめます。
ホストを収容する場合の自動的な冗長制御については、NDP(中でも特に、RA:Router Advertisement)が有効に働きます。しかしルータやサーバを接続する際は、自動化するのではなく、明示的に設定を行いたいケースが多いと思います。また、Webカメラやセンサなどの端末では、NDPのすべての機能を搭載するのが現実的でないこともあります。
このような場合、ノードには固定アドレスと静的なゲートウェイアドレスを設定し、ゲートウェイ側で経路制御するアクティブ/スタンバイ方式の冗長構成を採用するのが一般的です。この方式で最も有力なのは、RFC5798で標準化されたVRRPv3プロトコルです。
VRRPv3は、IPv4のVRRPを拡張するものです。IPv6独自の機能が追加されているものの、基本的な挙動は従来のVRRPと同様です。
まず、冗長化された2台のルータにおける一般的なVRRPv3の設定を見てみましょう(図4)。
・ルータAの設定内容
interface vlan 100 ipv6 address 2001:db8:ace::2/64 ipv6 address fe80::ace:2 link-local ipv6 enable ipv6 nd suppress-ra vrrp 1 ipv6 2001:db8:ace::1 vrrp 1 priority 100 vrrp 1 accept
・ルータBの設定内容
interface vlan 100 ipv6 address 2001:db8:ace::3/64 ipv6 address fe80::ace:3 link-local ipv6 enable ipv6 nd suppress-ra vrrp 1 ipv6 2001:db8:ace::1 vrrp 1 priority 10 vrrp 1 accept
ルータAとBは、ともにVRRP仮想アドレスとして“2001:db8:ace::1”を指定しています。仮想アドレスにはリンクローカルアドレスを使うのが一般的ですが、仮想インターフェイス(およびアドレス)への到達性を遠隔から監視したい場合には、リンクローカルアドレスは利用できません。従って、この例では上記のようにグローバルアドレスを設定しています。
また、優先するルータを明示的に指定したい場合は、プライオリティを設定します。この例では、ルータAを“priority 100”、ルータBを“priority 10”とし、プライオリティ値の大きいルータAをマスター(優先)ルータとしています。
この状態で各ルータのVRRPステータスを確認します。ケーブルが正常に接続されていればVRRPのネゴシエーションが行われ、ルータAで仮想IPv6アドレス“2001:db8:ace::1”が有効になります。
・ルータAのVRRPv3動作状態(VRRPv3 MASTER)
Router-A# show vrrpstatus Date 2012/01/1 ... VLAN0100 VRID 1 MASTER virtual-ip 2001:db8:ace::1 priority 100/100 Router-A# show ipv6 interface vlan 100 Date 2012/01/1 ... VLAN0100: flags=8863 mtu 1500 inet6 2001:db8:ace::2/64 inet6 fe80::ace:2%VLAN0100/64 inet6 2001:db8:ace::1/128 (virtual router ip address) NIF00/Port24: UP media 100BASE-TX full(auto) 0012.e2f8.406f Time-since-last-status-change: 54,07:01:42 Last down at: ----- VLAN : 100
・ルータBのVRRPv3動作状態(VRRPv3 BACKUP)
Router-B# show vrrpstatus Date 2012/01/1 ... VLAN0100 VRID 1 BACKUP virtual-ip 2001:db8:ace::1 priority 10/10 Router-A# show ipv6 interface vlan 100 Date 2012/01/1 ... VLAN0100: flags=8863 mtu 1500 inet6 2001:db8:ace::3/64 inet6 fe80::ace:3%VLAN0100/64 NIF00/Port24: UP media 100BASE-TX full(auto) 0012.e2f8.262a Time-since-last-status-change: 54,07:03:38 Last down at: ----- VLAN : 100
ここで、各ルータで使われているMACアドレスに注目してください。ルータAのMACアドレスは“0012.e2f8.406f”、ルータBのMACアドレスは“0012.e2f8.262a”です。VRRPv3で共有される仮想IPv6アドレスに対して、どのMACアドレスが対応するのでしょうか?
これを確かめるため、VRRPv3で収容されている隣接ルータでIPv6近隣キャッシュを確認します。
一般的なルータでのIPv6近隣キャッシュの確認には、コマンド“show ipv6 neighbors”を使い、隣接ルータ(Neighbor)のIPv6アドレスとMACアドレス(Linklayer Address)を検証します。
・隣接ルータでのIPv6近隣キャッシュの確認例
Client-Switch# show ipv6 neighbors Date 2012/01/1 ... Total: 3 entries Neighbor Linklayer Address Netif Expire S Flgs P 2001:db8:ace::1 0000.5e00.0101 VLAN0100 19s R R 2001:db8:ace::2 0012.e2f8.406f VLAN0100 22s R R 2001:db8:ace::3 0012.e2f8.262a VLAN0100 26s R R
VRRPv3で共有サービスされている仮想IPv6アドレス“2001:db8:ace::1”に対して、ルータA(MACアドレス=0012.e2f8.406f)やルータB(MACアドレス=0012.e2f8.262a)のいずれの物理MACアドレスとも一致しない、“0000.5e00.0101”が登録されていることが分かります。すなわちVRRPv3では、明示的に設定した仮想IPアドレス“2001:db8:ace::1”と、自動的に割り振られた仮想MACアドレス“0000.5e00.0101”が対になって冗長制御されるのです。
この仕組みによって、マスタールータで問題が生じてVRRPおよび通信経路が切り替わったときも、隣接するノード(ルータやサーバ、ホスト)は近隣キャッシュを更新/変更する必要がなく、冗長切り替えの影響をまったく意識することなく通信を継続できるのです。
Copyright © ITmedia, Inc. All Rights Reserved.