多出口链路接入是企业与数据中心常见的网络拓扑——租用两条或更多来自不同运营商(或同一运营商不同接入点)的线路,期望同时利用带宽、提升冗余。然而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命令,往往最简单有效。希望本文能帮助读者从原理落到配置,真正掌控多出口链路。
延伸阅读
