VRFとは?
VRF とは Virtual Routing and Fowarding の略で、物理ルータ(もしくはL3スイッチ)の中に仮想ルータを作成し、独立したルーティングテーブルを保持する機能です。
つまり、1 台の物理ルータの中に複数の仮想ルータを作ることができる機能です。
VLAN は、L2 の世界で物理スイッチの中に仮想スイッチを作成する、L2 の仮想化技術と考えることができますが、VRF は、L3 の世界で物理ルータ (もしくはコアスイッチ) の中に仮想ルータを作成する、L3 の仮想化技術です。
つまり、VLAN と VRF の違いは、L2 の仮想化技術か L3 の仮想化技術か、という点です。
また、サーバの世界で言えば、物理サーバの中に (Redhat KVM や Windows hyper-V 等の) ハイパーバイザ型仮想サーバを作成するのに似ています。
VRF は主に MPLS-VPN の実装に活用されてきました。以下記事に MPLS-VPN の実装について図解しています。
ですが VRF は MPLS-VPN 以外に、ネットワーク設計の柔軟性にも寄与してきました。
Cisco では VRF というと MPLS-VPN の実装で使われるルーティングテーブル分離機能を指しますが、VRF-Lite というと MPLS-VPN の実装の無い、ルーティング分離機能を指します。
本記事では VRF-Lite の機能について解説します。
なお、FortiGate の VDOM や paloalto の vRouter も VRF-Lite とほぼ同じ仕組みになっています。
VRF (VRF-Lite) の構成
VRF を構成するにはまずルータ上で「VRF インスタンス」を作成します。これは仮想ルータのことです。
TestVRF1 という名前の VRF インスタンスを作成する場合、名前以外に「Route Distinguisher (RD)」という VRF の識別子も必要になります。
RD は [0-65535]:[0-4294967295] の間で設定することができます。つまり、0:0 ~ 65535:4294967295 の間です。
VRF で RD が必要となる理由は単純で、VRF ではルーティングテーブル情報を VRF 名ではなく RD で管理しているためです。
VRF 名と IP アドレスをセットにする、ということもできたと思いますが、VRF 名は文字列なので、それよりも数値である RD と IP アドレスを並べることが適切だと考えたのでしょう。
以下の例では RD=10:10 という設定にしています。
(config)# ip vrf TestVRF1 (config-vrf)# rd 10:10
これにより仮想ルータが 1 台できます。しかしこの仮想ルータで使えるインタフェースが 1 つもない状態なので何もできません。
次に、L3 インタフェースに、先程作成した VRF インスタンスを割り当てます。これは物理インタフェースでもサブインタフェースでも、L3 スイッチであれば VLAN インタフェースでも構いません。IP アドレスの設定ができるインタフェースです。
(config)# interface gi 1/0 (config-if)# ip vrf forwarding TestVRF1 (config-if)# ip address 10.100.100.1 255.255.255.0 (config)# interface gi 1/1 (config-if)# ip vrf forwarding TestVRF1 (config-if)# ip address 10.100.200.1 255.255.255.0
この設定により、gi1/0 および gi1/1 インタフェースが「TestVRF1」という仮想ルータの Connected インタフェースとして認識されるようになります。
すると、そのインタフェースは物理ルータ (Global インスタンスと言います) からは見えなくなります。
そして、10.100.100.0/24 は Global インスタンスのルーティングテーブル (Global ルーティングテーブルと言います) には見えない状態になります。
このことからも分かりますが、インスタンス間では IP アドレスを重複させることができます。
ただし、インスタンス間でのルーティングも設定することができますが、IP 重複の際は設計がややこしくなるため、注意が必要です。
なお、VRF 上でルーティングを書く場合は下記のような設定になりますが、
[VRF 上の Static ルート追加]
(config)# ip route vrf TestVRF1 192.168.0.0 255.255.0.0 10.100.100.2
VRF 間のルーティングの書き方は以下のようになります。
[TestVRF1 インスタンスから Global インスタンスへのルーティング追加]
(config)# ip route vrf TestVRF1 192.168.0.0 255.255.0.0 gi 0/0 10.1.1.254
※gi 0/0 は Global インスタンスに所属しているインタフェースで、IP アドレスは 10.1.1.0/24 のレンジから払い出されているものとします。
[Global インスタンスから TestVRF1 インスタンスへのルーティング追加]
(config)# ip route 192.168.0.0 255.255.0.0 gi 1/0 10.100.100.254
このように、NextHop の指定に出力インタフェースと IP アドレスの両方を書く必要があります。
VRFを利活用したベストプラクティス
ファイアウォールは便利な反面、費用が高く、あちこちに置くわけにはいきません。そこで、VRF を利用して論理設計を柔軟にすることが重要です。
コアスイッチとファイアウォールを接続し、コアスイッチの VRF により VLAN で経路を分け、ファイアウォールを通る経路と通らない経路に分離することもできます。
これは PBR でも実現できますが、それよりも設計が楽になり、管理しやすくなります。
その際、スタックや Link Aggregation での冗長化との相性も良いです。
L3 スイッチをスタック (集約) し、VRF で分離 (分散)、Link Aggregationでバンドル (集約) し、VLAN で分離 (分散)、といった集約と分散を繰り返す構成で、信頼性を高めながら柔軟性も確保することができます。
VRF (VRF-Lite) の制約
仮想ルータといっても、あくまでインタフェースやルーティングテーブルを他から分離するものであり、いくつかのリソースはルータ全体で管理しなければなりません。
どこまで全体設定でどこから個別設定になるかは実装によりますが、Cisco の場合、例えばプロセス管理はルータ全体で行われます (その点では仮想サーバとは大きく異なります)。
なので、OSPF のプロセス ID は、全体で重複してはなりません。また、同様に OSPF 等のルータ ID も重複できません。
また、『VRF 間で IP アドレスは重複できるが、VLAN ID は重複できない』ということが機器の実装としてしばしば見られます。
これは VLAN ID というよりは VLAN インタフェース (SVI) が重複できない、と解釈すべきです。VRF では『IP アドレスを持つ物理および論理インタフェースをどの VRF に所属させるか』を設定するものなので、VLAN (論理) インタフェースは VRF 間で共有できないのです。
コメント