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(Prefer Val) 仅限本地 值越大越优先 从不传播。只在收到路由的路由器本地生效,甚至不会传给同一个 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. med

MED (Multi-Exit Discriminator) 是 BGP 路由属性中用于控制入站流量(Inbound Traffic)的关键属性。简单来说,它的作用是告诉你的邻居 AS:“如果不止一条路能进我家,请走我推荐的这条(MED 值更小的)路。”

  • 定义:MED 是 BGP 的一种可选非传递(Optional Non-transitive)属性。
  • 本质:它就是一个度量值(Metric)
  • 比较规则值越小越优先(Lower is better)。这与 OSPF、IS-IS 的 Cost 值逻辑一致。
  • 别名:在 Cisco 等设备的配置命令行中,MED 通常直接被称为 metric

3.4.1. 生成原理

MED 的核心原理是利用 BGP 属性在 AS 之间传递“建议”,从而影响邻居 AS 的路由决策。
MED 值通常通过以下三种方式生成:

  1. 继承 IGP 度量值:这是最常见的方式。当你将 IGP(如 OSPF)路由引入(Redistribute)到 BGP 时,BGP 可以自动将 OSPF 的 Cost 值复制为 BGP 的 MED 值。这体现了“外部路由选择依赖内部网络状况”。如果内部网络到某个出口的 Cost 变大了,MED 也会变大,邻居就会感知并可能避开该出口。
  2. 手动指定:通过路由策略(Route-map)强制设置 MED 值。配置示例:set metric 100
  3. 默认值:如果未设置,默认 MED 值为 0(最优先)。

3.4.2. MED最重要的特性——非传递性。

  • 规则:MED 只能传给直连的邻居 AS,邻居 AS 收到后,不会再把这个 MED 传给它的下一个邻居 AS(除非显式配置使其传递)。
  • 例子:AS 100 发给 AS 200 一个 MED=50 的路由。AS 200 会在自己的选路中使用这个值,但当 AS 200 把这条路由传给 AS 300 时,会把 MED 值剥离(归零)。

3.4.3. 比较限制:著名的“来自同一 AS”规则**

  • 默认行为:BGP 路由器只比较来自同一个相邻 AS 的路由的 MED 值。
  • 场景
    • 如果路由 A 来自 AS 100,MED=10。
    • 如果路由 B 来自 AS 200,MED=20。
    • 结果:默认情况下,路由器不会比较这两个 MED,因为它们来自不同的“商家”。路由器会跳过 MED,继续比较后面的属性(如 AS-Path)。
  • 例外:可以通过配置 bgp always-compare-med 命令强制比较来自不同 AS 的 MED,但这在公网中很少见,通常用于企业自建网。

3.4.4. 使用场景与案例

3.4.4.1. 场景一:双链路互联(多出口鉴别)

这是 MED 名字的由来。

  • 背景:企业网(AS 65001)通过两条物理链路连接到同一个 ISP(AS 100)。
  • 需求:企业希望 ISP 优先通过“链路 A”访问企业的服务器,只有当 A 断了才走 B。
  • 操作
    • 企业路由器 A 对 ISP 发送路由通告:set metric 50
    • 企业路由器 B 对 ISP 发送路由通告:set metric 100
  • 结果:ISP 的路由器收到两份通告,发现来自同一个 AS(65001),于是比较 MED。50 < 100,ISP 决定流量全部走链路 A。

3.4.4.2. 场景二:冷土豆路由 (Cold Potato Routing)

  • 概念:与“热土豆路由”(尽快把流量扔出 AS)相反,MED 常用于实现“冷土豆路由”。
  • 原理:通过携带 IGP 的 Metric 作为 MED,让邻居 AS 知道:“请把流量送到离我目的网段最近的那个接口进来,别让我自己在内部网里跑长途。”

3.4.5. 总结:MED与Local Preference的区别

特性 MED (Multi-Exit Discriminator) Local Preference (本地优先级)
控制方向 控制入站流量 (别人怎么进我家) 控制出站流量 (我怎么去别人家)
生效范围 仅影响邻居 AS 影响本 AS 内部所有路由器
默认值 0 100
优选规则 越小越好 (Lower is better) 越大越好 (Higher is better)
强制力 (邻居可以忽略你的建议) (本AS内部必须遵守)

3.5. ecmp

BGP 默认是进行负载均衡(ECMP)的,它默认只会选出一条 Best Path。要形成BGP的ECMP(等价多路径),必须同时满足“人工开启”和“属性一致”两个层面的条件。ECMP 发生的时机是在比较完 IGP Metric (第 8 条) 之后,比较 Router ID (第 10 条) 之前。

3.5.1. 核心前提:开“开关”

BGP 协议设计的初衷是防环和策略控制,而不是负载均衡。默认情况下,即使有多条一模一样的优秀路径,BGP 也会强行通过 Router ID 把它们比个高下,只留一条。要启用 ECMP,必须在 BGP 配置中显式指定允许安装多条路径:

  • 命令示例maximum-paths [number] (针对 EBGP) 或 maximum-paths ibgp [number] (针对 IBGP)。

3.5.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.5.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 号)来人为“变长”某条路径,从而降低其优先级,实现流量切换。

评论