Multiple Site-to-Site VPNs in VRF mode (2)

はじめに

前回 Multiple Site-to-Site VPNs in VRF mode では、Amazon VPC を想定して、複数の Site-to-Site VPN (IPsec VPN) をそれぞれ VRF に関連づけて分離する方法を調べました。

今回は、

  • 前回は FDVRF を明示する方法でやってたけどあの構成だとほとんど意味ないので FDVRF = GRT にしておく
  • BGP を使って拠点(branch)との経路交換を行う。
  • VRF ルート漏洩を使って拠点間の接続および経路制御を行う。

を試してみたいと思います。まあ最後のはちょっと遊んでみたかっただけなのであまり実用的ではないかもしれませんが。

FDVRF を GRT にする

これは単純に、IKE phase.1 の設定(ISAKMP の設定)で、vrf FDVRF と書いていたところを削るだけです。ISAKMP 設定でルーティングインスタンスを明示しない場合はデフォルトで GRT を使うってだけですね。

crypto keyring branch1-keyring
  pre-shared-key address 198.51.100.254 key branch1key
!
crypto keyring branch2-keyring
  pre-shared-key address 203.0.113.254 key branch2key
!

crypto isakmp profile branch1-isakmp-profile
   keyring branch1-keyring
   match identity address 198.51.100.254
!
crypto isakmp profile branch2-isakmp-profile
   keyring branch2-keyring
   match identity address 203.0.113.254
!

Branch と BGP で経路交換する

トンネルができたら、前回 static route 指定でやっていた経路情報設定を BGP による情報交換で行います。BGP を使う上で AS 番号(AS Number, ASN)などの割り当てが必要なので、以下のようにしておきます。

  • ASN の割り当てに合わせて VRF RD の値も変える
  • loopbackもつける (route-id としても使う)
  • この後経路制御とかいじるとき、経路がいくつか見えた方が面白いので branch1/2(rtr1/2)にローカルセグメント(branch[12]-internal2)を追加する


BGP 設定

rtr1/2/7 の各ルータは、GRT にデフォルトルートをひとつだけ (internet へ出るための経路だけ)持ちます。

  • rtr1 (branch1)
rtr1#sh run | section router bgp
router bgp 64601
 bgp router-id 10.1.0.1
 bgp log-neighbor-changes
 neighbor 169.254.1.1 remote-as 64512
 neighbor 169.254.1.1 update-source Tunnel1
 neighbor 169.254.1.1 timers 10 30 30
 !
 address-family ipv4
  network 10.1.0.1 mask 255.255.255.255
  network 10.1.1.0 mask 255.255.255.0
  network 10.1.2.0 mask 255.255.255.0
  neighbor 169.254.1.1 activate
  neighbor 169.254.1.1 soft-reconfiguration inbound
 exit-address-family
rtr1#
  • rtr2 (branch2)
rtr2#sh run | section router bgp
router bgp 64602
 bgp router-id 10.2.0.1
 bgp log-neighbor-changes
 neighbor 169.254.2.1 remote-as 64512
 neighbor 169.254.2.1 update-source Tunnel1
 neighbor 169.254.2.1 timers 10 30 30
 !
 address-family ipv4
  network 10.2.0.1 mask 255.255.255.255
  network 10.2.1.0 mask 255.255.255.0
  network 10.2.2.0 mask 255.255.255.0
  neighbor 169.254.2.1 activate
  neighbor 169.254.2.1 soft-reconfiguration inbound
 exit-address-family
rtr2#
  • rtr7
rtr7#sh run | section router bgp
router bgp 64512
 no synchronization
 bgp router-id 10.0.0.0
 bgp log-neighbor-changes
 no auto-summary
 !
 address-family ipv4 vrf branch1-vrf
  no synchronization
  bgp router-id 10.1.0.0
  redistribute connected
  neighbor 169.254.1.2 remote-as 64601
  neighbor 169.254.1.2 update-source Tunnel1
  neighbor 169.254.1.2 timers 10 30 30
  neighbor 169.254.1.2 activate
  neighbor 169.254.1.2 soft-reconfiguration inbound
 exit-address-family
 !
 address-family ipv4 vrf branch2-vrf
  no synchronization
  bgp router-id 10.2.0.0
  redistribute connected
  neighbor 169.254.2.2 remote-as 64602
  neighbor 169.254.2.2 update-source Tunnel2
  neighbor 169.254.2.2 timers 10 30 30
  neighbor 169.254.2.2 activate
  neighbor 169.254.2.2 soft-reconfiguration inbound
 exit-address-family
rtr7#
rtr7/GRT

loopbackとインターネット接続用のセグメントだけ見えます。

rtr7#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, + - replicated route

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
      10.0.0.0/32 is subnetted, 1 subnets
C        10.0.0.0 is directly connected, Loopback0
      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#
rtr7/branch1-vrf

branch1 の情報だけ見えます。

rtr7#sh ip route vrf branch1-vrf
Routing Table: branch1-vrf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 6 subnets, 2 masks
C        10.1.0.0/32 is directly connected, Loopback1
B        10.1.0.1/32 [20/0] via 169.254.1.2, 00:08:03
B        10.1.1.0/24 [20/0] via 169.254.1.2, 00:08:03
B        10.1.2.0/24 [20/0] via 169.254.1.2, 00:03:01
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#

BGPで(/^B/の行) rtr1 (branch1)が広告している経路を受信してます。

rtr7#sh bgp all neighbors 169.254.1.2 received-routes
For address family: VPNv4 Unicast
BGP table version is 11, local router ID is 10.0.0.0
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 64512:1 (default for vrf branch1-vrf) VRF Router ID 10.1.0.0
*  10.1.0.1/32      169.254.1.2              0             0 64601 i
*  10.1.1.0/24      169.254.1.2              0             0 64601 i
*  10.1.2.0/24      169.254.1.2              0             0 64601 i

Total number of prefixes 3
rtr7#

rtr1(branch1)に対しては、redistribute connected で以下の経路を広告します。

rtr7#sh bgp all neighbors 169.254.1.2 advertised-routes
For address family: VPNv4 Unicast
BGP table version is 11, local router ID is 10.0.0.0
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 64512:1 (default for vrf branch1-vrf) VRF Router ID 10.1.0.0
*> 10.1.0.0/32      0.0.0.0                  0         32768 ?
*> 10.1.10.0/24     0.0.0.0                  0         32768 ?
*> 169.254.1.0/30   0.0.0.0                  0         32768 ?

Total number of prefixes 3
rtr7#
rtr7/branch2-vrf

rtr7/branch2-vrf も同様に branch2 の経路だけ見えます。

rtr1(branch1)

rtr7(HQ) の branch1 経路(10.1.0.0/32, 10.1.10.0/24) が BGP で見えています。

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
      10.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
B        10.1.0.0/32 [20/0] via 169.254.1.1, 00:20:51
C        10.1.0.1/32 is directly connected, Loopback0
C        10.1.1.0/24 is directly connected, Vlan911
L        10.1.1.1/32 is directly connected, Vlan911
C        10.1.2.0/24 is directly connected, Vlan912
L        10.1.2.1/32 is directly connected, Vlan912
B        10.1.10.0/24 [20/0] via 169.254.1.1, 00:20:51
      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#

ルート漏洩による branch1-branch2 の接続

現状、branch1, branch2 は別システムなので相互に分離されています (そのために VRF を使ったわけだし)。試しに branch1-vrf, branch2-vrf 間のルート漏洩を行って branch1/branch2 を相互接続させてみます。

rtr7(HQ) の VRF 設定を以下のように変更します。

ip vrf branch1-vrf
 rd 64512:1
 route-target export 64512:1
 route-target import 64512:1
 route-target import 64512:2
!
ip vrf branch2-vrf
 rd 64512:2
 route-target export 64512:2
 route-target import 64512:1
 route-target import 64512:2
!
rtr7/branch1-vrf
rtr7#sh ip route vrf branch1-vrf
Routing Table: branch1-vrf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 11 subnets, 2 masks
C        10.1.0.0/32 is directly connected, Loopback1
B        10.1.0.1/32 [20/0] via 169.254.1.2, 00:24:00
B        10.1.1.0/24 [20/0] via 169.254.1.2, 00:24:00
B        10.1.2.0/24 [20/0] via 169.254.1.2, 00:24:00
C        10.1.10.0/24 is directly connected, Vlan901
L        10.1.10.1/32 is directly connected, Vlan901
B        10.2.0.0/32 is directly connected, 00:00:51, Loopback2
B        10.2.0.1/32 [20/0] via 169.254.2.2 (branch2-vrf), 00:00:51
B        10.2.1.0/24 [20/0] via 169.254.2.2 (branch2-vrf), 00:00:51
B        10.2.2.0/24 [20/0] via 169.254.2.2 (branch2-vrf), 00:00:51
B        10.2.10.0/24 is directly connected, 00:00:51, Vlan902
      169.254.0.0/16 is variably subnetted, 3 subnets, 2 masks
