Multiple Site-to-Site VPNs in VRF mode

やりたいこと

  • ひとつ(物理)ルータで複数の拠点に対して IPsec VPN をはりたい
  • 各拠点とのVPNは、システムとしては別物なので、相互に通信しない(分離する)
    • 個々の VPN(IPsec SA) を別々の VRF にマッピングしてルーティングテーブルを分離する。

MPLS-VPN 的なユースケースですね。
元々は AWS VPC への接続について(複数のVPCに1つのルータで接続する)こういうことをやりたい、という話だったのですが、私はVPCのことわかてってない(さわってない)ので普通に Cisco router でこういうユースケースが実現できるか、という観点で書いています。

[2014-10-13 追記] Multiple Site-to-Site VPNs in VRF mode (2) もうちょっと続きを書きました。

テスト環境

ターゲットとする構成

複数VPN SA と VRF のマッピングのテスト、ということで、以下のような環境を考えてみます。

  • 本社(HQ: headquarter) と拠点(branch office)が2個ある。
  • 本社のルータは1つのグローバルIPをもち、拠点のルータとVPNをはる。
  • branch1-HQ(branch1-vrf) と branch2-HQ(branch2-vrf) は別物なので分離。

図中、インターネットっぽいところは L3 スイッチで適当にルーティングしてありますが、本筋ではないので特に触れません。図は L3 スイッチのコンフィグ書く上でパラメタ決めるために書いてあるだけです。

機材
  • Branch
  • HQ

方法

どうも調べてみると2種類くらいやり方があるみたい。ひとつは、Crypto-Map の設定による方法("VRF-aware IPsec")

もうひとつは Tunnel Interface を VRF に紐付けて作る方法("VPNs in VRF Mode")

解説としてはこれがわかりやすかったです。

Crypto Map ベースの方法は、RRI(Reverse Route Injection)がどうのとかちょっと動作的にややこしそうだったのと、Tunnelベースの方が今回のユースケースに対しては理解しやすいかなあと思って Tunnel ベースの方を選択しています。

L3構成

rtr7 (HQ) ルータですが、VRF-aware IPsec などのマニュアルを読むと、VRF の用途(役割)の分類として、以下の用語が出てきます。

  • FDVRF (Front-Door VRF), Outside-VRF とも。
    • 外部と通信するインタフェースを持ち、トンネルを張る(トンネルへの encryption, トンネルからの decryption を行う)
    • 図中では fdvrf のこと。
  • IVRF (Inside VRF)
    • 内部の個別の環境を管理するVRF、トンネルへの encrypt 前, decrypt 後の暗号化されていないトラフィックを扱う。
    • 図中では branch1-vrf, branch2-vrf のこと。
  • Global VRF
    • 図中では GRT (Global Routing Table) と表記しています。ルータにデフォルトで存在するルーティングインスタンスのこと。
    • 以下の記述の中では特に使っていません。

VPN設定方針

元々のユースケースAmazon VPC の話だったので、そっちの設定を元に VPN 設定していく方針で。以降、ISAKNP/IPsec 関連設定のパラメータは原則以下のサイトを参照しています。

rtr7(HQ) VRF設定

rtr7 (HQ) はこんな感じで設定しておきます。

  • fdvrf
ip vrf fdvrf
 rd 65535:10
!
interface Vlan701
 ip vrf forwarding fdvrf
 ip address 192.0.2.254 255.255.255.0
!
ip route vrf fdvrf 0.0.0.0 0.0.0.0 192.0.2.1
  • branch1-vrf
ip vrf branch1-vrf
 rd 1:1
!
interface Vlan901
 ip vrf forwarding branch1-vrf
 ip address 10.1.10.1 255.255.255.0
!
  • branch2-vrf
ip vrf branch2-vrf
 rd 2:1
!
interface Vlan902
 ip vrf forwarding branch2-vrf
 ip address 10.2.10.1 255.255.255.0
!

rtr7(HQ) IPsec グローバル設定

グローバル設定は、トンネル全体に影響するので設定には注意。

  • isakmp policy
    • IKE phase 1 のポリシ定義。優先度は1が最高、10000が最低。
crypto isakmp policy 1
 encr aes
 authentication pre-share
 group 2
 lifetime 28800
  • IPsec Tunnel で keepalive を有効にして、対向の障害を検出する。
    • keepalive [X] [Y], X=キープアライブ間隔(秒), Y=キープアライブ失敗したときのリトライ間隔(秒)
crypto isakmp keepalive 10 10
  • IPsec packet の順序が入れ替わったときに、 Anti-Replay Window サイズを超えてしまうとパケットドロップが起きるので、ウィンドウサイズを大きくする (default は 64?)
crypto ipsec security-association replay window-size 128
crypto ipsec df-bit clear
  • 暗号化する前にフラグメントさせる
crypto ipsec fragmentation before-encryption

Branch1 VPN 設定

どの設定が何を参照しているのかに注意。

rtr7(HQ) IKE 設定

FDVRF を指定するところがあるので注意。

  • keyring
    • keyring は、pre-shared key, RSA公開鍵のリポジトリ
    • keyring の参照先となる FDVRF を設定します。(省略すると GRT)
crypto keyring branch1-keyring vrf fdvrf
  pre-shared-key address 198.51.100.254 key branch1key
!
  • isakmp profile
    • address でリモートピアのIP/マスクを指定
    • vrf で FDVRF を指定。(address で指定したアドレスが、どのVRFインスタンスにあるか)
crypto isakmp profile branch1-isakmp-profile
   keyring branch1-keyring
   match identity address 198.51.100.254 255.255.255.255 fdvrf
!
rtr7(HQ) IPsec 設定
  • transform-set
    • IPsec SA 生成のためのパラメタ定義。
crypto ipsec transform-set branch1-vpn-tfset esp-aes esp-sha-hmac
crypto ipsec profile branch1-ipsec-profile
 set transform-set branch1-vpn-tfset
 set pfs group2
!
rtr7(HQ) Tunnel Interface 設定
interface Tunnel1
 ip vrf forwarding branch1-vrf
 ip address 169.254.1.1 255.255.255.252
 ip virtual-reassembly
 ip tcp adjust-mss 1396
 tunnel source Vlan701
 tunnel mode ipsec ipv4
 tunnel destination 198.51.100.254
 tunnel vrf fdvrf
 tunnel protection ipsec profile branch1-ipsec-profile
!
  • ip vrf forwarding で Tunnel Interface を IVRF にくっつけます。
  • tunnel source で、トンネルの送信元アドレス(インタフェース)を指定します。
  • tunnel destination で、トンネルの送信先アドレスを指定します。
  • tunnel vrf でトンネルを張る(トンネルの送信元・先の通信を行う) ための VRF (FDVRF) を指定します。
  • tunnel mode ipsec ipv4, tunnel protectionIPsec VPN を行うことを指定し、パラメタ(IPsec Profile) を紐付けます。
rtr7(HQ) Static Route 設定

このままだとトンネル張った後に対向拠点の中のセグメントへの経路が不明なので追加しておきます。

ip route vrf branch1-vrf 10.1.0.0 255.255.0.0 169.254.1.2

Branch1 側 (rtr1) でも同様に static route を追加しておきます。

Amazon VPC だと BGP 使って経路情報組み立てることになるんだろうけど、今回はとりあえず VPN の話が見たかったので、BGP の設定とかはしてません。

rtr1(Branch1) 設定

VRF周りの設定がないだけでほとんど同じなので省略。

Branch2 VPN 設定

これもほとんど同じ(IPやIVRFなどのパラメタ指定が変わるだけ)なので省略。

トンネルの確認

  • ISAKMP SA
    • Branch1/2 の ISAKMP SA ができてる。
rtr7#sh crypto isakmp sa
IPv4 Crypto ISAKMP SA
dst             src             state          conn-id status
203.0.113.254   192.0.2.254     QM_IDLE           2006 ACTIVE branch2-isakmp-profile
198.51.100.254  192.0.2.254     QM_IDLE           2003 ACTIVE branch1-isakmp-profile

