BGP协议优先级

network bgp

1. 核心逻辑

1.1. “大”即是好的(高优先级)

WeightLocal Preference:这两个属性是管理员手动干预的首选。数值设置得越大,代表你越“偏好”这条路径。

1.2. “短/小”即是好的(低开销)

  • AS-Path 长度:这体现了 BGP 的路径矢量特性,跳数越少代表路径越简洁。
  • MEDIGP 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 会传播 本地生成 > 邻居通告 本路由器手动通告的路由(如 networkimport-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(大于等于)。

  • 配置方式:使用 lege 参数。
  • 示例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

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 staticredistribute 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 就会变成 ?

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。

  1. Weight (权重):必须相同。
  2. Local Preference:必须相同。
  3. Local Originated (本地生成):必须相同(要么都是本地产生的,要么都不是)。
  4. AS-Path
    • 长度:必须相同。
    • 内容:默认情况下,AS 号的序列也必须完全一致(即经过的路径要一模一样)。
  5. Origin (起源):必须相同(都是 IGP 或都是 Incomplete)。
  6. MED:必须相同。
  7. Neighbor 类型:必须相同(都是 EBGP 或都是 IBGP,很少有设备支持 EBGP 和 IBGP 混合负载均衡)。
  8. 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-PathMED。BGP默认认为经过的自治系统(AS)越少,延迟和风险越低。但在现代网络设计中,管理员经常通过AS-Path Prepending(在路径中重复添加自己的 AS 号)来人为“变长”某条路径,从而降低其优先级,实现流量切换。