C        169.254.1.0/30 is directly connected, Tunnel1
L        169.254.1.1/32 is directly connected, Tunnel1
B        169.254.2.0/30 is directly connected, 00:00:51, Tunnel2
  • branch1-vrf からは branch1/2 のすべての経路が見えるようになります。
  • branch1-vrf からは rtr1/2, branch2-vrf にあるすべてのセグメントと通信ができるようになります。
rtr1
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
      10.0.0.0/8 is variably subnetted, 12 subnets, 2 masks
B        10.1.0.0/32 [20/0] via 169.254.1.1, 00:24:22
C        10.1.0.1/32 is directly connected, Loopback0
C        10.1.1.0/24 is directly connected, Vlan911
L        10.1.1.1/32 is directly connected, Vlan911
C        10.1.2.0/24 is directly connected, Vlan912
L        10.1.2.1/32 is directly connected, Vlan912
B        10.1.10.0/24 [20/0] via 169.254.1.1, 00:24:22
B        10.2.0.0/32 [20/0] via 169.254.1.1, 00:01:22
B        10.2.0.1/32 [20/0] via 169.254.1.1, 00:01:22
B        10.2.1.0/24 [20/0] via 169.254.1.1, 00:01:22
B        10.2.2.0/24 [20/0] via 169.254.1.1, 00:01:22
B        10.2.10.0/24 [20/0] via 169.254.1.1, 00:01:22
      169.254.0.0/16 is variably subnetted, 3 subnets, 2 masks
C        169.254.1.0/30 is directly connected, Tunnel1
L        169.254.1.2/32 is directly connected, Tunnel1
B        169.254.2.0/30 [20/0] via 169.254.1.1, 00:01:22
      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#
  • rtr1(branch1) からも rtr2(branch2), rtr7(HQ)/branch2 のすべてのセグメントが見えるようになります。
  • rtr1 からは、 rtr2/7, branch2-vrf にあるすべてのセグメントと通信ができるようになります。

rtr7 (AS64512) は単純にトランジットとして動作しています。

  • rtr1(branch1)で受信している BGP 経路の AS-PATH 情報を見ると、以下のように、rtr2(branch2) のセグメントは AS64602(rtr2) → AS64512(rtr7) を経由して届いています。
rtr1#sh bgp ipv4 unicast topology *
For address family: IPv4 Unicast

BGP table version is 37, local router ID is 10.1.0.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, m multipath, b backup-path, x best-external, f RT-Filter
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*> 10.1.0.0/32      169.254.1.1              0             0 64512 ?
*> 10.1.0.1/32      0.0.0.0                  0         32768 i
*> 10.1.1.0/24      0.0.0.0                  0         32768 i
*> 10.1.2.0/24      0.0.0.0                  0         32768 i
*> 10.1.10.0/24     169.254.1.1              0             0 64512 ?
*> 10.2.0.0/32      169.254.1.1                            0 64512 ?
*> 10.2.0.1/32      169.254.1.1                            0 64512 64602 i
*> 10.2.1.0/24      169.254.1.1                            0 64512 64602 i
*> 10.2.2.0/24      169.254.1.1                            0 64512 64602 i
*> 10.2.10.0/24     169.254.1.1                            0 64512 ?
r> 169.254.1.0/30   169.254.1.1              0             0 64512 ?
*> 169.254.2.0/30   169.254.1.1                            0 64512 ?
rtr1#

ルート漏洩による branch1-branch2 経路制御

VRF なので、あとは各種フィルタによって、どことどこをルーティングするかを制御できるようになります。たとえば、rtr2 にある branch2-internal2 セグメントは branch2 のみアクセス可能で、branch1(branch2以外のほかのbranch) からはアクセスさせたくない場合、以下のようにルート漏洩設定のフィルタをかけて、branch1 から branch2-internal2 セグメントの経路が見えないようにしてやればよいわけです。

ip vrf branch2-vrf
 no route-target export 64512:2
 export map BRANCH2_EXPORT_MAP
!
route-map BRANCH2_EXPORT_MAP permit 10
 match ip address BRANCH2_EXPORT_ACL
 set extcommunity rt 64512:2
