摘要
- AS 0 是保留的“非身份”,不得作为 BGP 对等体 ASN,也不得出现在 AS_PATH、AS4_PATH、AGGREGATOR 和 AS4_AGGREGATOR;但 ORIGIN 属性值 0 是完全合法的 IGP 编码。
- RFC 7607 要求按承载字段确定最小拒绝范围:OPEN 中的 AS 0 终止连接,AS_PATH 中的 AS 0 使相关路由按撤回处理,聚合或四字节过渡属性中的 AS 0 则触发属性丢弃,而不是自动抹掉整条会话。
一次事故复盘会上摆着三张截图。第一张显示 BGP 邻居反复停在 OpenSent,通知码是 Bad Peer AS。第二张显示邻居仍为 Established,但一批前缀从 Adj-RIB-In 消失。第三张显示前缀仍被接受,只是 AGGREGATOR 属性不见了。
三名值班工程师给出了同一个关键词:AS 0。
如果复盘到此结束,团队就会得到一个错误的自动化需求——“看到零就重置会话”。RFC 7607 恰恰说明,数字相同不代表受损对象相同。零作为 OPEN 的对等体 ASN,否定的是试图建立连接的身份;零位于 AS_PATH,否定的是本次 UPDATE 携带的可达性;零位于 AGGREGATOR 或四字节过渡属性,规范要求先丢弃相应属性,再继续处理其余 UPDATE。
因此,处置 AS 0 的第一条问题不是“严重度多高”,而是“它出现在哪个字段”。字段决定故障单元,故障单元决定本地有权拒绝什么,也决定哪些正常状态不应被连带牺牲。
AS 0 不是占位符
IANA 当前的自治系统编号登记表将编号 0 标为 Reserved,并引用 RFC 7607。特殊用途 ASN 登记表同时列出 AS_TRANS 23456、文档示例段、私有段以及末位保留 ASN。它们不能因为都“特殊”就互换用途。
AS_TRANS 服务于新旧四字节 ASN speaker 的互通。私有 ASN 可以在受控域内使用,并在边界按约定处理。AS 0 没有对应的公共网络主体,也不表示“暂未分配”“匿名”“稍后填写”或“不要展示”。
许多缺陷发生在报文生成之前。配置数据库不允许 null,于是用 0 填空;模板变量未解析,整数转换得到 0;并购或迁移脚本尚未取得目标 local-AS,先把默认值下发。业务系统以为自己只是在满足数据类型,实际上已经向路由协议写入一个禁止身份。
配置阶段拒绝 0 是重要的第一道防线。Juniper 关于四字节 ASN的产品文档说明,在其所述版本与范围内,使用 0 等受限 ASN 会导致 commit 失败。但本机配置干净,并不能证明邻居、路由服务器、聚合器或旧版本实现不会把 0 送上线路。接收端仍须按协议字段正确解析。
OPEN 中的零否定连接身份
RFC 4271定义了 OPEN 报文的 My Autonomous System 字段。RFC 7607 进一步明确:若收到的 peer AS 为零,speaker 必须中止连接,并发送错误码 OPEN Message Error、子码 Bad Peer AS 的 NOTIFICATION;路由器也不得主动声称自己属于 AS 0。
这里的故障单元是尚未成立的 BGP 邻接关系。不存在一张可以在该会话中保留的有效路由表。证据应包括原始或无损 OPEN、发起方向、TCP 端点、收到与发出的时间、NOTIFICATION 码以及反复重连情况。
绕过 peer-AS 检查不是应急修复。没有任何 AS 0 的合法持有者可以授权例外。如果迁移期确实需要使用另一真实 ASN,应当用 local-as 等受控机制明确表示,并评估它对 OPEN 与 AS_PATH 的影响,而不是把 0 变成“先连起来再说”的通行证。
AS_PATH 中的零否定相关路由
若 UPDATE 的 AS_PATH 含有 AS 0,RFC 7607 将它定义为 malformed,并把处置交给 RFC 7606。RFC 7606 对 malformed AS_PATH 规定 treat-as-withdraw:该 UPDATE 携带的路由按已撤回处理,从 Adj-RIB-In 移除。
会话通常可以继续存在,其他有效路由不必因这一条坏路径而全部抖动。这不是对非法值“手软”,而是把拒绝范围限制在无法相信的 reachability。旧式的整会话 reset 会让一个错误属性拖走大量无关前缀,还可能把影响沿着多个对等边界放大。
接收端不能简单删除 AS_PATH 里的 0,再把剩余 ASN 拼成一条“修复后”的路径。AS_PATH 表达对方实际声明的路径,参与环路检测与选路。猜测零本来应该是谁,就是伪造来源。正确做法是拒绝该次路由,并要求写入者重新发送可辩护的路径。
边界过滤仍有价值。FRRouting 的 BGP 文档给出 bogon ASN 过滤示例,其中使用 _0_ 匹配 AS_PATH。它能提供纵深防御和计数,却只覆盖 AS_PATH 可见面,不能证明 OPEN 或其他属性得到了正确处理。
聚合与过渡属性只丢失自身
AGGREGATOR 记录形成聚合路由的 ASN 与路由器地址。AS 0 出现在这个 ASN 位置同样被 RFC 7607 禁止,但 RFC 7606 为 malformed AGGREGATOR 指定的是 attribute discard。接收端删除该属性,继续处理 UPDATE。
这意味着路由有可能通过其他检查并进入后续选路。它并非一定保留,也并非已经安全;只是 AS 0 这个错误本身所授权的动作,是丢弃 AGGREGATOR 而不是撤回 NLRI。团队若把“任何含 AS 0 的 UPDATE 都必须 treat-as-withdraw”写入运行手册,就会扩大规范没有授予的破坏权。
RFC 6793定义 AS4_PATH 与 AS4_AGGREGATOR,用来在四字节能力不一致的新旧 speaker 之间恢复 ASN 信息。RFC 7607 把这两个属性中的 AS 0 定义为 malformed,并要求按 RFC 6793 处理。在相应上下文中,接收端丢弃属性、记录本地日志,并继续 UPDATE 处理。
这里必须保留双方 OPEN 与四字节 ASN 能力。两个都支持四字节 ASN 的 NEW speaker 本不应相互携带 AS4_PATH 或 AS4_AGGREGATOR;此时属性出现本身就需要记录。如果收集系统只保存 UPDATE 而丢掉能力协商,事后就无法判断过渡属性是否本来就不该存在。
属性丢弃也不等于信息没有代价。它可能减少四字节路径重建所需的证据,并隐藏上游生成缺陷。继续处理路由是协议动作;追查并修复写入者仍是运营动作。
合法的 ORIGIN 0 是观测系统的试金石
RFC 4271 为 ORIGIN 属性定义了 0、1、2 三个值,分别代表 IGP、EGP 与 INCOMPLETE。ORIGIN 0 合法,且与“源 ASN 为 0”不是一回事。后者通常要从 AS_PATH 的最右侧序列元素等语义中推导。
一个只对字符串做索引的告警平台,可能把 ORIGIN 0、AS 0、默认路由 0.0.0.0/0、零度量与空计数器聚合成同类事件。噪声增加后,值班人员会压制规则;真正的 AS_PATH 违规也随之被掩盖。
好的回归测试应同时投放六类样本:一个合法 ORIGIN 0,以及 OPEN、AS_PATH、AGGREGATOR、AS4_PATH、AS4_AGGREGATOR 中各一个 ASN 0。平台必须放行合法编码,分别标出五个禁止字段,并记录预期动作。把所有含字节 0 的报文都拦掉,与把所有零都放过一样不合格。
最小证据结构包括:报文类型、属性 type code、原始或无损值、方向、peer、AFI/SAFI、能力上下文、软件版本和时间戳。面向人的标签可以附加,但不得取代可回溯字段。
AS 0 ROA 不是 AS 0 路由
AS 0 在 RPKI 中承担另一种明确语义。RFC 6482把 ROA 定义为含一个 asID 与一组前缀授权的签名对象。RFC 6483说明,资源持有者可以发布 asID 0 的 ROA,表达该前缀及其 more-specific 不应被用于路由。
这个对象不是授权 AS 0 发路由。RFC 6907指出,没有合法 BGP 路由能以 ASN 0 为源,因此也没有路由能匹配 AS 0 ROA。现实中的其他 ASN 若宣告被其覆盖的前缀,在没有任何候选 ROA 正向匹配真实源 ASN 与长度时,会得到 Invalid。
但 AS 0 ROA 不是压过一切的否定票。RFC 6483 允许它与可路由 ASN 的 ROA 并存。只要有一个候选 ROA 匹配实际源、前缀和 maxLength,路由就是 Valid;AS 0 ROA 的存在不会推翻这份正向授权。
两条时间线也不同。BGP OPEN/UPDATE 在会话消息流中被本地即时处理。ROA 需要发布、证书路径验证、采集与 relying-party 缓存更新。路由修正已经到达邻居,不代表 RPKI 缓存已经收敛;ROA 撤销生效,也不代表线路上 malformed UPDATE 的来源已经修好。
因此,复盘应分开记录 BGP 报文/RIB 证据与 RPKI 对象/缓存证据。相同前缀可以让两条时间线相关,却不能让其中一条替代另一条。
从收到什么到发出了什么
RFC 7854定义 BGP Monitoring Protocol,可持续观察 peer 状态、接收的 UPDATE 以及 pre-/post-policy Adj-RIB-In。Pre-policy 证明邻居实际送来了什么;post-policy 证明本地处理后留下什么。只保存后者会让上游长期违规在审计中消失,只保存前者又会让人误以为所有坏状态都被接受。
RFC 9069把 Loc-RIB 纳入 BMP,展示本地 Decision Process 选中的路由。它区别“被接受”与“被选中”,但仍不能替代 FIB 和数据包证据。若声称 AS 0 事件造成服务中断,还要证明转发表与实际流量如何变化。
RFC 8671提供 pre-/post-policy Adj-RIB-Out 观察。RFC 7607 的“不传播”要求由此变得可测试:逐一检查关键出口准备发送的状态,再用对端或下游收集器确认接收或缺失。单个收集点不能证明全球不存在,但明确的出口集合可以完成有边界的证明。
RFC 7454提供边界过滤和 AS-path 管理的一般运营框架;RFC 7607 则给出本案按字段的强制规则。两者结合的证据链应为:原始报文、能力与 peer、规范动作、pre/post-policy 差异、Loc-RIB、必要时的 FIB/数据包、所有重要 Adj-RIB-Out、源配置缺陷、修正后的新报文。
来源
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance