现在 SR 已经成为了底层网络架构的趋势,所以我这次在 SR-MPLS 的基础上来做 MPLS 跨域 Option-C.2 VPN.
由于网上的教程已经一抓一大把了,所以我们这次着重来描述 SR 域内跨域标签的传递过程。
网络拓扑如下:
图中 AS 65000 和 AS 65001 各为一组自治域,R3, R6 各为其边界的 ASBR. 自治域内各开启了 SR-MPLS 作为 Underlay(无 LDP 协议,全部都是 SR)。R1 和 R10 各作为 PE 和各自域内的 RR 建立 VPNv4 IBGP 邻居, RR 之间建立 EBGP 邻居(但不改变下一跳),通过在 RR 上重写 ext-community 的方式来实现本自治域内的路由器导入对方自治域 VPNv4 路由的功能。
如果想了解在 LDP 网络下的配置,请访问思科的官网:
Configure Inter-AS Option C MPLS VPN With Cisco IOS and Cisco IOS-XR
由于 SR 网络内不能像 LDP 一样自动为重分布进来的路由产生标签,所以我们使用 BGP Labeled-unicast 来传递对端 PE 的标签。
配置前检查:
RP/0/RP0/CPU0:XTC-PCE-AS65000#show isis segment-routing label table // 查看 segment-routing table Wed Jun 30 13:05:24.264 UTC IS-IS 1 IS Label Table Label Prefix Interface ---------- ---------------- --------- 16001 10.0.0.1/32 16002 10.0.0.2/32 16003 10.0.0.3/32 16004 10.0.0.4/32 16005 10.0.0.5/32 16101 10.0.1.1/32 Loopback0 RP/0/RP0/CPU0:XTC-PCE-AS65000#show bgp vpnv4 unicast summary // 查看 RR 和 PE 的 VPNv4 邻居关系 {..snip..} Neighbor Spk AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down St/PfxRcd 10.0.0.1 0 65000 225 197 3 0 0 02:40:16 1
我们开始来配置 ASBR 之间的 labeled-unicast 邻居关系:
R3#show run | sec router bgp router bgp 65000 bgp router-id 10.0.0.3 bgp log-neighbor-changes neighbor 10.0.1.1 remote-as 65000 // 与路由反射器的邻居关系 neighbor 10.0.1.1 update-source Loopback0 neighbor 10.10.36.6 remote-as 65001 // 与对端 ASBR 的邻居关系 ! address-family ipv4 network 10.0.0.1 mask 255.255.255.255 network 10.0.1.1 mask 255.255.255.255 neighbor 10.0.1.1 activate neighbor 10.0.1.1 next-hop-self // 发送 labeled-unicast 路由时,将下一跳改为自己 neighbor 10.0.1.1 prefix-list foreign_prefixes out // 只给路由反射器发送从对端接收到的路由(这个配不配无所谓) neighbor 10.0.1.1 send-label // 给 RR 的邻居关系激活 labeled-unicast NLRI neighbor 10.10.36.6 activate neighbor 10.10.36.6 route-map set-label out // 向对方 ASBR 发送路由时,指定 PE 的环回口路由携带 label,其余不携带 neighbor 10.10.36.6 send-label // 激活 labeled-unicast NLRI exit-address-family R3#show ip prefix-list ip prefix-list foreign_prefixes: 2 entries seq 5 permit 10.0.0.10/32 // 匹配对方 PE 的环回口路由 seq 10 permit 10.0.1.2/32 // 匹配对方的 RR 环回口路由 ip prefix-list set-label: 1 entries seq 5 permit 10.0.0.1/32 // 发送给对方的时候,只有该路由(我方 PE 的环回口路由)携带 label R3#show route-map set-label route-map set-label, permit, sequence 100 Match clauses: ip address prefix-lists: set-label Set clauses: mpls label // match prefix-list 后设置 mpls 标签 Policy routing matches: 0 packets, 0 bytes route-map set-label, permit, sequence 200 Match clauses: Set clauses: Policy routing matches: 0 packets, 0 bytes
由于 SR 不支持自动产生标签(都是靠手动配置 SRGB + Index 来实现标签分发) 所以我们需要用 BGP 来传递中间标签( BGP-LU 标签 )以保证数据包能跨越 ASBR 到达对方网内。之前都是通过 LDP 自动生成的 LSP 来跨越,但是 SR 自治域内不行,必须通过 BGP-LU 将标签包送到 PE 以保证对端 PE/RR 可达性。
RR *不需要* 将 BGP-LU 路由再次反射给其他的 ASBR,只需要反射给 PE 即可。要达到这一点,只需要和 ASBR 之间的邻居不启动 Route-reflector-client 即可( 路由反射器关系之间,非客户端不会传非客户端)
我们将自己的本自治域内的 PE/RR 环回口路由发给对方,并接收对方 RR/PE 环回口路由后,在 RR 上和对方 RR 建立 EBGP VPNv4 邻居,并配置 ext-community 重写:
// 配置 AS 65000 域内的路由反射器: RP/0/RP0/CPU0:XTC-PCE-AS65000#show run router bgp Wed Jun 30 15:03:10.852 UTC router bgp 65000 bgp router-id 10.0.1.1 address-family ipv4 unicast // 激活 BGP 进程的 IPv4 Unicast AF ! address-family vpnv4 unicast // 激活 BGP 进程的 VPNv4 Unicast AF ! neighbor 10.0.0.1 remote-as 65000 update-source Loopback0 address-family ipv4 labeled-unicast // 激活和 PE 的 Labeled-Unicast NLRI,将从 ASBR 收到的标签信息传送给 PE route-reflector-client // 激活路由反射器,以保证从 ASBR 收到的信息能反射给 iBGP 邻居 ( RR 非客户端可传客户端 ) ! address-family vpnv4 unicast // 激活 VPNv4 Unicast AF,传送 L3VPN 路由信息 route-policy pass in // IBGP 其实可以不用配置,但是这是我个人习惯 route-reflector-client route-policy pass out ! ! neighbor 10.0.0.3 remote-as 65000 update-source Loopback0 address-family ipv4 labeled-unicast // 激活与 ASBR 的 Labeled-Unicast NLRI,从 ASBR 接受标签信息 ! ! neighbor 10.0.0.5 remote-as 65000 update-source Loopback0 address-family ipv4 labeled-unicast // 激活与 ASBR 的 Labeled-Unicast NLRI,从 ASBR 接受标签信息 ! ! neighbor 10.0.1.2 // 与对方的域内的 RR 建立邻居关系 remote-as 65001 ebgp-multihop 255 // 开启 ebgp multihop 功能,因为 ebgp ttl 默认为 1 update-source Loopback0 // 使用 loopback 0 接口和对方建立邻居关系 address-family vpnv4 unicast route-policy rt_rewrite in // 调用 RPL Policy,重写收到的 ext-community,保证 PE 能收到对方域内的 VPNv4 信息后能导入 route-policy pass out // 发送我方的 VPNv4 信息。因为在 IOS-XR 内,邻居关系是 ebgp 的话,如果不写就不会发送任何信息 next-hop-unchanged // 不要改变下一跳信息。默认情况下,传送给 ebgp 邻居的 BGP 路由信息会改变成自己,这里让系统保持下一跳信息依旧是 PE 环回口,不改变下一跳。 ! ! ! RP/0/RP0/CPU0:XTC-PCE-AS65000# show rpl Wed Jun 30 15:03:15.127 UTC route-policy pass pass end-policy ! route-policy rt_rewrite if extcommunity rt matches-within (65001:100) then set extcommunity rt (65000:100) pass else pass endif end-policy // 简单的 RT 重写规则 !
将 AS 65001 内的路由反射器也按类似配置进行配置,我们在 PE 上看一下标签信息以及路由信息:
R1# show bgp vpnv4 unicast vrf client 192.168.1.0/24 // 查看 VPNv4 路由 BGP routing table entry for 10.0.0.1:100:192.168.1.0/24, version 12 Paths: (1 available, best #1, table client) Flag: 0x100 Not advertised to any peer Refresh Epoch 1 65001, imported path from 10.0.0.10:100:192.168.1.0/24 (global) 10.0.0.10 (metric 25) (via default) from 10.0.1.1 (10.0.1.1) Origin IGP, localpref 100, valid, internal, best Extended Community: RT:65000:100 // 重写 RT mpls labels in/out nolabel/19 // VPN label rx pathid: 0, tx pathid: 0x0 Updated on Jun 30 2021 10:59:35 UTC R1# show ip route 10.0.0.10 // VPNv4 下一跳路由 Routing entry for 10.0.0.10/32 Known via "bgp 65000", distance 200, metric 25 Tag 65001, type internal Last update from 10.0.0.5 04:24:48 ago Routing Descriptor Blocks: * 10.0.0.5, from 10.0.1.1, 04:24:48 ago // 下一跳为 ASBR opaque_ptr 0x7F5D8B19ED28 Route metric is 25, traffic share count is 1 AS Hops 1 Route tag 65001 MPLS label: 18 // 通过 BGP 学习到的下一跳标签( BGP-LU ) R1#show ip route 10.0.0.5 // 查看 ASBR 的路由 Routing entry for 10.0.0.5/32 Known via "isis", distance 115, metric 25, type level-2 Redistributing via isis 1 Last update from 10.10.14.4 on GigabitEthernet6, 2d18h ago SR Incoming Label: 16005 Routing Descriptor Blocks: * 10.10.14.4, from 10.0.0.5, 2d18h ago, via GigabitEthernet6, prefer-non-rib-labels, merge-labels Route metric is 25, traffic share count is 1 MPLS label: 16005 // SR Label MPLS Flags: NSF
学习的信息都是正确的,我们开始从 PE 上测试路径:
R1#traceroute vrf client 192.168.1.2 source 192.168.0.1 Type escape sequence to abort. Tracing the route to 192.168.1.2 VRF info: (vrf in name/id, vrf out name/id) 1 10.10.14.4 [MPLS: Labels 16005/18/19 Exp 0] 20 msec 5 msec 6 msec 2 10.10.45.5 [MPLS: Labels 18/19 Exp 0] 14 msec 4 msec 7 msec 3 10.10.58.8 [MPLS: Labels 16010/19 Exp 0] 5 msec 4 msec 6 msec 4 10.10.89.9 [MPLS: Labels 16010/19 Exp 0] 6 msec 5 msec 4 msec 5 192.168.1.1 11 msec 3 msec 3 msec 6 192.168.1.2 4 msec 4 msec 4 msec
可以看到标签是三层,我们来分析一下标签组成:
- 首先 PE 压入最底层的 VPN 标签,19
- 查看 VPN 路由的下一跳 10.0.0.10,携带 MPLS 标签 18,压入中间标签
- 再查看 10.0.0.10 的下一跳是 10.0.0.5,lookup 可知 SR 标签为 16005,压入
所以路径标签是 16005 | 18 | 19
再讲一下转发过程:
- 首先根据 16005 转发到 ASBR R5(倒数第二跳弹掉 16005 后发送给 R5)
- R5 根据中层标签,查询 MPLS 转发表,发现是下一跳是对端的 ASBR,替换掉标签至 16010 (从 BGP 学习得到 )
- 进入 AS 65001 域内,ASBR 根据顶层标签 16010 转发到 R10 (倒数第二跳弹出后发给 PE)
- 数据包到达 PE,解析 VPN 标签后,根据路由/ARP 表查询,发送给 CE 或自己处理
最后我们在 CE 上做一下 traceroute:
root@Client-A:~# mtr 192.168.1.2 --report -n Start: 2021-06-30T16:17:10+0000 HOST: localhost Loss% Snt Last Avg Best Wrst StDev 1.|-- 192.168.0.1 0.0% 10 0.9 1.2 0.5 5.5 1.5 2.|-- 10.10.14.4 0.0% 10 6.7 11.7 6.7 16.7 3.5 3.|-- 10.10.45.5 0.0% 10 6.8 7.6 4.5 16.8 3.6 4.|-- 10.10.58.8 0.0% 10 5.9 7.7 4.9 12.9 2.5 5.|-- 10.10.89.9 0.0% 10 3.9 7.1 3.6 12.3 2.9 6.|-- 192.168.1.1 0.0% 10 10.4 9.0 4.6 13.0 3.0 7.|-- 192.168.1.2 0.0% 10 6.2 6.0 3.6 9.7 2.1
基于 SR 的 MPLS VPN Option-C 搭建完成。
《[ BGP ] 搭建基于 Segment Routing 的 MPLS VPN Option-C.2》有1个想法
有人知道他在说什么吗