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 BGP 选路决策顺序(自上而下,先满足者胜出) 1. 权重(Weight,本地有效,越大越优) 仅本机,不传递 2. LOCAL_PREF(越大越优) AS 内 iBGP 传递 3. 本地始发路由优先(network / aggregate / redistribute) 4. AS_PATH 长度(越短越优) eBGP 逐 AS 追加 5. ORIGIN(IGP > EGP > INCOMPLETE) 6. MED(越小越优,默认仅相邻 AS 比较) 可选非传递 7. eBGP 优于 iBGP;再比 IGP 到 NEXT_HOP 的度量 8. Router-ID 小者优 / Cluster-List 短者优 / 邻居地址小者优 逐级比较,一旦分出胜负即停止,不再看后续属性

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。

在 MX 上查看某条前缀的选路依据,可用 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 ... 且解析成功。

修改 LOCAL_PREF 和 MED 时注意方向:LOCAL_PREF 只在 iBGP 内有效,发给 eBGP 邻居会被剥离;MED 默认不跨 AS 传递,若需向更远 AS 传递,需显式配置 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 选路就从“黑盒”变成了可预测、可干预的过程:知道每条属性由谁设置、往哪传、在决策链的哪一级生效,就能用最小的策略改动实现期望的流量走向。