菜单

[ BGP ] 搭建基于 Segment Routing 的 MPLS VPN Option-C.2

2021年7月1日 - BGP

现在 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

可以看到标签是三层,我们来分析一下标签组成:

所以路径标签是 16005 | 18 | 19

再讲一下转发过程:

最后我们在 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个想法

任大爷

有人知道他在说什么吗

回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据