IPv6 Crypto ISAKMP SA

rtr7#
  • IPsec SA
    • show crypto ipsec sa とかでいろいろ出ますが長いので省略…。

経路の見え方

Branch1-HQ について、L3経路情報がどう見えるのか。

  • Branch1(rtr1)
    • トンネル張るための Internet 接続用セグメント (198.51.100.0/24)
    • IPsec トンネル (169.254.1.0/30)
    • HQ 側の内部セグメント (10.1.0.0/16) に対しては static route 設定したのでトンネル経由 (via. 169.254.1.1) で見えています。
rtr1#sh ip route
(略)

Gateway of last resort is 198.51.100.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 198.51.100.1
                is directly connected, Vlan711
      10.0.0.0/8 is variably subnetted, 3 subnets, 3 masks
S        10.1.0.0/16 [1/0] via 169.254.1.1
C        10.1.1.0/24 is directly connected, Vlan911
L        10.1.1.1/32 is directly connected, Vlan911
      169.254.0.0/16 is variably subnetted, 2 subnets, 2 masks
C        169.254.1.0/30 is directly connected, Tunnel1
L        169.254.1.2/32 is directly connected, Tunnel1
      198.51.100.0/24 is variably subnetted, 2 subnets, 2 masks
C        198.51.100.0/24 is directly connected, Vlan711
L        198.51.100.254/32 is directly connected, Vlan711
rtr1#
  • HQ(rtr7), FDVRF
    • Internet 接続用のセグメント (192.0.2.0/24) 以外は見えていません。このVRFからは Branch1 も Branch2 も何も見えない。
rtr7#sh ip route vrf fdvrf
Routing Table: fdvrf
(略)
Gateway of last resort is 192.0.2.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 192.0.2.1
      192.0.2.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.0.2.0/24 is directly connected, Vlan701
L        192.0.2.254/32 is directly connected, Vlan701
rtr7#
  • HQ(rtr7), IVRF(branch1)
    • Internet 接続用のセグメントとかは見えません。
    • Static route を設定したので、Branch1 側にある内部セグメント (10.1.0.0/16) がトンネル経由 (via. 169.254.1.2) 経由で見えています。
rtr7#sh ip route vrf branch1-vrf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 3 subnets, 3 masks
S        10.1.0.0/16 [1/0] via 169.254.1.2
C        10.1.10.0/24 is directly connected, Vlan901
L        10.1.10.1/32 is directly connected, Vlan901
      169.254.0.0/16 is variably subnetted, 2 subnets, 2 masks
C        169.254.1.0/30 is directly connected, Tunnel1
L        169.254.1.1/32 is directly connected, Tunnel1
rtr7#
  • HQ(rtr7), IVRF(branch2)
    • Branch1同様。ここも Branch2 に関する情報だけが見えます。
rtr7#sh ip route vrf branch2-vrf
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 3 subnets, 3 masks
S        10.2.0.0/16 [1/0] via 169.254.2.2
C        10.2.10.0/24 is directly connected, Vlan902
L        10.2.10.1/32 is directly connected, Vlan902
      169.254.0.0/16 is variably subnetted, 2 subnets, 2 masks
C        169.254.2.0/30 is directly connected, Tunnel2
L        169.254.2.1/32 is directly connected, Tunnel2
rtr7#

まとめ

  • Tunnel Interface を使って複数の IPsec SA を張り、それぞれ個別の VRF に紐付ける方法を見ました。
  • IPsec + VRF を使って、ひとつのルータハードウェアで、個別の VPN を扱うことができることを確認しました。VPN は VRF によって経路情報が(L3レベルで)分離されます。
  • 使い方として気になったので、FDVRF を明示して使う方法を試してみたけど、今回のテストの構成だと FDVRF = GRT にしてしまってよいはず。(vrf [FDVRF] を入れない)