摘要

  • 路由聚合把多个更具体前缀变成一个较不具体的公告。RFC 9774 不再允许把 AS_SET 当作常规结果;ATOMIC_AGGREGATE 表明 AS_PATH 已遗漏信息,AGGREGATOR 则标明最后形成该聚合的 speaker。
  • 聚合路由存在、ROA 匹配、BGP 会话 Established,都不能证明覆盖范围内每个地址可达。某个贡献前缀消失后,数据包可能被聚合路由对应的 discard 正确丢弃,而外部控制平面没有任何变化。
  • 只有在起源由策略明确选定、面向贡献 AS 的过滤可证、压缩前证据可查询、RIB/FIB 与数据包均已验证、整套合同可以回退时,管理层才应授权这种信息损失。

凌晨 2 点 13 分,骨干网把四条客户 /24 汇总为 203.0.112.0/22。AS 64505 对外起源这个聚合;ROA 对 /22 与 64505 的组合给出授权;UPDATE 携带 ATOMIC_AGGREGATE 与 AGGREGATOR。上游只需要处理一条稳定路由,这是合理的工程目标。

凌晨 3 点 07 分,客户维护导致 203.0.114.0/24 消失。其他三条贡献路由仍在,所以设备继续生成 /22。公共 collector 看不到撤回,RPKI-ROV 仍给出 Valid,上游会话保持 Established,FIB 中也继续存在聚合项。看板因此把事件判为正常。

但发往缺失 /24 的探测包进入 AS 64505 后,找不到任何更长匹配,最终命中聚合的 null route。这个丢弃动作没有制造故障;它避免数据包沿另一个较不具体路径离开,再被聚合吸回而形成环路。真正的服务中断发生在贡献路由消失时,聚合只是把它从外部观察者面前遮住了。

这个事件是合成案例,协议机制却都是真实的。ATOMIC_AGGREGATE 从未承诺交付。它表达的事实更窄:该网络愿意为一个覆盖范围发布摘要,同时承认公开 AS_PATH 不能完整列出形成这份摘要的实际路径。

聚合不是缩短显示,而是创建一项新声明

BGP 聚合把多个更具体目的地的路由合成为一条较不具体 NLRI。新路由有自己的属性、激活条件、出口策略和转发后果。它并非四条原路由的视觉别名;它可以在某些组成部分消失后继续存在。

RFC 4271 的原始算法先找出所有贡献 AS_PATH 共有的最长前导序列,再把其余 AS 号码放入无序 AS_SET。若两条路径分别为 64510 64520 和 64510 64530,公共前导是 64510,集合还能说明 64520 与 64530 参与过。

然而,无序集合无法说明穿越顺序,也会让用于起源判断的最右侧 AS 失去唯一含义。它与需要确定起源或有序路径的安全机制天然紧张。RFC 6472 在 2011 年建议不再使用 AS_SET 与 AS_CONFED_SET;2025 年 5 月发布的 RFC 9774 把建议提升为标准要求,并取代 RFC 6472。

新规则并未禁止聚合。在没有明确配置的过渡例外时,speaker 不得发送含这两类 set 的 UPDATE,收到时必须按 treat-as-withdraw 处理。现代方法保留确定的序列,明确选定起源,并用一个警告承认已删除路径信息。

长度为零的属性,说明知识也有边界

ATOMIC_AGGREGATE 是编号 6 的路径属性,well-known、discretionary,值长度为零。里面没有被删掉的 AS 清单,没有贡献路由哈希,没有时间戳,也没有签名。它的全部意义来自共同协议。

聚合因丢弃 AS_SET 而漏掉原路径中的 AS 号码时,公告应携带它。接收方转发路由时不应移除它,也不得据此把 NLRI 再细分后向其他 BGP speaker 公告。更关键的是,接收方必须知道:到达该 NLRI 所覆盖目的地的实际路径,可能经过 AS_PATH 中没有列出的 AS。

这是一项关于“不知道什么”的声明。它确认遗漏,却不复原内容;它不认证聚合者,不授权前缀,也不证明可达。若任一贡献路由本就带有该属性,新生成的聚合必须继承它。第二次摘要不能洗掉第一次信息损失。

这也划清了权力边界。公共声明之所以有效,是因为它足够薄,只给其他网络必要的信息。它不能反过来成为被删事实的最高权威。路径更短,不是因为证明更强,而是因为细节已被拿走。

AGGREGATOR 记录最后一次动作,不是完整保管链

AGGREGATOR 是编号 7 的 optional transitive 属性。形成聚合的 speaker 可以写入自己的 AS 号与 IP 地址,后者通常为 BGP Identifier。RFC 9774 的 consistent brief 聚合要求它与 ATOMIC_AGGREGATE 一起出现。

两者回答不同问题:ATOMIC_AGGREGATE 说路径信息不完整;AGGREGATOR 说谁最后形成了当前这份聚合。它不列贡献者,不记录策略版本、控制器决策、工程师审批,也不保留所有更早的聚合动作。RFC 4271 明确要求不能把贡献路由上的旧 AGGREGATOR 原样带入新聚合。

它也不是密码学证明。公共 collector 显示某个 AS 与 BGP Identifier,并不能独立证明该 speaker 控制地址块、遵循正确策略或保存了来源证据。四字节 ASN 只增加兼容规则:新 speaker 之间使用带四字节 ASN 的八字节 AGGREGATOR;经过旧 speaker 时,可以用 AS_TRANS 与 AS4_AGGREGATOR 保存不可映射的号码。号码被保存,权威性并未因此增加。

