ルータ2台で始めるVRF入門(7)

ルート漏洩(3): GRT-VRF間ルート漏洩(2)

1年弱くらい前に6回シリーズでルータ2台で始めるVRF入門という記事を書いていたのですが、今回はその続編です。きっかけは、

というこんごーさんからの Mention でした。

第4回: ルート漏洩(2): GRT-VRF間ルート漏洩では、GRT/VRF 間でのルート漏洩の話を取り上げたのですが、このときは GRT の経路を VRF へインポートする、という片方向の経路設定しかできず、GRT-VRF 間で通信できるようにする、というのは非常にやりにくい状態ですよ、という話をしていました。しかし、IOS 15.2(4)S より "BGP Support for IP Prefix Export from a VRF Table into the Global Table" という機能が実装されているそうなのです(2012/07/25)。

せっかくシリーズここまでVRFの話を取り上げてきたわけで、これは試しておかねばなるまい、と。……というのと、12月に Cisco892J の中古が出ていたので買っちゃったんだよね…これはこれで活用する必要があるだろうということもあり、ちょっと試してみました。この記事は ルータ2台で始めるVRF入門 第4回: ルート漏洩(2): GRT-VRF間ルート漏洩 の続きになります。

機材と構成

構成は以前と同様です。

ただし、使っている機材とIOSが異なります。今回は、Cisco 892J, IOS 15.3(1)T です。

復習(GRT-VRF間ルート漏洩)

まず、第4回で試してみた、GRTの経路をVRFへインポートする、というところまで持っていきます。(詳細は第4回記事参照)

設定(exprtr01)
  • BGP
router bgp 64601
 bgp router-id 10.0.0.0
 bgp log-neighbor-changes
 no bgp default ipv4-unicast
 !
 address-family ipv4
  redistribute connected
  redistribute static
 exit-address-family
 !
 address-family ipv4 vrf expvrf01
  redistribute connected
 exit-address-family
 !
 address-family ipv4 vrf expvrf02
  bgp router-id 10.0.0.2
  redistribute connected
  neighbor 10.2.2.2 remote-as 64601
  neighbor 10.2.2.2 update-source Vlan722
  neighbor 10.2.2.2 activate
 exit-address-family
 !
 address-family ipv4 vrf expvrf03
  redistribute connected
  redistribute ospf 64601
 exit-address-family
!
  • VRF(expvrf01: Hub-VRF)
ip vrf expvrf01
 rd 64601:1
 import ipv4 unicast map GRT_MAP
 route-target export 64601:1
 route-target import 64601:1
 route-target import 64601:2
 route-target import 64601:3
!
ip prefix-list GRT_PREFIX seq 5 permit 10.1.0.0/24
ip prefix-list GRT_PREFIX seq 10 permit 10.2.0.0/24
ip prefix-list GRT_PREFIX seq 15 permit 10.3.0.0/24
ip prefix-list GRT_PREFIX seq 20 permit 10.0.0.0/28 le 32
!
route-map GRT_MAP permit 10
 match ip address prefix-list GRT_PREFIX
!
設定(exprtr02)

GRT 部分は static routing を使っています。以前の記事では、expvrf01,VLAN801(10.1.1.1) → exprtr02(GRT),VLAN810(10.3.0.1) に ICMP 撃ってみて片側にしか行かない、というのを見ていたのですが、これだけだと実はダメです。exprtr01(GRT)で仮に expvrf01 の経路情報を持っていても、exprtr02(GRT) では expvrf01 の経路に対する Next Hop を解決できないんだよね。

なので、expvrf02(GRT) にはあらかじめデフォルトルートを設定しておく必要があります。

exprtr2#sh run | inc ip route
ip route 0.0.0.0 0.0.0.0 10.2.0.1
ip route 10.0.0.0 255.255.255.255 10.2.0.1
ip route 10.1.0.0 255.255.255.0 10.2.0.1
ip route vrf mgmt 0.0.0.0 0.0.0.0 192.168.250.1
exprtr2#
確認(経路)
  • expvrf01(GRT)の経路 : 他のVRFの経路は入ってこない
