关键词:BGP、选路原则、13条规则、BestPath、LOCAL_PREF、AS_PATH、MED、PrefVal
第85篇:BGP 选路原则(13条规则)详解
一、引言
BGP 选路原则是 BGP 协议中最核心也最复杂的内容之一。当 BGP 路由器收到多条到达同一目的前缀的路由时,需要按照严格的优先级顺序逐条比较,最终选出最优路由(Best Path)。
BGP 的选路规则按优先级从高到低依次应用。只有当前一条规则无法区分优劣(多条路由在该属性上值相同)时,才进入下一条规则的比较。理解并熟练运用这 13 条规则,是进行 BGP 路径调优和故障排查的必备技能。
注意:以下选路规则以华为 VRP 设备为准。不同厂商的 BGP 选路规则顺序可能有所不同,Cisco 与华为的主要差异在于 LOCAL_PREF 和 MED 的比较顺序。
二、核心概念
2.1 BGP 选路规则总览(华为设备)
| 优先级 | 规则 | 比较内容 | 优选方向 |
|---|---|---|---|
| 0 | PrefVal(预估值) | 华为独有属性 | 越大越优 |
| 1 | 路由类型 | 本地路由 > 聚合 > 重分发 > eBGP > iBGP | 本地最优 |
| 2 | LOCAL_PREF | 本地优先值 | 越大越优 |
| 3 | AS_PATH 长度 | AS_PATH 中 AS 号的数量 | 越短越优 |
| 4 | Origin 类型 | IGP > EGP > Incomplete | 优先级越高越优 |
| 5 | MED | Multi-Exit Discriminator | 越小越优 |
| 6 | eBGP > iBGP(Confed) > iBGP | 路由来源类型 | eBGP优先 |
| 7 | IGP Metric to Next_Hop | 到达 Next_Hop 的 IGP Cost | 越小越优 |
| 8 | Cluster_List 长度 | 路由反射场景 | 越短越优 |
| 9 | Peer Type | eBGP > iBGP(Confed-eBGP) > iBGP(Confed-iBGP) > iBGP | 越优越好 |
| 10 | Peer Router ID | 对端的 Router ID | 越小越优 |
| 11 | Cluster_List + Originator_ID | 联合比较 | 越小越优 |
| 12 | NLRI(对端地址) | 对端地址比较 | 越小越优 |
| 13 | 最先学习 | 到达时间 | 最先学到的优先 |
2.2 选路流程示意

三、技术细节
3.1 规则0:PrefVal(预估值,华为独有)
PrefVal 是华为设备特有的 BGP 属性,优先级最高:
| 特性 | 说明 |
|---|---|
| 作用范围 | 仅本地有效,不传递给任何 Peer |
| 默认值 | 0 |
| 优选方向 | 越大越优 |
| 使用场景 | 在有多条等价 BGP 路由时,强制指定优选某一条 |
# 通过路由策略设置PrefVal
route-policy PREF-SET permit node 10
if-ip-address prefix-list TARGET-Routes
apply pref-value 100
bgp 100
peer 2.2.2.2 route-policy PREF-SET import
3.2 规则2:LOCAL_PREF
LOCAL_PREF 是 BGP 中最常用的路径控制工具,用于控制离开 AS 的流量出口:
| 特性 | 说明 |
|---|---|
| 作用范围 | AS 和 Confederation 内部传递,不传递给标准 eBGP Peer |
| 默认值 | 100 |
| 优选方向 | 越大越优 |
| 使用场景 | 选择离开 AS 的最佳出口 |
# 通过路由策略设置LOCAL_PREF
route-policy SET-LP permit node 10
if-ip-address prefix-list ALL-ROUTES
apply local-preference 200
# 通过default-lp设置全局默认值
bgp 100
default-lp 150
# 应用到特定Peer
bgp 100
peer 2.2.2.2 route-policy SET-LP import
3.3 规则3:AS_PATH 长度
AS_PATH 长度比较是 BGP 默认的选路标准:
| 特性 | 说明 |
|---|---|
| 比较内容 | AS_PATH 中 AS 号的个数(非字节长度) |
| 优选方向 | AS_PATH 越短越优 |
| AS_SET 计数 | AS_SET 中的 AS 号只计为 1 个 |
AS_PATH Prepending 技巧:通过人为追加 AS 号使路径"变长",从而降低该路径的优先级:
# 在出口路由器上配置AS_PATH Prepending
route-policy APPEND-AS permit node 10
apply as-path 200 200 200 additive
bgp 100
peer 2.2.2.2 route-policy APPEND-AS export
# 配置后,出方向路由的AS_PATH增加三个200,路径变长,不被优选
3.4 规则5:MED(多出口判别器)
MED 用于建议进入 AS 的最佳入口:
| 特性 | 说明 |
|---|---|
| 作用范围 | 默认仅在相邻 AS 之间传递 |
| 默认值 | 0 |
| 优选方向 | 越小越优(标准 RFC,华为 VRP 现代版本遵循标准) |
| 比较前提 | 仅来自同一相邻 AS 的路由才比较 MED |
MED 比较的特殊规则: - 只有来自同一相邻 AS 的多条路由才比较 MED 值 - 来自不同相邻 AS 的路由,默认不比较 MED

