BGP 13条选路原则在多出口链路负载均衡中的实战应用

BGP的13条选路原则决定了路由的优选顺序,在多出口网络场景中,如何利用这些原则实现链路负载均衡?本文从实战出发,拆解每条原则的实际影响,并给出可落地的配置案例与验证方法,帮助网络工程师告别单链路瓶颈。

BGP 13条选路原则在多出口链路负载均衡中的实战应用
封面图:ZuCDN · ZuCDN 原创

多出口链路接入是企业与数据中心常见的网络拓扑——租用两条或更多来自不同运营商(或同一运营商不同接入点)的线路,期望同时利用带宽、提升冗余。然而BGP默认只选一条最优路由写入路由表,其余等价路径被忽略。要实现真正的多链路负载均衡,必须在BGP的13条选路原则中精准干预,让不同流量分布到不同链路上。

本文不堆砌理论,而是直接回答一个实际问题:面对两条(或多条)通往相同目的前缀的BGP路径,如何利用13条原则让它们“各司其职”?

一、BGP选路原则的核心逻辑

BGP不会自动负载均衡,因为它把选路看成“唯一最优”的决策过程。13条原则是一条路由表优先级裁判链:从第一条开始比对,如果分出胜负就不再往后看。理解每条原则的权重和可操作性,是多出口负载均衡的基础。

在实际网络中,真正可被管理员主动修改的属性集中在最前面的几条:Weight(Cisco私有)、Local Preference、AS-Path、MED。后面的如EBGP优于IBGP、优选下一跳度量最小等,通常是不可控或默认值相同。因此,实战中主要打“前几张牌”。

二、13条原则在负载均衡场景下的逐条解析

1. Weight(权重)—— 本地偏好,优先最高值

Weight是Cisco私有属性,只在本路由器生效,值越高越优先。如果希望来自某条链路的路径优先,可以给该邻居的入站路由设置较高Weight。在多出口负载均衡中,Weight常用于区分“主备”或“主流量”链路,但要做到均衡,需让两条路径Weight相等(或通过其他属性差异化)。

实战建议:如果两条链路性能相同,可以将Weight设为相同值(例如均不设置,默认0),让后续原则决定。

2. Local Preference(本地优先级)—— 传播给AS内部,最高优先

Local Preference是AS内BGP路由的优先级,值越大越优先。在多出口场景中,如果希望AS内部所有路由器统一偏好某条链路,可以修改LP。但负载均衡通常要求不同方向/不同目的前缀走不同链路,因此LP更适合做流量导向,而非均衡。

实战建议:当两条链路到同一目的地性能差异大时,用LP让主要流量走高质量链路,剩余走另一条;若链路对称,则保持LP相同。

3. AS-Path长度 —— 最短路径优先

这是最常见的影响因素。在多出口场景中,如果两条链路到达同一目的前缀的AS-Path长度不同,BGP会选短的。要实现负载均衡,必须让AS-Path长度相同,否则短路径会吸收全部流量。

实战技巧:可以通过对等体组或路由策略(Route-map)对其中一条链路的出站更新添加AS-Path prepend(追加自己的AS号),人为拉长路径,从而将特定流量引向另一条链路。但要注意,AS-Path prepend会影响整条链路,需结合前缀匹配。

4. MED(多出口鉴别器)—— 低值优先,仅在相同AS时比较

MED通常由上游运营商传递,用于告诉邻居“哪条入口路径更好”。在多出口场景中,可以通过设置不同的MED值来操控对等体(自己的EBGP邻居)的选路。但MED仅在AS-Path等前三项相同时才生效,且只比较来自同一个AS的路径。

实战案例:如果两条链路连接的是同一个运营商(同一AS),可在自己路由器上对来自不同接口的EBGP路由设置不同的MED,让运营商优选其中一条入站链路,间接影响出站流量。

5. 从EBGP学到的路由优先于IBGP

如果同一前缀同时从EBGP和IBGP学到,EBGP路径优先。在多出口场景中,一般两条链路都是EBGP,所以此条不产生差异。但若内部有IBGP反射,需注意不使IBGP路径意外变优。

6. 优选下一跳度量最小的路径

如果通过两条EBGP路径学到同一前缀,且前面1-5条都相同,则比较到达下一跳的IGP metric。这通常与链路带宽、延迟有关。若两条链路的下一跳IGP代价相同,则继续往后比较。

实战干扰:可以通过调整接口的OSPF/EIGRP cost来微调,但一般不推荐,因为影响范围广。

7-13条原则:几乎无差异

包括优选来自已存在会话的邻居、优选Router-ID最小的路径、优选Cluster-list最短、邻居地址最小等。在正常对称多出口场景中,这些值通常相同或无法控制。实战中很少利用它们做负载均衡。