RFC 7606 对畸形 ATOMIC_AGGREGATE 或 AGGREGATOR 采用 attribute discard,而不是自动重置整条会话。这缩小了故障半径,但也意味着路由可能继续可用,警告或归属字段却已经丢失。错误事件必须独立留痕,不能由绿色会话状态代替。

起源不能由最后一条尚存路由偶然决定

丢弃 AS_SET 后形成的方式通常称为 brief aggregation。它只保留所有贡献路径共有的最长前导序列。问题是,贡献集合会随邻居状态变化。

两条互不相同的路径同时存在时,共同序列可能为空;其中一条消失后,剩余路径的最右侧 AS 又可能变成聚合的表面 origin AS。这样一来,对外责任不是由政策决定,而是由哪条会话先断开决定。

RFC 9774 提出的 consistent brief aggregation 要求把路径截断到所选 origin AS 最右侧那次出现之后。这个起源可以是聚合 AS 自己。若要让 RPKI 起源验证为 Valid,覆盖前缀还必须有与该起源匹配的 ROA。

这项规则把偶然变成决定。AS 64505 对 /22 负责,不是因为它恰好在路径计算中幸存,而是因为运营者主动选择它作为公开起源,并接受相应义务。

还要区分 origin AS 与 BGP 的 ORIGIN 属性。前者来自 AS_PATH 最右端并用于起源推理;后者表示路由信息通过 IGP、EGP 或其他方式进入 BGP。聚合 ORIGIN 按 RFC 4271 取最不利值:INCOMPLETE 高于 EGP,EGP 高于 IGP。把两个字段都翻成“起源”会制造错误看板。

Valid 也只是有限结论。RFC 9582 中的 ROA 表示地址空间持有人授权某 AS 起源指定前缀。它不验证被删的贡献路径、AGGREGATOR 地址、NEXT_HOP、FIB、discard 或最终数据包。

AS_SET 消失后,防环责任转移到了策略

AS_SET 虽然模糊,却保留了能触发普通 AS 环路检测的号码。贡献 AS 收到覆盖自己的聚合时,若在集合中看到自己,就会拒绝该路径。删除 set 后,这份自动证据也消失了。

RFC 9774 因此要求运营者不要把聚合公告给贡献 AS。每个贡献者应收到其他适用的更具体路由,同时排除从它自己学来的那条。这个控制是按邻居、按方向定义的。一个笼统出口过滤器未必能正确表达。

数据平面还有第二道边界。RFC 4632 要求生成聚合的路由器丢弃那些只匹配聚合、却不匹配任何可达更具体路由的数据包。通常实现是一条指向 null 或 discard 的聚合路由。若没有它,数据包可能顺着 default 或从邻居学来的较不具体路由离开,随后又被聚合吸回,形成转发环路。

因此,discard 是安全证据,却不是服务成功。被它丢掉的数据包说明防环机制正确,也说明该地址没有可达贡献路由。只看“聚合已安装”,会把正确遏制误报为正常交付。

证据必须在压缩前建立

公共 collector 能证明聚合曾经可见、外部看到哪个 origin AS,以及两个属性是否传到观察点。它不能显示在策略前被拒绝的贡献者,也不能找回 ATOMIC_AGGREGATE 已承认被删除的 AS。

运营者需要一份压缩前台账。每个聚合应记录配置前缀、必需与可选贡献者、激活条件、每条 pre-policy 与 accepted 路径、计算出的共同序列、选定起源、ROA 状态、策略版本与执行聚合的设备。否则,静默邻居和被拒路由会变成同一个不可解释的空白。

生成结果也必须分阶段保存:Loc-RIB、出口策略前后 Adj-RIB-Out、ATOMIC_AGGREGATE、AGGREGATOR 或 AS4_AGGREGATOR、NEXT_HOP、ORIGIN、community,以及更具体路由是否被抑制。即便 RFC 7606 只丢弃畸形属性,相关错误也要保留。

最后以转发收口。在软件 RIB 与硬件 FIB 中确认 discard。对每个活跃贡献前缀测试一个地址,再对一个故意缺失的覆盖区域测试一个地址。前者应交付,后者应在本地结束;两者都是有意义的结果,但绝不能归为同一种“健康”。

应分别告警四种状态:贡献者存在;贡献者缺失但聚合按合同存在;聚合缺失;聚合存在但 discard 不在硬件中。第四种最危险,因为公共控制平面看似完整,防环不变量却已消失。

把变更与回退视为一个完整合同

聚合变更同时触及 NLRI、贡献路由、激活条件、起源、ROA、信息损失警告、执行者归属、邻居出口、细路由抑制与数据平面丢弃。只验证一条命令并不等于验证变更。

canary 必须同时证明正向与负向。活跃 /24 中的地址应可达;受控撤下测试贡献者后,该范围内的地址应在聚合 AS 内命中 discard,而不能逃向邻居。与此同时,逐项核对 AS_PATH、ATOMIC_AGGREGATE、AGGREGATOR、起源验证以及更具体路由公告。

rollback 也必须恢复整套合同:贡献路由导入、抑制、聚合生成、起源选择、ROA、出口过滤和 null route。仅把配置行改回,却没有恢复依赖的具体路由,不是回退。