最近遇到一个 Case,大致是下面的场景:

R4 直连 99.10.0.0/24,然后将其重分布到 BGP,再通告给 eBGP 邻居 R2 和 R3。
# R4 Configurations!interface GigabitEthernet5ip address 99.10.0.1 255.255.255.0!router bgp 200bgp router-id 10.0.0.6bgp log-neighbor-changesnetwork 99.10.0.0 mask 255.255.255.0redistribute connectedneighbor 10.2.6.2 remote-as 100neighbor 10.2.6.2 fall-over bfdneighbor 10.2.6.2 soft-reconfiguration inboundneighbor 10.3.6.3 remote-as 100neighbor 10.3.6.3 fall-over bfdneighbor 10.3.6.3 soft-reconfiguration inbound
R2 和 R3 向 R4 通告默认路由。同时,它们在 BGP 里面将 99.10.0.0/24 汇总成 /16 的 prefix。
# R2 Configurations!router bgp 100bgp router-id 10.0.0.2bgp log-neighbor-changesaggregate-address 99.10.0.0 255.255.0.0 summary-onlyneighbor 10.2.6.6 remote-as 200neighbor 10.2.6.6 fall-over bfdneighbor 10.2.6.6 default-originateneighbor 10.2.6.6 soft-reconfiguration inbound
然后 R2 和 R3 再把 BGP 汇总路由重分布到 OSPF。
# R2 Configurations!ip prefix-list BGP-OSPF seq 5 permit 99.10.0.0/16!route-map BGP-OSPF permit 10match ip address prefix-list BGP-OSPF!router ospf 1router-id 10.0.0.2redistribute bgp 100 metric-type 1 route-map BGP-OSPF
问题:出现次优和绕行路由
预期 R1 去往 99.10.0.0/16 应该有 2 条 OSPF ECMP 路径,但实际上只有 1 条路径。
CSR1# show ip route ospf(snip)...99.0.0.0/16 is subnetted, 1 subnetsO E1 99.10.0.0 [110/2] via 10.1.2.2, 01:27:32, GigabitEthernet1
下面分析原因和解法。
检查 R2 的路由表,发现同时存在 24 的明细路由和 16 的汇总路由。其中 16 汇总路由下一跳是 Null0,管理距离为 200,说明 BGP 在对明细路由进行汇总之后,其路由条目就变成了 iBGP。
CSR2# show ip route | include 99.10.0.0B 99.10.0.0/16 [200/0], 01:31:04, Null0B 99.10.0.0/24 [20/0] via 10.2.6.6, 01:31:24
再检查 R3 的路由表,同样存在 24 的明细路由和 16 的汇总路由。其中 24 明细路由是从 R4 学到的,而 16 汇总路由则是通过 OSPF 从 R2 学到的,所以其管理距离为 110。
CSR3# show ip route | include 99.10.0.0O E1 99.10.0.0/16 [110/2] via 10.2.3.2, 01:31:12, GigabitEthernet3B 99.10.0.0/24 [20/0] via 10.3.6.6, 01:45:13CSR3# show ip route bgp | i 99.10.0.0B 99.10.0.0/24 [20/0] via 10.3.6.6, 01:57:55CSR3# show ip bgp | i 99.10.0.0s> 99.10.0.0/24 10.3.6.6 0 0 200 ir> 99.10.0.0/16 0.0.0.0 32768 i
因为 OSPF AD 110 优先于 iBGP AD 200,所以 R3 本地 BGP 汇总的 99.10.0.0/16 无法被安装进 RIB,自然也无法重分布到 OSPF。导致了 R1 去往 99.10.0.0/16 只有 1 条 OSPF 路径。
解法 1:distance ospf external
让 OSPF External 路由的管理距离大于 iBGP AD 200。这样 R3 在收到 R2 通告的 OSPF External 路由的时候,就会将其忽略,而优选本地的 BGP 汇总路由。
R2 更改配置之后的路由表:
CSR2# show run | s r orouter ospf 1router-id 10.0.0.2redistribute bgp 100 metric-type 1 route-map BGP-OSPFdistance ospf external 201CSR2#CSR2# show ip route | i 99.10.0.0B 99.10.0.0/16 [200/0], 01:51:37, Null0B 99.10.0.0/24 [20/0] via 10.2.6.6, 01:51:57
R3 更改配置之后的路由表:
CSR3# show run | s r orouter ospf 1router-id 10.0.0.3redistribute bgp 100 metric-type 1 route-map BGP-OSPFdistance ospf external 201CSR3#CSR3# show ip route | i 99.10.0.0B 99.10.0.0/16 [200/0], 00:03:58, Null0B 99.10.0.0/24 [20/0] via 10.3.6.6, 02:08:18
可以看到 2 台 Border 路由器都优选了 BGP 本地汇总的 AD 200 的 16 Prefix,所以它们都可以成功地被重分布到 OSPF,这样 R1 就可以学习到 2 条 ECMP 路径了。
CSR1# show ip route ospf(snip)...99.0.0.0/16 is subnetted, 1 subnetsO E1 99.10.0.0 [110/2] via 10.1.3.3, 00:08:13, GigabitEthernet2[110/2] via 10.1.2.2, 01:58:33, GigabitEthernet1
解法 2:distribute-list
如果不想全局更改 AD,还可以利用 prefix-list 和 route-map 给 prefix 标记 tag,然后用 distribute-list 对 tag 进行过滤。
distribute-list 的作用是限制 进/出 路由器的路由条目。
先来看看 R1 收到的 99.10.0.0/16 的 Tag,都是 0。
CSR1# show ip ospf database external 99.10.0.0 | include TagExternal Route Tag: 0External Route Tag: 0
然后在 R2 和 R3 上把 distance ospf external 201 的配置删掉,配置 distribute-list。以 R2 为例,配置如下:
# R2 Configurations!ip prefix-list BGP-OSPF seq 5 permit 99.10.0.0/16!route-map BGP-OSPF permit 10match ip address prefix-list BGP-OSPFset tag 9910!route-map DIST deny 10match ip address prefix-list BGP-OSPFmatch tag 9910!route-map DIST permit 20!router ospf 1router-id 10.0.0.2redistribute bgp 100 metric-type 1 route-map BGP-OSPFdistribute-list route-map DIST in
在调用 route-map BGP-OSPF 将路由重分布到 OSPF 的同时,为其标记 Tag 9910。然后在 OSPF 下面配置 distribute-list,调用 route-map DIST,方向为 in,把携带 Tag 9910 并且符合 prefix-list BGP-OSPF 的路由都 deny 掉,允许其他。
同一条 route-map 里面的多行 match,它们是 and 的逻辑关系。
配置 distribute-list 之后,R1 就可以学习到 2 条目的为 99.10.0.0/16 的 ECMP 路由了。2 条路由的 Tag 都是 9910。
CSR1# show ip route ospf(snip)...99.0.0.0/16 is subnetted, 1 subnetsO E1 99.10.0.0 [110/2] via 10.1.3.3, 00:00:06, GigabitEthernet2[110/2] via 10.1.2.2, 00:00:27, GigabitEthernet1CSR1#CSR1#show ip ospf database external 99.10.0.0OSPF Router with ID (10.0.0.1) (Process ID 1)Type-5 AS External Link StatesLS age: 40Options: (No TOS-capability, DC, Upward)LS Type: AS External LinkLink State ID: 99.10.0.0 (External Network Number )Advertising Router: 10.0.0.2LS Seq Number: 80000001Checksum: 0x1CC1Length: 36Network Mask: 16Metric Type: 1 (Comparable directly to link state metric)MTID: 0Metric: 1Forward Address: 0.0.0.0External Route Tag: 9910LS age: 20Options: (No TOS-capability, DC, Upward)LS Type: AS External LinkLink State ID: 99.10.0.0 (External Network Number )Advertising Router: 10.0.0.3LS Seq Number: 80000001Checksum: 0x16C6Length: 36Network Mask: 16Metric Type: 1 (Comparable directly to link state metric)MTID: 0Metric: 1Forward Address: 0.0.0.0External Route Tag: 9910
解法 3:OSPF summary-address
这个 OSPF 选路的根本原因是在 BGP 里面做了路由汇总,然后才重分布到 OSPF,导致相关路由的管理距离变成了 200,进而出现了次优和绕行的路径。所以根本的解决办法把汇总路由的位置从 BGP 改为 OSPF。使用的命令为 summary-address,它的作用就是在 OSPF Border 路由器上对外部路由进行汇总,然后再将汇总路由通告给区域内的 OSPF 邻居。
以 R2 为例,配置如下:
router ospf 1router-id 10.0.0.2summary-address 99.10.0.0 255.255.0.0redistribute bgp 100 metric-type 1 route-map PERMITALL!router bgp 100bgp router-id 10.0.0.2bgp log-neighbor-changesneighbor 10.2.6.6 remote-as 200neighbor 10.2.6.6 fall-over bfdneighbor 10.2.6.6 default-originateneighbor 10.2.6.6 soft-reconfiguration inbound!route-map PERMITALL permit 10
修改配置之后,R2 的路由表为:
CSR2# show ip route(snip)...99.0.0.0/8 is variably subnetted, 2 subnets, 2 masksO 99.10.0.0/16 is a summary, 00:05:12, Null0B 99.10.0.0/24 [20/0] via 10.2.6.6, 00:06:17
R3 的路由表为:
CSR3# show ip route(snip)...99.0.0.0/8 is variably subnetted, 2 subnets, 2 masksO 99.10.0.0/16 is a summary, 00:02:09, Null0B 99.10.0.0/24 [20/0] via 10.3.6.6, 00:03:13
R1 可以学习到 2 条 ECMP 路由:
CSR1# show ip route(snip)...99.0.0.0/16 is subnetted, 1 subnetsO E1 99.10.0.0 [110/2] via 10.1.3.3, 00:07:03, GigabitEthernet2[110/2] via 10.1.2.2, 00:07:14, GigabitEthernet1




