Skip to main content

eibgp maximum-paths + label mode per-vrf 环路

·5 mins
Table of Contents

环境介绍
#

一个简单的 CE 双上连的 VPN 环境,客户路由 8.8.8.8/32 将送到 r1。

r1 配置 maximum-path,使去往 ce 的流量可以在 r2/r3 之间负载。

r2/r3 我们都配置了 eibgp maximum-paths,那么 r2/r3 都会存在两条路由负载(一条是从 ibgp 学了 vpn 路由, 一条是从 vrf 下的 ebgp 学来的路由)。

RP/0/0/CPU0:R2-AS56704#show route vrf 1

B    8.8.8.8/32 [20/0] via 10.1.3.3 (nexthop in vrf default), 00:21:10
                [20/0] via 10.1.24.4, 00:21:10

label mode per-prefix (default)
#

默认情况 r2/r3 都是 default 的标签分配方式, 即不同的 vpn 路由分配的标签都不一样。

RP/0/0/CPU0:R1-AS56704#show cef vrf 1 8.8.8.8/32 | in label
Sun Nov  5 16:07:25.162 UTC
     next hop 10.1.12.2/32 Gi0/0/0/0    labels imposed {ImplNull 24003}
     next hop 10.1.13.3/32 Gi0/0/0/1    labels imposed {ImplNull 24003}

以去往 r2 的流量为例,其 vpn 标签为 24003。数据包到达 r2 后会查询标签转发表,如下:

RP/0/0/CPU0:R2-AS56704#show mpls  forwarding  labels 24003
Sun Nov  5 16:08:40.506 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24003  Unlabelled  8.8.8.8/32[V]      Gi0/0/0/1    10.1.24.4       0
       24003       8.8.8.8/32[V]                   10.1.3.3        0            (!)


RP/0/0/CPU0:R2-AS56704#show mpls  forwarding  labels 24003 detail
Sun Nov  5 16:18:55.223 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24003  Unlabelled  8.8.8.8/32[V]      Gi0/0/0/1    10.1.24.4       0
     Updated: Nov  5 16:18:48.293
     Path Flags: 0x60a0 [  EXT MULT ]
     Version: 38, Priority: 3
     Label Stack (Top -> Bottom): { Unlabelled }
     NHID: 0x0, Encap-ID: N/A, Path idx: 1, Backup path idx: 0, Weight: 0
     MAC/Encaps: 14/14, MTU: 1500
     Outgoing Interface: GigabitEthernet0/0/0/1 (ifhandle 0x00000060)
     Packets Switched: 0

       24004       8.8.8.8/32[V]                   10.1.3.3        0            (!)
     Updated: Nov  5 16:18:48.293
     Path Flags: 0x6180 [  BKUP, NoFwd MULT ]    <<<<<<<<
     Version: 38, Priority: 3
     Label Stack (Top -> Bottom): { 24004 }
     NHID: 0x0, Encap-ID: N/A, Path idx: 0, Backup path idx: 0, Weight: 0
     MAC/Encaps: 0/4, MTU: 0
     Packets Switched: 0
     (!): FRR pure backup    <<<<<<<<

(!)为备份路径,流量只会走第一条,剥离标签,直接从出接口 Gi0/0/0/1 送出。

同理 r3 上的标签转发表也类似也是剥离标签从出接口 Gi0/0/0/0 送出。

RP/0/0/CPU0:R3-AS56704#show mpls  forwarding  labels 24003
Sun Nov  5 16:11:25.436 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24003  Unlabelled  8.8.8.8/32[V]      Gi0/0/0/0    10.1.34.4       0
       24003       8.8.8.8/32[V]                   10.1.2.2        0            (!)

label mode per-vrf
#

RP/0/0/CPU0:R2-AS56704#show configuration  commit  changes last 1
Mon Nov  6 13:47:02.326 UTC
Building configuration...
!! IOS XR Configuration 6.3.1
router bgp 56704
 vrf 1
  address-family ipv4 unicast
   label mode per-vrf

