摘要

  • 一套 BGP 路由政策可以在更新前后都正确,却在更新途中失去某条拒绝规则。即时执行接口会让尚未完成的 permit 规则提前生效,非原子重排也可能先删除旧过滤条件,再等待新条件到位。
  • 第 03 版把这段风险窗口与规则顺序、控制平面计算量、完整规则集切换、幂等部署和生成失败联系起来。API 返回成功不是全程安全证明;还需要有效政策与路由变化的独立回执。

变更单里的四条规则没有错。变更前的路由器有这四条规则,变更后的路由器也有。两张快照之间,一条拒绝规则短暂消失,一条本应被挡住的路由穿了过去。

最终配置没有留下这个开口。

这正是 Current Options for Securing Global Routing 第 03 版的运营价值。该文本于 2026 年 10 月 2 日更新,是 IETF stream 中 GROW 工作组的活跃 Internet-Draft,预期状态为 Informational,2027 年 4 月 5 日到期。它不是 RFC、最终 IETF 共识、Best Current Practice、产品合规结论,也没有报告某个真实网络发生路由泄漏。草案明确把自己界定为当代、非穷尽且非权威的工具库,不保证任何方法永远适用或充分。

它提出的关键问题不是又一种 BGP 安全机制,而是:配置以什么方式成为现实。

命令顺序本身就是政策

一些设备接口允许先暂存多项变更,再作为一个事务原子提交。另一些接口收到一条命令就立即执行。两种接口可以接收完全相同的目标配置,却让网络经历不同的中间状态。

草案以 route-map 为例。运营者创建新规则,设置 action permit,随后才添加 large community。对即时执行设备而言,permit 在第二步后已经生效。如果该新规则排在“拒绝从上游学到的路由”之前,未完成的规则会先接受所有路由,把上游路由泄漏给对等方。

问题不只是“命令输错顺序”。接口把每个半成品都变成了有效政策。变更前做代码审查、变更后读取完整配置,两者都可能通过,却共同漏掉唯一真正危险的状态。

目标政策表达控制器想要什么,有效政策决定路由器此刻愿意接收或发布什么。在就地编辑期间,两者可能分离。即使目标文件经过更严格的审批,对网络拥有实际权力的仍是设备当时执行的状态。

一次重排也会产生风险窗口

草案给出另一组出口规则:拒绝从上游学到的前缀、拒绝 bogon、拒绝 RPKI invalid NLRI,最后接受剩余路由。运营者只是想交换 bogon 与 RPKI-invalid 两条规则的位置。

非原子实现可能把它拆成四步:删除旧 bogon 规则;在空位添加 RPKI 规则;删除旧 RPKI 规则;在新位置添加 bogon 规则。第一步与第二步之间,bogon 可以通过。如果执行在删除后失败,“短暂状态”就会成为持续运行的政策。

“这个窗口应该很短”不是证据。草案特别指出,资源受限或高负载控制平面会延长不一致状态。管理端超时只说明客户端停止等待,不说明路由器回滚。重试也可能在已经改变的状态上重复命令。

草案建议先确认设备是否原子应用规则变更。若不能,应考虑离线构建一套完整新规则,把邻居引用一次切换到新对象,确认激活后再删除旧对象,而不是直接编辑正在执行的规则。

不过,“引用已切换”仍需证明。NETCONF 的 candidate/running datastore 与 commit 展示了事务型控制可以怎样表达,但不能证明每台 NETCONF 设备、每种路由政策子系统都提供同样原子语义。NMDA 区分 intended 与 operational state,也在提醒同一个问题:真正生效的是什么,何时生效?

规则顺序也是计算预算

谓词顺序不仅改变政策含义,还改变控制平面得到同一结论之前必须完成的工作量。

第 03 版构造了一个假设场景:某个 peer 发来一百万条 IPv4 NLRI,其中只有 60 条属于允许的邻居 cone。低效顺序先给所有路由加两种 community,再检查私有 ASN、bogon 与 RPKI invalid,最后才拒绝 cone 之外的路由,总计执行 5,986,500 次操作。先执行高选择性的 cone 检查后,草案给出的总数降至 1,000,300。

这些是草案示例,不是对某品牌设备的基准测试。结构性结论仍然成立:若便宜的早期条件最终会拒绝一条路由,先为它装饰 community 或执行昂贵检查就是可避免的负载。草案还给出依实现而异的成本次序:scalar、tree lookup、list lookup、regular expression。

这与事务安全直接相关。低效规则占用的正是完成变更所需的控制平面。多个邻居还能同时放大输入。命令生效越慢,不安全中间状态存活越久。规则顺序因而同时决定政策语义、计算成本与风险窗口长度。

幂等不等于原子

草案建议在专用系统生成前缀过滤器,而不是在路由器上生成;只有政策发生变化时才部署。这样的幂等性很有价值:相同输入不应周期性制造控制平面工作。

但幂等不是原子。一项部署可以在每次重试后都收敛到同一最终规则,却在第一次执行时逐一穿过不安全状态。幂等也不等于内容正确;一份未改变但错误的政策,只会被高效地跳过。

证据链应分别保存:生成器输入摘要、目标政策摘要、设备格式政策摘要、变更前有效政策、暂存验证、激活回执、变更后有效政策和观测到的路由差异。一个叫“deployed”的绿灯无法说明究竟验证了哪一环。

生成失败也是路由政策

规则生成可能失败。草案建议在应用前检查明显异常,例如输出突然变得很大、很小或完全为空,并在必要时要求人工介入。

失败后的选择没有中性答案。全放行可能破坏路由安全;全拒绝可能把大量流量赶向上游,造成更大损害;沿用旧规则会在较小范围内错误接收或拒绝已经变化的前缀。草案让每位管理员依据自己的政策作出选择。

因此,fallback 应在故障前按邻居类型决定。客户、peer、上游与 route server 不必共享同一答案。决定应写明允许陈旧多久、流量代价、升级负责人以及恢复自动生成政策所需的证据。

RFC 8212 对缺少 import/export policy 的 eBGP 会话规定 default reject,是重要底线,却不证明两套已有政策之间的转换安全。RPKI origin validation、BGP Roles 与 OTC 可以提供有价值的判断条件,同样不能让安装这些条件的操作自动获得事务语义。