三、实战配置:用BGP实现多出口负载均衡

假定场景:企业边界路由器(R1)有两个EBGP邻居:ISP-A(AS 100)和ISP-B(AS 200)。内部下一跳到两个外联接口。我们希望流量按目标前缀均匀分布,或按比例分担。

方案一:基于前缀的负载均衡(PBR+BGP属性)

在前三条原则中制造差异:使用AS-Path prepend让一部分前缀AS-Path变长,另一部分不变。例如定义两个Route-map:

  • 对ISP-A的入站路由,仅匹配/24段前缀,不做任何操作(AS-Path短)。
  • 对ISP-B的入站路由,在出站更新时对同一前缀追加一次自己的AS号,使得AS-Path变长。

这样/24段前缀从ISP-A学到的路径更短,优选ISP-A;而对/16段前缀,反方向操作。实际上需要在上游对等体做,或者自己路由器上修改入站路由的AS-Path(Cisco允许在入站Route-map中使用set as-path prepend影响选路)。但注意,入站修改AS-Path会影响本路由器选路,但不会影响邻居。更常见的做法是使用BGP出站策略向上游发送不同长度的AS-Path。

方案二:权重与本地优先级组合实现“主备切换 + 均衡”

假设两条链路带宽相同,我们希望默认平均分摊,但保留故障切换能力。可以设置Weight相等,都不修改Local Preference。此时前三条属性相同,进入第6条比较下一跳IGP metric。如果两条链路下一跳的metric也相同(比如都是直连,metric=0),则进入第7条比较EBGP vs IBGP(相同),第8条比较Router-ID。通常两条链路对端的Router-ID不同,BGP会选择Router-ID更小的那一条。

此时不会均衡。因此必须让BGP负载均衡生效:Cisco支持BGP多路径(maximum-paths 2),允许等值路径同时写入路由表。只要前13条原则中选出多条完全相同的最优路径,BGP就可以将它们都安装进路由表,实现负载均衡。

要使前13条完全相等

  • Weight相等(默认0)
  • Local Preference相同(默认100)
  • AS-Path长度相同
  • 不需要比较MED(无MED或相同)
  • 路径来源相同(EBGP)
  • 下一跳IGP metric相同(直连接口cost一样)
  • 如果以上都相同,还需要Router-ID也相同?不可能。但Cisco BGP多路径实现时,当开启maximum-paths后,BGP会忽略Router-ID等后续比较,只要前6条相同即认为等价(具体厂商实现有差异)。华为/华三/思科均可配置。

典型配置示例(Cisco IOS)

router bgp 65001
 neighbor 10.0.1.1 remote-as 100
 neighbor 10.0.2.1 remote-as 200
 maximum-paths 2
 address-family ipv4
  neighbor 10.0.1.1 activate
  neighbor 10.0.2.1 activate
  network 203.0.113.0 mask 255.255.255.0
 ! 注意:需要确保两个邻居通告的前缀完全一致,且属性相同

如果两条链路上游运营商通告的AS-Path不同,需要让它们相同:一种方法是在入站Route-map中调整AS-Path(不建议滥用),更常用的做法是接受现实,只对其中一部分前缀做负载均衡。例如只对某些/24做AS-Path补充,使得两条路径在特定前缀上等价。

四、验证负载均衡效果与回滚策略

配置完成后,必须验证:

  • show ip bgp x.x.x.x 显示有多条路径且标记为“r”表示best,“i”表示not best但可能被负载均衡。
  • show ip route x.x.x.x 显示到同一前缀有多个下一跳(若开启CEF,则按流分配)。
  • 实际业务测试:在两台服务器上持续ping,观察traceroute路径是否有差异。

回滚方案:如果配置后发现丢包或链路不对等,可先移除maximum-paths或恢复Route-map。建议在维护窗口操作,保留预配脚本的回退步骤。

五、常见陷阱与注意事项

1. 非对称路由风险:当出站走链路A,入站走链路B,可能被运营商反垃圾策略过滤。需确认入站方向也做了对应均衡(一般通过MED或AS-Path prepend影响上游选路)。

2. 流级与包级均衡:BGP多路径通常配合CEF的per-flow负载均衡,避免乱序。要确认硬件支持。

3. BGP收敛性能下降:多路径会增加路由表项数量,但Dual-homed场景通常可控。

4. 与业务QoS冲突:若有流量整形或策略路由,应注意覆盖顺序。

结语

BGP 13条选路原则不是摆设,在多出口负载均衡场景中,核心是用前几条属性制造等价路径,或者用AS-Path差异引导特定前缀。不要试图让所有流量均等分散,而应设计为“基于前缀或服务的均衡”。结合maximum-paths命令,往往最简单有效。希望本文能帮助读者从原理落到配置,真正掌控多出口链路。

延伸阅读