Skip to content

BGP 策略设计实战:用 Community 与 LOCAL_PREF 构建可控路由系统

9 min read

在生产网络里,最常见的错误不是“参数不会配”,而是“策略不可解释”。 同样的前缀,今天因为成本策略走运营商 A,明天因为临时修复又走运营商 B;几周后没人能说清为什么变过、谁批准的、何时该回收。只要这种状态持续,BGP 就会从工程系统退化成人工系统。

Community 与 LOCAL_PREF 这对组合,正好可以把不可解释变成可解释。 Community 负责表达意图,LOCAL_PREF 负责执行排序。前者是语言,后者是秩序。只要设计得当,就能把调流、稳态、应急、回滚统一在一套模型里。

一、先回答三个根问题

开始设计前,先把三个问题写进需求文档:

  1. 我们到底在优化什么:时延、成本、可用性,还是三者权重组合?
  2. 哪些角色可以改“意图”,哪些角色可以改“执行映射”?
  3. 当业务指标恶化时,是谁触发回滚,回到哪个版本?

这三问不明确,后续再好的策略都只是“短期可用”。 很多团队把时间花在语法细节,却没有明确治理边界,结果是策略越堆越多、风险越积越大。

二、策略模型:两层解耦,四段执行

推荐采用“两层解耦”模型:

  1. 意图层:仅定义业务语义,不关心设备命令。
  2. 执行层:将意图映射到 LOCAL_PREF、MED、AS_PATH prepend 等动作。

并把执行流程固定为四段:

  1. Ingress 标准化:输入过滤、标签归一。
  2. Intent 分类:Community 映射到业务语义。
  3. Decision 排序:LOCAL_PREF 档位与补充属性联动。
  4. Egress 发布:向不同邻居发布不同结果并打审计标签。

这套结构的重点是“解耦”: 业务团队只提意图,不直接改设备;网络团队只维护映射,不直接改业务含义。这样可以减少跨团队误操作。

三、LOCAL_PREF 档位设计:禁止自由赋值

LOCAL_PREF 最怕“临时值文化”。 如果团队允许随意打值,半年后你会看到 97、173、245 这种毫无语义的数字,任何故障都难定位。

建议固定档位,例如:

  1. 350:应急兜底路径(仅故障模式)。
  2. 300:关键业务主路径。
  3. 250:普通业务优先路径。
  4. 200:默认主路径。
  5. 150:可接受备路径。
  6. 100:成本优先或低优先级路径。

并设置两条强约束:

  1. 单次变更跨档不超过一级。
  2. 应急档位必须带自动过期。

有了档位约束,收敛行为就更可预测;没有约束,网络会变成“谁最后改谁说了算”。

四、Community 语义字典:让机器和人都能读懂

Community 不是注释,而是接口。 建议建立“字典化”机制,字典至少包含:

  1. 标签编码。
  2. 语义说明。
  3. 作用域(iBGP/eBGP/对等体组)。
  4. 风险等级。
  5. 自动回收规则。
  6. 对应 LOCAL_PREF 档位。
  7. 对应观测指标。

例如:

  • 65000:110:低时延优先。
  • 65000:210:成本压降策略。
  • 65000:310:安全收敛保护(限制传播)。
  • 65000:910:维护窗口导流(2 小时过期)。

这类编码的价值在于:看到标签就知道意图,看到意图就知道执行行为。

五、冲突仲裁:显式优先级比“默认规则”更安全

真实网络中,前缀常常同时命中多个意图。 如果不设计冲突仲裁,规则次序变化就可能导致全网路径漂移。

推荐定义显式仲裁顺序:

  1. 安全类策略(泄露防护、黑洞、隔离)优先。
  2. 稳定性策略(抑制、冻结、保护)次优先。
  3. 业务连续性策略(关键业务保障)再次。
  4. 成本优化策略最后。

并要求每次变更附带“冲突影响评估”。 没有评估就不发布,避免把隐含冲突带到生产。

flowchart TD
    A["路由进入策略域"] --> B["安全策略检查: RPKI/角色/前缀白名单"]
    B --> C{"是否命中安全阻断"}
    C -- 是 --> D["拒收或隔离传播"]
    C -- 否 --> E["业务意图解析: Community 字典"]
    E --> F["仲裁引擎: 安全>稳定>业务>成本"]
    F --> G["LOCAL_PREF 档位映射"]
    G --> H["附加动作: MED/Prepend/NO_EXPORT"]
    H --> I["发布并记录版本与变更单"]

六、收敛稳定性:把“快”约束在“稳”的边界内

策略系统的价值不只是导流,还要在故障时不失控。 这里建议三条工程纪律:

  1. 单窗口单变量:同一窗口只改一种映射逻辑。
  2. 单区域先行:先灰度一个故障域,再扩大范围。
  3. 明确停机线:更新风暴、会话 flap、业务劣化任一触发即冻结。

另外要特别警惕“高频微调”。 频繁调 LOCAL_PREF 虽然看起来细粒度,但会导致持续 best-path 重算,控制面与数据面都承压。建议设置最小变更间隔,并对连续变更做自动合并。

七、路由泄露防护:策略设计必须内生安全