!
ip access-list standard BRANCH2_EXPORT_ACL
 deny 10.2.2.0 0.0.0.255
 permit any
!
rtr7/branch1-vrf

branch1-vrf から branch2-internal2 (10.2.2.0/24) が見えなくなっています。

rtr7#sh ip route vrf branch1-vrf
Routing Table: branch1-vrf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 10 subnets, 2 masks
C        10.1.0.0/32 is directly connected, Loopback1
B        10.1.0.1/32 [20/0] via 169.254.1.2, 00:03:06
B        10.1.1.0/24 [20/0] via 169.254.1.2, 00:03:06
B        10.1.2.0/24 [20/0] via 169.254.1.2, 00:03:06
C        10.1.10.0/24 is directly connected, Vlan901
L        10.1.10.1/32 is directly connected, Vlan901
B        10.2.0.0/32 is directly connected, 00:02:43, Loopback2
B        10.2.0.1/32 [20/0] via 169.254.2.2 (branch2-vrf), 00:03:06
B        10.2.1.0/24 [20/0] via 169.254.2.2 (branch2-vrf), 00:03:06
B        10.2.10.0/24 is directly connected, 00:02:43, Vlan902
      169.254.0.0/16 is variably subnetted, 3 subnets, 2 masks
C        169.254.1.0/30 is directly connected, Tunnel1
L        169.254.1.1/32 is directly connected, Tunnel1
B        169.254.2.0/30 is directly connected, 00:02:43, Tunnel2
rtr7#

同様に rtr1(branch1) からも branch2-internal2 は見えなくなります。

rtr1#sh ip route 10.2.2.1

% Subnet not in table
rtr1#

branch2-internal1 は見えてます。

rtr1#sh ip route 10.2.1.1
Routing entry for 10.2.1.0/24
  Known via "bgp 64601", distance 20, metric 0
  Tag 64512, type external
  Last update from 169.254.1.1 00:05:45 ago
  Routing Descriptor Blocks:
  * 169.254.1.1, from 169.254.1.1, 00:05:45 ago
      Route metric is 0, traffic share count is 1
      AS Hops 2
      Route tag 64512
      MPLS label: none
rtr1#
rtr7/branch2-vrf

branch2-vrf からは branch2 のすべての経路が見えます。

rtr7#sh ip route vrf branch2-vrf
Routing Table: branch2-vrf
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 11 subnets, 2 masks
B        10.1.0.0/32 is directly connected, 00:03:44, Loopback1
B        10.1.0.1/32 [20/0] via 169.254.1.2 (branch1-vrf), 00:04:07
B        10.1.1.0/24 [20/0] via 169.254.1.2 (branch1-vrf), 00:04:07
B        10.1.2.0/24 [20/0] via 169.254.1.2 (branch1-vrf), 00:04:07
B        10.1.10.0/24 is directly connected, 00:03:44, Vlan901
C        10.2.0.0/32 is directly connected, Loopback2
B        10.2.0.1/32 [20/0] via 169.254.2.2, 00:04:07
B        10.2.1.0/24 [20/0] via 169.254.2.2, 00:04:07
B        10.2.2.0/24 [20/0] via 169.254.2.2, 00:04:07
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, 3 subnets, 2 masks
B        169.254.1.0/30 is directly connected, 00:03:44, Tunnel1
C        169.254.2.0/30 is directly connected, Tunnel2
L        169.254.2.1/32 is directly connected, Tunnel2
rtr7#

ルータコンフィグ

各ルータのコンフィグは gist に置いておきます。

注意

  • 今回は各 branch および HQ は異なる ASN を持つという前提でやってます。
    • 複数の branch で同じ ASN を使わなければいけない場合、同一 ASN を持つ BGP process 間で iBGP を…とかあれこれが出るのでややこしくなります。もともとの用途的に branch-HQ 間のみのスター型接続だけで済ませたい (branch-branch間のパスを用意したくない) という状況だと思うので…。
  • 当たり前なんですが、相互接続する環境内で IP アドレスが一意になる(重複しない)ように注意してください。(アドレスが重複するシステムをVRFで分けて収容している場合は、それらのシステムを直接接続することは出ません。)

まとめ

  • せっかくなので IPsec + VRF + BGP というところまで見てみました。
  • VRF はもともと複数の経路情報の分離と制御のためにある機能なので、VRF 間でどういった経路情報をやりとりするかを設定することで、分離したり通信可能にしたりを制御できます。