exprtr1#sh ip route
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
C        10.0.0.0/32 is directly connected, Loopback0
S        10.0.0.10/32 [1/0] via 10.2.0.2
C        10.1.0.0/24 is directly connected, Vlan800
L        10.1.0.1/32 is directly connected, Vlan800
C        10.2.0.0/24 is directly connected, Vlan720
L        10.2.0.1/32 is directly connected, Vlan720
S        10.3.0.0/24 [1/0] via 10.2.0.2
exprtr1#
  • expvrf01 (Hub-VRF) の経路 : GRTの経路も入ってくる
exprtr1#sh ip route vrf expvrf01

Routing Table: expvrf01
(略)
Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 26 subnets, 2 masks
B        10.0.0.0/32 is directly connected, 00:03:53, Loopback0
C        10.0.0.1/32 is directly connected, Loopback1
B        10.0.0.2/32 is directly connected (expvrf02), 00:13:53, Loopback2
B        10.0.0.3/32 is directly connected (expvrf03), 00:13:25, Loopback3
B        10.0.0.10/32 [20/0] via 10.2.0.2, 00:03:53
B        10.0.0.12/32 [200/0] via 10.2.2.2 (expvrf02), 00:13:53
B        10.0.0.13/32 [20/2] via 10.2.3.2 (expvrf03), 00:13:25, Vlan723
B        10.1.0.0/24 is directly connected, 00:03:53, Vlan800
L        10.1.0.1/32 is directly connected, Vlan800
C        10.1.1.0/24 is directly connected, Vlan801
L        10.1.1.1/32 is directly connected, Vlan801
B        10.1.2.0/24 is directly connected (expvrf02), 00:13:53, Vlan802
L        10.1.2.1/32 is directly connected, Vlan802
B        10.1.3.0/24 is directly connected (expvrf03), 00:13:25, Vlan803
L        10.1.3.1/32 is directly connected, Vlan803
B        10.2.0.0/24 is directly connected, 00:03:53, Vlan720
L        10.2.0.1/32 is directly connected, Vlan720
B        10.2.2.0/24 is directly connected (expvrf02), 00:13:53, Vlan722
L        10.2.2.1/32 is directly connected, Vlan722
B        10.2.3.0/24 is directly connected (expvrf03), 00:13:25, Vlan723
L        10.2.3.1/32 is directly connected, Vlan723
B        10.3.0.0/24 [20/0] via 10.2.0.2, 00:03:53
B        10.3.2.0/24 [200/0] via 10.2.2.2 (expvrf02), 00:13:53
B        10.3.3.0/24 [20/2] via 10.2.3.2 (expvrf03), 00:13:25, Vlan723
B        10.4.2.0/24 [200/0] via 10.2.2.2 (expvrf02), 00:13:53
B        10.4.3.0/24 [20/2] via 10.2.3.2 (expvrf03), 00:13:25, Vlan723
exprtr1#
  • exprtr2(GRT)の経路 : デフォルトルートを設定しておく
exprtr2#sh ip route
(略)
Gateway of last resort is 10.2.0.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 10.2.0.1
      10.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
S        10.0.0.0/32 [1/0] via 10.2.0.1
C        10.0.0.10/32 is directly connected, Loopback0
S        10.1.0.0/24 [1/0] via 10.2.0.1
C        10.2.0.0/24 is directly connected, Vlan720
L        10.2.0.2/32 is directly connected, Vlan720
C        10.3.0.0/24 is directly connected, Vlan810
L        10.3.0.1/32 is directly connected, Vlan810
exprtr2#
確認(ICMP)

この状態で expvrf01 → exprtr02(GRT) へ icmp 撃って片方向にしか経路情報が見えていないので、通信ができないことを確認します。

  • exprtr1
exprtr1#ping vrf expvrf01
Protocol [ip]:
Target IP address: 10.3.0.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: vlan801
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.3.0.1, timeout is 2 seconds:
Packet sent with a source address of 10.1.1.1

*Jan  6 11:54:36.827: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
*Jan  6 11:54:38.827: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
*Jan  6 11:54:40.827: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
*Jan  6 11:54:42.831: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
*Jan  6 11:54:44.831: ICMP: dst (10.1.1.1) host unreachable sent to 10.3.0.1.
Success rate is 0 percent (0/5)
exprtr1#
  • exprtr2