将 r2/r3 的标签分配方式 改为 per-vrf, 这个时候我们看下 r1 上显示的标签如下:

RP/0/0/CPU0:R1-AS56704#show cef vrf 1 8.8.8.8/32 | in label
Sun Nov  5 16:28:56.814 UTC
     next hop 10.1.12.2/32 Gi0/0/0/0    labels imposed {ImplNull 24004}
     next hop 10.1.13.3/32 Gi0/0/0/1    labels imposed {ImplNull 24004}

流量如果到了 r2 上, 会先查 mpls 标签表 24004,如下; 它会剥离标签, 最后再查找下 cef 表,看看究竟该从哪个接口送出。

RP/0/0/CPU0:R2-AS56704#show mpls  forwarding  labels 24004
Sun Nov  5 16:29:43.769 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24004  Aggregate   1: Per-VRF Aggr[V] 1                            0

当你查看 cef 表就会发现, 由于 eibgp maximum-paths 的配置, 我们将有两个路由负载,也就是说部分流量不会直接送往 ce,将会带标签送到 r3.

RP/0/0/CPU0:R2-AS56704#show route vrf 1

B    8.8.8.8/32 [20/0] via 10.1.3.3 (nexthop in vrf default), 00:00:43
                [20/0] via 10.1.24.4, 00:00:43

