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(Prefer Val) | 仅限本地 | 值越大越优先 | 从不传播。只在收到路由的路由器本地生效,甚至不会传给同一个 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方向。这意味着:“只要是这个邻居告诉我的路由,我都给它标记上更高的优先级”。
同时连接专线和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. 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 值通常通过以下三种方式生成:
- 继承 IGP 度量值:这是最常见的方式。当你将 IGP(如 OSPF)路由引入(Redistribute)到 BGP 时,BGP 可以自动将 OSPF 的 Cost 值复制为 BGP 的 MED 值。这体现了“外部路由选择依赖内部网络状况”。如果内部网络到某个出口的 Cost 变大了,MED 也会变大,邻居就会感知并可能避开该出口。
- 手动指定:通过路由策略(Route-map)强制设置 MED 值。配置示例:
set metric 100。 - 默认值:如果未设置,默认 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。
- 企业路由器 A 对 ISP 发送路由通告:
- 结果: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。
- 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.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-Path或 MED。BGP默认认为经过的自治系统(AS)越少,延迟和风险越低。但在现代网络设计中,管理员经常通过AS-Path Prepending(在路径中重复添加自己的 AS 号)来人为“变长”某条路径,从而降低其优先级,实现流量切换。
评论