摘要

  • RFC 6996 要求:由私有 ASN 发起的前缀在进入全球互联网前,必须从 AS_PATH 以及适用时的 AS4_PATH 中清除私有编号。它规定的是公共边界结果,并没有规定所有厂商都采用同一种算法。
  • “只删开头”“删除全部”“替换”“保留对端 ASN”等模式会让同一输入产生不同公开路径。删除可能让路径变短并改变选路;替换可能保留计数,却把多个内部身份折叠成一个公网身份。
  • 安全运行必须同时保留入站原始路径、重建后的四字节路径、按邻居和 AFI/SAFI 版本化的转换规则、Adj-RIB-Out、下游接收与最佳路径、FIB 和数据包证据。采集器里一条干净路径只证明最终投影干净,不证明历史完整。

一份路由,三份公开履历

设想一个合成实验环境:上游把仅供文档示例的 ASN 64497 用作边界身份。64497 并非全球分配的生产公网 ASN。客户内部使用 65020、65030 和 4200000041,并让一个测试前缀经过这三个自治系统。另有一条实验路径在两个私有编号之间插入了一个非私有的文档示例 ASN。这两种输入故意触碰实现最容易分歧的地方。

出口甲从路径左端开始扫描,删掉连续的私有编号,遇到实验路径中的第一个非私有文档 ASN 就停止。出口乙启用“all”,把混合路径中任何位置的私有编号都删掉。出口丙不删除位置,而是把每次出现的私有编号换成实验上游使用的文档 ASN 64497。随后三台设备按普通 eBGP 行为追加本地 ASN。

甲的下游看见更短的路径;乙的下游看不见客户内部的任何身份;丙的下游看见多个连续的 64497,可能触发最大 prepend、路径正则或环路策略。若还有一台旧设备只识别 16 位私有范围,它甚至可能留下四字节的 4200000041。配置名称相似,公开事实却不相同。

这不构成让私有编号泄漏到全球路由表的理由。私有编号不具全球唯一性,公共边界必须清理。问题在于:不能把一组具有不同控制后果的转换统称为“已经清除”,然后让观察者误以为公开 AS_PATH 就是原始历史。

“私有”指作用域,不指秘密

IANA 将 64512–65534 和 4200000000–4294967294 保留为 Private Use。64496–64511 是文档示例用途,不是生产私有身份;65535 与 4294967295 又由 RFC 7300 单独保留。这个区分必须进入自动化的类型系统,而不是落在一条“数字看起来很大”的正则表达式里。

错误的范围表有两种相反风险:它可能把文档编号、保留哨兵或未来分配删除,也可能漏掉真正的四字节私有编号。更危险的情况是命令接受、变更单关闭、但运行版本仍按旧范围工作。此时符号层宣布合规,运行层却把非唯一身份送到公共互联网。

私有编号在获准的内部作用域里可以是真实的运营身份。RFC 7938 描述的大规模数据中心 Clos 网络会在多个集群内分配或复用私有 ASN。它们参与环路检测、故障定位和拓扑表达。只有当这些编号离开本地清单能够解释的边界,它们才变成全球含义不确定的值。

所以,清除不是“保密功能”。若运营商没有保留从公网邻居、客户会话和原始路径到内部身份的映射,删除只会毁掉归因证据。公共层应当暴露全球可解释的责任主体;私有层仍应保存足以解释这条公开投影的账本。

RFC 6996 给出不变量,没有给出万能按钮

RFC 6996 明确要求私有 ASN 不得随私有源前缀进入全球 AS 路径,并特别指出四字节环境中的 AS4_PATH。常规的路由过滤也可以阻止这类前缀外泄。它建立的是最小公共不变量:非唯一的本地身份不能伪装成全球可归因的一跳。

同一文档也提醒实现差异。发布时已有实现遇到“公网与私有混合路径”便完全不删除;不了解新私有范围的设备可能同时在 AS_PATH 与 AS4_PATH 上漏清。RFC 并未给删除过的节点设置带内墓碑,也未让下游协商“limited”“all”“replace”或 peer 例外的语义。