Community/LOCAL_PREF 设计如果不含安全约束,会被错误更新放大。 推荐把以下机制写入主模板,而不是外部补丁:

  1. 入口前缀白名单与 AS_PATH 合法性检查。
  2. RFC 8212 默认拒绝无策略 eBGP 发布。
  3. RFC 9234 角色与 OTC 约束,限制越级传播。
  4. max-prefix 分级阈值与自动断邻保护。
  5. RPKI Origin Validation 结果驱动的策略分流。

这样做的原则是:安全校验在前,业务调优在后。 如果顺序反过来,业务策略会掩盖安全异常,直到事故放大才暴露。

八、可观测性:策略系统必须可回放

要让策略成为工程系统,必须能回答三个问题:

  1. 哪条规则在何时命中了哪些前缀?
  2. 命中后路径如何变化,收敛用了多久?
  3. 变化后业务指标是否受影响?

建议观测数据分三层:

  1. 控制面:会话状态、更新速率、RIB 变化、收敛耗时。
  2. 策略面:标签命中率、档位分布、冲突次数、回滚次数。
  3. 业务面:时延、丢包、成功率、关键交易耗时。

并把变更版本号写进 telemetry 标签。没有版本标签,异常回溯会非常慢。

九、变更治理:把路由策略纳入 CI/CD

推荐执行以下发布流水线:

  1. 语义校验:标签是否存在、是否过期、是否越权。
  2. 依赖校验:前缀集、邻居组、模板引用是否完整。
  3. 仿真验证:抽样前缀下路径变化是否符合预期。
  4. 灰度发布:按设备组或区域逐步放量。
  5. 指标门禁:收敛与业务指标同时达标才允许下一步。
  6. 自动归档:记录审批、版本、命令摘要、回滚点。

值班侧要准备三种预置回滚包:

  1. 意图层回滚包:撤销 Community 标签映射。
  2. 执行层回滚包:恢复 LOCAL_PREF 基线档位。
  3. 边界层回滚包:恢复出口发布白名单。

十、演练机制:策略可靠性来自重复验证

建议每季度至少做三类演练:

  1. 误标签演练:验证冲突仲裁与自动拦截是否生效。
  2. 泄露演练:验证角色约束与 max-prefix 防线是否有效。
  3. 回滚演练:验证门禁触发后能否在预期时间内恢复。

演练记录必须包含时间线、触发条件、执行动作、恢复时间、改进项责任人。 如果演练只写“成功/失败”,那它对治理几乎没有价值。

十一、常见误区清单

误区 1:把 Community 当成“附带字段”,不做版本化管理。 误区 2:LOCAL_PREF 值自由扩张,长期失去语义秩序。 误区 3:只看网络指标,不看业务体验变化。 误区 4:把回滚看成失败,导致应回滚时犹豫不决。 误区 5:安全规则单独维护,与业务模板脱节。

修正方式只有一句话: 让策略从“配置集合”升级为“有生命周期的工程资产”。

十二、可执行落地清单

  1. 建立唯一 Community 字典仓库。
  2. 固化 LOCAL_PREF 档位并禁止自由赋值。
  3. 引入冲突仲裁引擎并生成审核报告。
  4. 对高风险策略启用 TTL 与自动回收。
  5. 把 RPKI、角色约束、max-prefix 并入入口模板。
  6. 构建控制面 + 策略面 + 业务面的联合看板。
  7. 发布流水线接入仿真、灰度、门禁、自动回滚。
  8. 季度演练与复盘闭环制度化。

做到以上八点,Community 与 LOCAL_PREF 才能真正成为“可长期维护”的生产能力,而不是一次性的调参技巧。

十三、评审问卷模板(可直接用于变更会)

为了防止策略评审流于形式,建议在每次发布前固定回答以下问题:

  1. 本次变更影响的前缀规模是多少,是否跨区域。
  2. 是否引入新的 Community 语义,如有是否完成字典审批。
  3. LOCAL_PREF 是否出现跨档跳变,原因与回收计划是什么。
  4. 是否触发了安全规则变更,RPKI 与角色约束是否复核。
  5. 失败时预计多久回滚,回滚后的验证指标是什么。
  6. 本次变更是否安排了发布后观察窗,谁负责最终关闭工单。

这组问题看似流程化,但它能显著减少“上线后才发现缺条件”的情况。 真正的高可用网络,靠的不是某个高手的临场反应,而是每次评审都把风险暴露在上线前。

十五、策略字典版本治理补充

Community 与 LocalPref 的组合策略如果缺少版本治理,很快会出现“线上行为与文档不一致”。建议将策略字典分为主版本和次版本:主版本用于语义或档位体系变更,次版本用于非破坏性映射调整。任何主版本发布都要附带兼容窗口,明确旧标签何时停止使用、旧档位何时回收。对于跨团队协作场景,还应提供“变更说明最小集”:影响范围、回滚点、监控项、业务风险等级。发布后 7 天内必须完成一次版本健康检查,确认是否出现异常命中增长或策略冲突。通过版本治理,策略体系可以在持续迭代中保持可解释性,避免“越优化越难维护”的常见陷阱。

补充版本纪律:每次策略主版本发布都应附带“冲突矩阵”和“降级矩阵”,明确哪些标签组合禁止共存、哪些档位回退可跨级执行。把矩阵写入评审模板后,可显著减少上线后才暴露的组合冲突。