RP/0/0/CPU0:R2-AS56704#show cef vrf 1 8.8.8.8/32 detail
Sun Nov  5 16:31:23.022 UTC
8.8.8.8/32, version 42, internal 0x1000001 0x0 (ptr 0xa11dd798) [1], 0x0 (0x0), 0x208 (0xa197d0e8)
 Updated Nov  5 16:19:32.900
 Prefix Len 32, traffic index 0, precedence n/a, priority 3
  gateway array (0xa111688c) reference count 1, flags 0x102878, source rib (7), 0 backups
                [1 type 1 flags 0x48441 (0xa15ed298) ext 0x0 (0x0)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Nov  5 15:31:29.808
 LDI Update time Nov  5 15:31:29.808
   via 10.1.3.3/32, 3 dependencies, recursive, bgp-multipath, backup [flags 0x6180]
    path-idx 0 NHID 0x0 [0xa1645798 0x0]
    recursion-via-/32
    next hop VRF - 'default', table - 0xe0000000
    next hop 10.1.3.3/32 via 24001/0/21
     next hop 10.1.23.3/32 Gi0/0/0/2    labels imposed {ImplNull 24004}
   via 10.1.24.4/32, 4 dependencies, recursive, bgp-ext, bgp-multipath [flags 0x60a0]
    path-idx 1 NHID 0x0 [0xa11dd824 0x0]
    next hop 10.1.24.4/32 via 10.1.24.4/32
     next hop 10.1.24.4/32 Gi0/0/0/1    labels imposed {None}


    Load distribution: 0 1 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   Unknown                   24001/0
    1     Y   recursive                 10.1.24.4

而如果 r3 也都配置了 eigbp maximum-paths 和 lable-mode per-vrf, r3 上也会先查标签表剥离标签,查 cef 表有两条路径负载, 环路产生(r2 和 r3 之间)。

RP/0/0/CPU0:R3-AS56704#show mpls  forwarding  labels 24004
Sun Nov  5 16:34:00.653 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24004  Aggregate   1: Per-VRF Aggr[V] 1                            0

RP/0/0/CPU0:R3-AS56704#show cef vrf 1 8.8.8.8/32 detail
Sun Nov  5 16:36:28.863 UTC
8.8.8.8/32, version 35, internal 0x1000001 0x0 (ptr 0xa11e55f4) [1], 0x0 (0x0), 0x208 (0xa197d0b8)
 Updated Nov  5 16:19:33.553
 Prefix Len 32, traffic index 0, precedence n/a, priority 3
  gateway array (0xa111e6e8) reference count 1, flags 0x102878, source rib (7), 0 backups
                [1 type 1 flags 0x48441 (0xa15ed298) ext 0x0 (0x0)]
  LW-LDI[type=0, refc=0, ptr=0x0, sh-ldi=0x0]
  gateway array update type-time 1 Nov  5 15:30:39.934
 LDI Update time Nov  5 15:30:39.934
   via 10.1.2.2/32, 3 dependencies, recursive, bgp-multipath, backup [flags 0x6180]
    path-idx 0 NHID 0x0 [0xa164570c 0x0]
    recursion-via-/32
    next hop VRF - 'default', table - 0xe0000000
    next hop 10.1.2.2/32 via 24000/0/21
     next hop 10.1.23.2/32 Gi0/0/0/2    labels imposed {ImplNull 24004}
   via 10.1.34.4/32, 4 dependencies, recursive, bgp-ext, bgp-multipath [flags 0x60a0]
    path-idx 1 NHID 0x0 [0xa11e5680 0x0]
    next hop 10.1.34.4/32 via 10.1.34.4/32
     next hop 10.1.34.4/32 Gi0/0/0/0    labels imposed {None}


    Load distribution: 0 1 (refcount 1)

    Hash  OK  Interface                 Address
    0     Y   Unknown                   24000/0
    1     Y   recursive                 10.1.34.4

而如果你只在 r2 上修改 label 分配方式为 per-vrf, r3 上保持默认的标签分配方式 per-prefix。

那即使流量在 r2 上仍然会有一半送到 r3, 但由于 per-prefix 的标签分配方式直接有出接口, 在 r3 上会直接转发给 ce,这样也不会出环。

label mode per-ce
#

per-ce 的标签分配方式,其实和 per-prefix 类似, 它是有直接的出接口的, 流量也不需要经过二次查找, 所以没成环的风险。

RP/0/0/CPU0:R2-AS56704#show mpls  forwarding
Sun Nov  5 16:43:33.192 UTC
Local  Outgoing    Prefix             Outgoing     Next Hop        Bytes
Label  Label       or ID              Interface                    Switched
------ ----------- ------------------ ------------ --------------- ------------
24006  Unlabelled  No ID              Gi0/0/0/1    10.1.24.4       0
       Aggregate   No ID              1                            0            (!)


24006  Unlabelled  No ID              Gi0/0/0/1    10.1.24.4       0
     Updated: Nov  5 16:39:36.928
     Path Flags: 0x6080 [  MULT ]
     Version: 15, Priority: 3
     Label Stack (Top -> Bottom): { Unlabelled }
     NHID: 0x0, Encap-ID: N/A, Path idx: 1, Backup path idx: 0, Weight: 0
     MAC/Encaps: 14/14, MTU: 1500
     Outgoing Interface: GigabitEthernet0/0/0/1 (ifhandle 0x00000060)
     Packets Switched: 0

       Aggregate   No ID              1                            0            (!)
     Updated: Nov  5 16:39:36.928
     Path Flags: 0x100 [  BKUP, NoFwd ]
     Label Stack (Top -> Bottom): { }
     MAC/Encaps: 0/0, MTU: 0
     Packets Switched: 0

标签分配方式的总结
#

  • per-prefix 默认的标签分配方式, 缺点为如果分配的标签量很大的情况下,标签的收敛上相对于 ip 的收敛会慢上很多。

  • per-vrf 需要二次查找路由表

eibgp 的使用场景
#

粗略画一个图,siteA 有两个 CE 分别连到一个 PE;siteB 有两个 CE 也分别连到一个 PE。

对于 siteA-CE1 而言, 要访问 siteB 的业务, 默认只会走 PE1→ siteB-CE1, 为了充分的利用 PE2 和 siteB-CE2 之间的链路我们可以在 PE1 上开启 eibgp maximum-paths;

同理 PE2 上也可以开启 eibgp maximum-paths。




Comments