这正是最小初始规范应当承担的角色:标准化共同边界需要的结果,把未来选择留给本地实现。但本地选择必须被命名、版本化和验证。选择自由不等于语义相同,更不等于可以只检查配置文本。

AS_PATH 同时是控制输入与证据记录

RFC 4271 把 AS_PATH 定义为众所周知且强制的路径属性,由有序 AS_SEQUENCE 与无序 AS_SET 构成。eBGP 发出路由时通常追加自身 ASN;接收者查找自己的 ASN 以发现环路;实现经常在最佳路径中比较 AS 路径长度,策略也会匹配特定序列。

因此,删掉一跳绝不只是改善显示。三个私有 ASN 被删除后,原本四跳的公开候选可能只剩提供商一跳,从而胜过另一条路径。物理距离、合同关系和转发拓扑都没有变化,控制面偏好却改变了。

替换解决的只是计数问题。把 65020、65030、4200000041 全换成 64497,可以保留出现次数,却让路径看起来像提供商反复 prepend。下游针对单个 ASN 重复次数的过滤器会得到另一种输入,原来的三个内部责任域也不再可区分。

对端 ASN 例外则触及环路证据。某些实现默认不删除等于下游对端 ASN 的私有值,使对端仍会因“看见自己”而拒收。Junos 提供 no-peer-loop-check 改变该限制,Nokia 提供 skip-peer-as 选择。关闭例外并不只是“清理得更彻底”,而是主动移除某个环路信号。

应问的问题不是“所有私有编号都没了吗”,而是“在删除全球含义不确定的身份时,哪些选路、环路与归因性质必须继续成立”。

相似命令掩盖不同算法

Cisco 文档记录了清晰的版本边界:较旧行为在路径混合公网与私有 ASN 时不做删除,较新模式能够处理混合路径;all replace-as 会用本地路由器 ASN 代换。功能还可能按地址族配置,所以同一邻居的 IPv4 与 IPv6 会出现不同履历。

Junos 通常从新近添加的左端开始,遇到首个公网 ASN 或等于对端 ASN 的私有值便停下;all 改变扫描范围,replace 与 nearest 决定替换来源。文档还说明,联邦成员段会在该操作之前处理。

Nokia SR OS 将 limited、skip-peer-as 和 replace 分开,并根据 local-as、路由器 AS 或联邦上下文确定替换值。它直白指出:删除会缩短 AS_PATH,可能令路由更受偏好;与 as-override 联用时,先执行私有 ASN 清除。

Arista 同样区分保留、删除和替换,其文档对混合路径行为又有自己的限制。结论不是给厂商排正确性名次。命令是符号接口,部署版本的实际输出才是可执行权威。混合网络需要语义矩阵,而不是“支持/不支持”一列布尔值。

每个平台与版本至少要记录:识别的两个私有范围、只删开头还是删除全部、混合路径、对端例外、替换值、联邦处理顺序、AS4 重建、AFI/SAFI 作用域、计数器和可观测路径。

AS4_PATH 让“清了一半”成为现实

四字节 ASN 与旧 BGP 发言者互通时,路径信息可能分散在 AS_PATH 与 AS4_PATH 中。RFC 6793 定义新发言者如何重建有效路径,也承认某些情况下无法完全重建。RFC 6996 同时点名两个属性,因此不是多余措辞。

旧实现可能删掉可见 AS_PATH 里的 16 位私有值,却在 AS4_PATH 留下四字节私有值;另一个实现可能按重建路径决策,普通命令却只展示原始属性之一。测试必须保存三个视图:原始 AS_PATH、原始 AS4_PATH、平台重建的有效路径,并在出站策略前、转换后和支持四字节的下游分别比较。

AS_TRANS 也不能因为靠近这条边界就被当成私有 ASN。它是四字节过渡机制中的特定保留值。用过宽匹配器删掉 AS_TRANS 会破坏路径重建,而不是提高公共卫生。

