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#
注意
- 今回は各 branch および HQ は異なる ASN を持つという前提でやってます。
- 複数の branch で同じ ASN を使わなければいけない場合、同一 ASN を持つ BGP process 間で iBGP を…とかあれこれが出るのでややこしくなります。もともとの用途的に branch-HQ 間のみのスター型接続だけで済ませたい (branch-branch間のパスを用意したくない) という状況だと思うので…。
- 当たり前なんですが、相互接続する環境内で IP アドレスが一意になる(重複しない)ように注意してください。(アドレスが重複するシステムをVRFで分けて収容している場合は、それらのシステムを直接接続することは出ません。)
まとめ
- せっかくなので IPsec + VRF + BGP というところまで見てみました。
- VRF はもともと複数の経路情報の分離と制御のためにある機能なので、VRF 間でどういった経路情報をやりとりするかを設定することで、分離したり通信可能にしたりを制御できます。
- 詳細は ルータ2台で始めるVRF入門(3) 〜 ルータ2台で始めるVRF入門(6) あたりを読んでみてください。