3. BGP路由属性与选路算法在MX上的实现
BGP 本身不计算最短路径,它依靠一组可传递或不可传递的路由属性,在 Junos 的决策过程中逐级比较,最终为每条前缀选出唯一最优路径。理解 MX 上的选路行为,关键不是背下属性名称,而是弄清两件事:每个属性由谁设置、沿什么方向传播;以及 Junos 在比较时按什么顺序、在什么条件下才进入下一级比较。本节围绕 AS_PATH、LOCAL_PREF、MED、ORIGIN、NEXT_HOP 和权重(weight)展开,并给出在 MX 上修改这些属性的实际方法。
属性的传播方向与作用范围
先建立方向约定:本节所说的“入方向”指从 eBGP 邻居收到的路由进入本地 RIB 的过程,“出方向”指本地向邻居通告路由的过程。AS_PATH 是公认必遵属性,每经过一个 AS 就追加该 AS 号,用于防环和路径长度比较;它可被策略修改,但修改后会影响下游所有 AS 的判断。LOCAL_PREF 是公认自决属性,只在本地 AS 内部(iBGP 会话)传递,不会发给 eBGP 邻居,因此它表达的是“本 AS 出口偏好”,数值越大越优。MED 是可选非传递属性,用于向相邻 AS 提示入口偏好,默认只在相邻 AS 之间传递,数值越小越优。ORIGIN 表示路由来源,取值 IGP(i)优于 EGP(e)优于 INCOMPLETE(?)。NEXT_HOP 决定转发时的下一跳地址,其可达性由 IGP 保证。权重是 Junos 本地属性,只在本地路由器有效,不传递,数值越大越优,常用于在单台 MX 上强制指定出口。
Junos 默认行为与关键前提
在 MX 上,Junos 默认对 eBGP 收到的路由不修改 LOCAL_PREF,其缺省值为 100;对 iBGP 内部路由同样为 100。MED 默认值为 0,且 Junos 默认只在来自同一相邻 AS 的多条路径之间比较 MED,来自不同 AS 的 MED 不参与比较——这是很多“MED 配了却不生效”问题的根源。AS_PATH 比较时,Junos 默认把 AS_SET 计为 1,并可用 path-selection as-path-ignore 忽略长度比较。此外,Junos 默认不比较权重以外的本地属性,权重缺省为 0。
show route <prefix> detail,输出中的 Localpref、Metric(即 MED)、AS path、Origin、Next hop 与 Weight 字段正是决策链的输入。在 MX 上修改属性的实际方法
修改属性通过 routing policy 完成,策略在 [edit policy-options policy-statement] 下定义,再在 BGP 的 import 或 export 方向引用。下面给出一个典型场景:MX 有两条 eBGP 上行,希望优先走 ISP-A,同时向 ISP-B 通告时降低其入口优先级。
policy-options {
policy-statement PREFER-ISP-A {
term FROM-A {
from neighbor 203.0.113.1;
then {
local-preference 200;
accept;
}
}
term FROM-B {
from neighbor 203.0.113.5;
then {
local-preference 150;
accept;
}
}
}
policy-statement SET-MED-OUT {
term TO-B {
from neighbor 203.0.113.5;
then {
metric 50; /* 即 MED */
accept;
}
}
}
}
protocols bgp {
group EBGP-UP {
import PREFER-ISP-A;
export SET-MED-OUT;
neighbor 203.0.113.1;
neighbor 203.0.113.5;
}
}
这里 local-preference 200 使来自 ISP-A 的路由在本地决策中胜出;metric 50 在出方向设置 MED,提示 ISP-B 侧入口的偏好。若只想在单台 MX 上强制某条路径,可用 then preference 或直接设置 weight:then { weight 300; },权重优先级最高,适合做临时引流或排障。
AS_PATH 与 ORIGIN 的调整
AS_PATH 的修改通常用于影响下游选路。例如希望某条前缀不被对端优先选择,可在出方向追加本地 AS 号:
policy-statement AS-PREPEND {
term PREPEND {
from {
route-filter 198.51.100.0/24 exact;
}
then {
as-path-prepend "65001 65001";
accept;
}
}
}
ORIGIN 一般由路由注入方式决定:network 语句产生的路由 ORIGIN 为 IGP,redistribute 引入的为 INCOMPLETE。若需强制,可用 then origin igp 或 then origin incomplete,但应谨慎,因为它会改变下游对来源可信度的判断。
NEXT_HOP 的处理
在 eBGP 中,NEXT_HOP 默认改为本端出口地址;在 iBGP 中默认保持不变,因此需要 next-hop-self 或 next-hop self 策略,确保对端能通过 IGP 解析下一跳。MX 上还可用 then next-hop <address> 强制指定,常用于流量牵引。判断 NEXT_HOP 是否可用,看 show route <prefix> detail 中是否标记为 Next hop: ... via ... 且解析成功。
metric-out 或使用 set protocols bgp ... metric-out,并确认对端是否接受。选路结果的验证
完成策略配置后,用 show route receive-protocol bgp <neighbor> 查看入方向属性是否按预期修改,用 show route advertising-protocol bgp <neighbor> 查看出方向通告的属性。若最优路径与预期不符,按决策顺序逐级排查:先看权重,再看 LOCAL_PREF,再看 AS_PATH 长度,最后看 MED 与 ORIGIN。多数“策略不生效”问题出在方向引用错误(import/export 弄反)或 MED 跨 AS 未传递上。
掌握这套属性与顺序后,MX 上的 BGP 选路就从“黑盒”变成了可预测、可干预的过程:知道每条属性由谁设置、往哪传、在决策链的哪一级生效,就能用最小的策略改动实现期望的流量走向。