联邦清除是另一种权限

BGP 联邦通过 AS_CONFED_SEQUENCE 和 AS_CONFED_SET 在内部表达 Member-AS 结构,对外则呈现联邦标识。RFC 5065 规范了这些段。运营者常为成员选用私有 ASN,但“联邦成员”和“私有编号”是两个维度:私有 ASN 未必属于联邦,成员编号也未必私有。

两个机制并存时,顺序决定输入。如果联邦段先被移除,remove-private 看到的路径就与早期诊断不同。证据账本必须区分“因联邦边界删除”“因 IANA Private Use 类型删除”和“由出口策略替换”。把三者都记作“已清洗”,会让回滚与事故复盘失去因果链。

编号复用让环路问题更难

私有编号的价值来自可在隔离作用域复用。数据中心可以在多个集群重复使用一组 leaf ASN。一旦并购、灾备或临时骨干把这些作用域接起来,路由器可能从另一个物理主体收到与自己相同的私有 ASN,并把合法路由误判为环路。

一些设计使用 allowas-in 或类似例外。RFC 7938 讨论了这种做法,也指出它没有标准化。拓扑如果提供其他可靠边界,这可能是有理由的本地选择;但普通的“路径里出现自己即拒绝”不变量已经不再构成完整证明。

公共出口删除重复编号,可以避免外部假环路,却不能修复内部身份冲突。把所有重复值换成公网 ASN 又会制造另一种重复形态。领导层不应把出口清理当成连接两个复用域之前可以跳过编号盘点的理由。

干净的采集器路径只证明最终投影

合成文档范围实验中的路由采集器看见 64497 64498 且没有私有编号,只证明这个观测点收到一份合规投影;它不会让这两个文档 ASN 变成全球分配的公网身份。它也不能说明此前有哪些私有 ASN、出口采用删除还是替换、另一个邻居或地址族是否相同、内部源是否获授权。

RFC 6996 指出,识别来源可能需要回溯相邻的全球唯一 ASN 或检查其他属性。换成运营语言,就是公共提供商继承了证据义务。它必须能把每条公开客户路由映射回客户关系、入站会话、原始路径、策略版本和变更时间。

最小账本应包括前缀、AFI/SAFI、源对端、关系类别、原始 AS_PATH 与 AS4_PATH、重建路径、IANA 分类版本、清除策略与软件版本、匹配范围、对端例外结果、替换值、策略后路径和本地 prepend;随后关联每个邻居的 Adj-RIB-Out、下游 Adj-RIB-In、最佳路径理由、FIB 下一跳和数据包观测。

这样才能把七个问题分开:内部身份是否在许可作用域使用;路由是否到达正确边界;哪个转换实际执行;所有公共出口是否满足不变量;下游选择是否改变;全球唯一责任主体能否还原隐藏来源;业务流量是否真的迁移。

金丝雀要覆盖分歧点,而非最容易的案例

全私有路径只是起点。测试矩阵还要包含:私有开头后接公网 ASN;公网 ASN 后再次出现私有值;重复私有值;等于邻居 ASN 的私有值;两个私有范围各一个值;不得混淆的文档 ASN;过渡路径中的 AS_TRANS;邻近联邦段;以及跨越新旧发言者的 AS4_PATH。

对每个案例,分别写出 limited 删除、all 删除和替换的精确期望序列。测试负空间:若运行版本不认识四字节私有值,发布必须停止,而不是因为配置存在便放行。对端例外要同时证明一条仍被环路检查拒绝的路由和一条经过明确批准的例外。

上线前比较转换前后的全部候选。如果删除把四跳变成一跳,下游策略与流量工程必须预先审查;如果替换产生多个 64497,最大 prepend 过滤器也要进入测试。

回滚必须触发重新通告。删除配置只改变未来处理,不能证明下游 Adj-RIB-In 已替换旧投影。应按平台语义和收敛风险采用受控策略重评估、route refresh 或会话动作,并再次核验精确路径、候选集、FIB 与数据包。

来源