BGP协议优先级
1. 核心逻辑
1.1. “大”即是好的(高优先级)
Weight 和 Local Preference:这两个属性是管理员手动干预的首选。数值设置得越大,代表你越“偏好”这条路径。
1.2. “短/小”即是好的(低开销)
- AS-Path 长度:这体现了 BGP 的路径矢量特性,跳数越少代表路径越简洁。
- MED 和 IGP Metric:这两个属于“开销”范畴,类似于路费,自然是越便宜越好。
1.3. 信任源判定(Origin & Neighbor 类型)
- Origin: 内部生成的路由(IGP)比外部(Incomplete)的路由更可信。
- Neighbor: BGP 默认认为直接从别的自治系统(EBGP)学来的信息,比通过家里人(IBGP)传话学来的信息更直接、更及时。
2. 获胜规则
| 优先级 | 属性名称 | 传播范围 | 优先级判定规则 | 传播规则与限制 |
|---|---|---|---|---|
| 1 | Weight (权重) | 仅限本地 | 值越大越优先 | 从不传播。只在收到路由的路由器本地生效,甚至不会传给同一个 AS 内的邻居。 |
| 2 | Local Preference | AS 内传播 | 值越大越优先 | 仅在 IBGP 邻居间传递。用于告知本 AS 内部如何出站。不传给 EBGP 邻居。 |
| 3 | Local Originated | 会传播 | 本地生成 > 邻居通告 | 本路由器手动通告的路由(如 network 或 import-route 命令产生的)优先级大于BGP邻居学习到的 |
| 4 | AS-Path | 跨 AS 传播 | 长度越短越优先 | 传给 EBGP 时增加本地 AS 号;传给 IBGP 时不改变。用于防环和路径控制。 |
| 5 | Origin (起源) | 跨 AS 传播 | IGP > EGP > Incomplete | 一直跟随路由条目传播,直到路由失效。IBGP和EBGP邻居都会收到。 |
| 6 | MED | 跨 AS 传播 | 值越小越优先 | 仅传给直接相邻的 AS。默认情况下,邻居 AS 收到后不会再传给它的第三方 AS(即只传一跳 AS)。 |
| 7 | Neighbor 类型 | 不直接传播 | EBGP > IBGP | 这是一个比较行为,不是属性。指路由是从 EBGP 还是 IBGP 获取的。 |
| 8 | IGP Metric | 仅限本地 | 值越小越优先 | 指本地到下一跳的 Cost 值,不作为 BGP 属性传播。 |
| 9 | EBGP Oldest Path | —— | 最早优先 | 为了网络稳定性设计的规则。如果两条路完全一样好,BGP 会倾向于保持现状,不轻易切换到新上线的路,以避免路由翻滚。 |
| 10 | Router ID | 跨 AS 传播 | 值越小越优先 | 作为 Originator_ID 或路径标识跟随传播,直到路由被重新通告。 |
| 11 | Cluster List | AS 内传播 | 长度越短越优先 | 仅在路由反射器(RR)环境传播。用于在 AS 内部防止反射环路。 |
3. 详细介绍
3.1. Weight
weight支持精确匹配和前缀匹配两种
3.1.1. 精确匹配 (Exact Match)
如果只希望对某一个特定的子网设置 Weight,不包含它的子网。
- 配置方式:不加任何掩码范围限制。
- 示例:
ip prefix-list ONLY_WEB permit 10.1.1.0/24 - 效果:
10.1.1.0/24—— 匹配(Weight 会被修改)10.1.1.0/25—— 不匹配(保持默认 Weight)
3.1.2. 模糊匹配/范围匹配 (Range Match)
如果希望对一组连续的网段,或者某个大类下的所有子网统一设置 Weight,可以使用 le(小于等于)或 ge(大于等于)。
- 配置方式:使用
le或ge参数。 - 示例:
ip prefix-list BRANCHES permit 10.1.0.0/16 le 32 - 效果:
- 只要是以
10.1开头的任何路由(掩码在 16 到 32 位之间),统统都会被匹配。
- 只要是以
3.1.3. “全部匹配” (Any)
有时候可能想把某个邻居传来的所有路由权重都调高。
- 配置方式:
- 方法 A:直接在
neighbor命令后加weight(无需匹配工具)。 - 方法 B:在 Prefix-list 中使用
0.0.0.0/0 le 32。
- 方法 A:直接在
3.2. local preference
在 BGP(边界网关协议)中,Local Preference (本地优先级) 是一个非常重要的属性,用于告知 AS(自治系统)内部的路由器,在有多个出口可以到达同一目的地时,哪条路径是优先的。它的核心特点是:仅在 AS 内部传播,不会传递给 EBGP 邻居。 数值越高越优先(默认值通常为 100)。
3.2.1. 定义策略
假设有两个ISP邻居(ISP_A 和 ISP_B),我们希望优先走ISP_A,则可以创建一个 route-map,将来自 ISP_A 的所有路由优先级设为 200(默认是 100)。
3.2.2. 应用到特定邻居
将该策略应用在与该邻居相连的in方向。这意味着:“只要是这个邻居告诉我的路由,我都给它标记上更高的优先级”。
[!tip]
同时连接专线和VPN时,我们可以通过local_preference设置专线优先级更高,只有在专线失效的时候才用VPN
3.3. origin
在 BGP 中,Origin(起源) 属性反映了路由最初是如何进入BGP路由表的。简单来说,Origin 的生成取决于你在配置 BGP 时使用了哪条命令。
3.3.1. 生成 IGP (i) 属性
这是优先级最高的起源属性。它代表该路由是“根正苗红”地通过 BGP 宣告进来的。
- 生成方式:使用
network命令手动宣告。 - 背后的逻辑:当你执行
network 192.168.1.0 mask 255.255.255.0时,BGP 进程会去路由表里检查是否存在这条路由。如果有,它就会生成一条 Origin 属性为 i 的 BGP 路由。
3.3.2. 生成 Incomplete (?) 属性
这是优先级最低的起源属性。它代表路由的来源“不明确”或来自外部协议。
- 生成方式:使用
redistribute命令。 - 背后的逻辑:当你把其他协议(如 OSPF、静态路由、直连路由)重发布到 BGP 时,BGP 无法确切知道这些路由最初是怎么产生的,因此会打上一个“问号”标签。例如:
redistribute static或redistribute ospf 1。
3.3.3. 生成 EGP (e) 属性 (已过时)
- 生成方式:通过旧式的 EGP 协议引入。
- 现状:现代互联网早已全面使用 BGP 替代了 EGP 协议,因此在现网中几乎看不到 Origin 为
e的路由。
3.3.4. 特殊情况:汇总路由 (Aggregate)
当你对路由进行汇总(聚合)时,Origin 的生成逻辑会变得有趣:
- 命令:
aggregate-address 10.0.0.0 255.255.0.0 - Origin 判定:
- 如果被汇总的所有明细路由 Origin 都是
i,那么汇总后的路由 Origin 也是i。 - 但如果明细路由中只要有一条是
?,比如有一条是通过redistribute进来的),那么汇总后的路由 Origin 就会变成?。
- 如果被汇总的所有明细路由 Origin 都是
3.4. ecmp
BGP 默认是不进行负载均衡(ECMP)的,它默认只会选出一条 Best Path。要形成BGP的ECMP(等价多路径),必须同时满足“人工开启”和“属性一致”两个层面的条件。ECMP 发生的时机是在比较完 IGP Metric (第 8 条) 之后,比较 Router ID (第 10 条) 之前。
3.4.1. 核心前提:开“开关”
BGP 协议设计的初衷是防环和策略控制,而不是负载均衡。默认情况下,即使有多条一模一样的优秀路径,BGP 也会强行通过 Router ID 把它们比个高下,只留一条。要启用 ECMP,必须在 BGP 配置中显式指定允许安装多条路径:
- 命令示例:
maximum-paths [number](针对 EBGP) 或maximum-paths ibgp [number](针对 IBGP)。
3.4.2. 硬性条件:前 8 项属性必须“完全一致”
当开关打开后,BGP 路由器会检查多条路径。只有当以下属性全部相同时,才会认为它们是“Equal Cost”的,进而形成 ECMP。
- Weight (权重):必须相同。
- Local Preference:必须相同。
- Local Originated (本地生成):必须相同(要么都是本地产生的,要么都不是)。
- AS-Path:
- 长度:必须相同。
- 内容:默认情况下,AS 号的序列也必须完全一致(即经过的路径要一模一样)。
- Origin (起源):必须相同(都是 IGP 或都是 Incomplete)。
- MED:必须相同。
- Neighbor 类型:必须相同(都是 EBGP 或都是 IBGP,很少有设备支持 EBGP 和 IBGP 混合负载均衡)。
- IGP Metric (内部开销):这一步很关键。到达 BGP 下一跳(Next Hop)的 IGP 代价必须相同。
👉 结论:只有当这 8 项比完还分不出胜负,且maximum-paths> 1 时,选路过程中止,这几条路由同时进入路由表。Router ID 和 Cluster List 将不再被比较。
3.4.3. 特殊场景:AS-Path 的“松弛” (Multipath Relax)
在很多现代数据中心网络(特别是 Clos/Leaf-Spine 架构)中,我们希望在两条物理链路(连接不同的上游 AS)之间做负载均衡。
- 问题:默认规则要求 AS-Path 内容必须完全一致。如果连接了两个不同的 ISP(比如 AS 65001 和 AS 65002),虽然 AS-Path 长度都是 1,但因为 AS 号不同,默认无法形成 ECMP。
- 解决:配置
bgp bestpath as-path multipath-relax(不同厂商命令略有差异)。 - 效果:BGP 忽略 AS 号的具体内容,只比较长度。只要长度一致,就允许负载均衡。
4. 使用技巧
4.1. 控制流量“出去”
修改本地路由器的 Local Preference。
4.2. 控制流量“进来”
修改发给对方的 AS-Path或 MED。BGP默认认为经过的自治系统(AS)越少,延迟和风险越低。但在现代网络设计中,管理员经常通过AS-Path Prepending(在路径中重复添加自己的 AS 号)来人为“变长”某条路径,从而降低其优先级,实现流量切换。