R1 从 AS 200 学到两条路由(来自 R2 MED=100 和 R3 MED=50),比较 MED:MED=50 优先(MED 越小越优)。
3.5 规则7:IGP Metric to Next_Hop
比较到达各路由 Next_Hop 的 IGP Cost,Next_Hop 不可达的路由不参与比较(被标记为 Invalid):
| 特性 | 说明 |
|---|---|
| 比较内容 | IGP 到达 Next_Hop 的度量值 |
| 优选方向 | IGP Cost 越小越优 |
| 前提 | Next_Hop 必须可达,否则路由为 Invalid |
四、实战配置/案例分析
4.1 调试 BGP 选路过程
# 查看BGP选路详情(单条路由)
display bgp routing-table 10.1.1.0 verbose
Path id: 1, Packet-based weight: 0
NextHop: 2.2.2.2
MED: 0, LOCAL_PREF: 100, PrefVal: 0
AS_PATH: 200 I
PathState: E-BGP Peer
# 查看多条候选路由(对比选路)
display bgp routing-table 10.1.1.0 all-path
*表示Best路径,>表示Valid路径
*> 10.1.1.0/24 2.2.2.2 MED:0 LP:200 AS_PATH:200 I # Best
> 10.1.1.0/24 3.3.3.3 MED:0 LP:100 AS_PATH:200 I # Valid but not Best
# 查看BGP选路过程详情
display bgp routing-table 10.1.1.0 best-path
4.2 案例分析:利用 LOCAL_PREF 控制出口
场景:AS 100 有两个出口连接到 AS 200,希望大部分流量通过 R1(主出口),R2(备份出口)仅在 R1 故障时启用。

配置:
# 在RR上配置:来自R1的路由LOCAL_PREF=200,来自R2的为默认100
route-policy MAIN-EXIT permit node 10
if-ip-address prefix-list ALL-ROUTES
apply local-preference 200
bgp 100
peer R1-IP route-policy MAIN-EXIT import
# R2的LOCAL_PREF保持默认100
# 所有经过RR学习到的路由,来自R1的LP=200,来自R2的LP=100
# 选路规则2:LOCAL_PREF越大越优,因此R1出口被优选
4.3 案例分析:利用 AS_PATH Prepending 影响选路
场景:在没有 LOCAL_PREF 配置权限的情况下(如多租户环境),通过 AS_PATH Prepending 使某条路径不被优选。
# 在出口路由器上配置AS_PATH Prepending
route-policy LOW-PRIORITY permit node 10
apply as-path 100 100 100 additive
bgp 100
peer 3.3.3.3 route-policy LOW-PRIORITY export
配置后,该路由的 AS_PATH 变为 100 100 100 100(增加了三个 AS 100),在规则 3(AS_PATH 长度)的比较中不占优势。
4.4 案例分析:MED 比较陷阱
故障现象:AS 100 从 AS 200 和 AS 300 分别学到路由,虽然 AS 300 设置了对 AS 100 更优的 MED 值,但 AS 100 仍然选择经过 AS 200 的路由。
排查: - AS 100 从 AS 200 学到的路由 MED=50 - AS 100 从 AS 300 学到的路由 MED=100 - MED 比较的前提:仅当多条路由来自同一相邻 AS 时才比较 MED - 这里两条路由来自不同 AS(200 和 300),MED 不参与比较
解决:
# 如果需要比较不同AS的MED值,需要配置compare-med-confederate
bgp 100
compare-med-confederate # 华为:比较来自不同AS的MED
# 注意:此配置不符合标准,仅在特定场景下使用
五、总结
| 优先级 | 最常用规则 | 调优方式 | 典型场景 |
|---|---|---|---|
| 0 | PrefVal | 路由策略设置 | 华为设备强制优选 |
| 2 | LOCAL_PREF | 路由策略设置LOCAL_PREF | 控制出口选择 |
| 3 | AS_PATH长度 | AS_PATH Prepending | 降低某路径优先级 |
| 4 | Origin | network vs import-route | 优先使用network宣告 |
| 5 | MED | 设置MED值 | 建议入口选择 |
| 7 | IGP Cost | 调整IGP Cost | Next_Hop可达性优化 |
思考
- BGP 的选路规则为什么按特定顺序排列?如果改变规则顺序(如将 MED 放在 AS_PATH 之前比较),会对全网路由收敛产生什么影响?
- LOCAL_PREF 和 MED 都可以影响 BGP 选路,但它们的作用方向和传递范围完全不同。请用一句话概括两者的本质区别。
- 为什么 BGP 选路的第一条规则(规则0/1)不是比较度量值,而是比较 PrefVal 和路由类型?这与 IGP 的选路逻辑有何本质不同?
下篇预告:第86篇:BGP 同步规则(历史与现状)