exprtr2#
*Jan  6 11:48:34.851: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:48:34.851: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
*Jan  6 11:48:36.847: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:48:36.847: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
*Jan  6 11:48:38.847: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:48:38.847: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
*Jan  6 11:48:40.851: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:48:40.851: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
*Jan  6 11:48:42.851: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:48:42.851: ICMP: dst (10.3.0.1) host unreachable rcv from 10.2.0.1
exprtr2#
復習のまとめ
  • import map で GRT が持っている経路情報を VRF にインポートすることはできましたが、その逆はできていませんでした。
  • そのため、GRT-VRF間で、ルート漏洩による通信を行う事ができませんでした*1

IP Prefix Export from a VRF Table into the Global Table 実験

設定

VRF 上で import ipv4 の逆、"export ipv4" コマンドが使えるようになりました。使い方もほぼ同様。試しに、expvrf01 の持つ経路を GRT にエクスポートするように設定してみます。

  • exprtr1
!
ip prefix-list VRF1_PREFIX seq 5 permit 10.1.1.0/24
ip prefix-list VRF1_PREFIX seq 10 permit 10.0.0.0/28 le 32
!
route-map VRF1_MAP permit 10
match ip address prefix-list VRF1_PREFIX
!
ip vrf expvrf01
 export ipv4 unicast map VRF1_MAP
!

これだけ。

確認(経路)
  • expvrf01
    • 変化がないので省略
  • exprtr01(GRT)
    • expvrf01の持つ経路情報(10.1.1.X)が現れます。
exprtr1#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, H - NHRP, l - LISP
       a - application route
       + - replicated route, % - next hop override

Gateway of last resort is not set

      10.0.0.0/8 is variably subnetted, 10 subnets, 2 masks
C        10.0.0.0/32 is directly connected, Loopback0
B        10.0.0.1/32 is directly connected, 00:00:06, Loopback1
S        10.0.0.10/32 [1/0] via 10.2.0.2
C        10.1.0.0/24 is directly connected, Vlan800
L        10.1.0.1/32 is directly connected, Vlan800
B        10.1.1.0/24 is directly connected, 00:00:06, Vlan801
L        10.1.1.1/32 is directly connected, Vlan801
C        10.2.0.0/24 is directly connected, Vlan720
L        10.2.0.1/32 is directly connected, Vlan720
S        10.3.0.0/24 [1/0] via 10.2.0.2
exprtr1#
  • exprtr2
    • 変化がないので省略
確認(ICMP)

GRT/VRF 間で相互に経路情報が見えるようになるので、普通に ICMP が通るようになります。

  • exprtr1
exprtr1#ping vrf expvrf01
Protocol [ip]:
Target IP address: 10.3.0.1
Repeat count [5]:
Datagram size [100]:
Timeout in seconds [2]:
Extended commands [n]: y
Source address or interface: vlan801
Type of service [0]:
Set DF bit in IP header? [no]:
Validate reply data? [no]:
Data pattern [0xABCD]:
Loose, Strict, Record, Timestamp, Verbose[none]:
Sweep range of sizes [n]:
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.3.0.1, timeout is 2 seconds:
Packet sent with a source address of 10.1.1.1
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms
exprtr1#
*Jan  6 11:56:53.555: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
*Jan  6 11:56:53.555: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
*Jan  6 11:56:53.555: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
*Jan  6 11:56:53.559: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
*Jan  6 11:56:53.559: ICMP: echo reply rcvd, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 2
exprtr1#
  • exprtr2
exprtr2#
*Jan  6 11:50:51.575: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:50:51.575: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:50:51.575: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:50:51.579: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
*Jan  6 11:50:51.579: ICMP: echo reply sent, src 10.3.0.1, dst 10.1.1.1, topology BASE, dscp 0 topoid 0
exprtr2#

まとめ

  • IOS 15.2(4)S から、"BGP Support for IP Prefix Export from a VRF Table into the Global Table" という feature が実装されています。
    • "export map" コマンドが使えるようになります。
    • "export map" コマンドを使うことで、VRFテーブルにある経路情報を、GRTへ漏洩させることができます。
  • VRF/GRT 間の経路情報は import/export map コマンドで交換できます。これにより、GRT-VRF 間でルート漏洩による通信を行うことができるようになります。

*1:GRT 上で static route で VRF の経路を設定してやれば逆方向が設定できるというのは前回確認したとおりだが、さすがにこれはアドホックすぎるで…。