摘要

  • BGP Confederation 用一个对外可见的 AS identifier 代表多个内部 Member-AS。内部 route 通过 AS_CONFED_SEQUENCE 或 AS_CONFED_SET 保留成员路径,但这些 segments 在真正向外通告前必须删除。
  • 删除是 interoperability contract,不是“内部路径已经无关”的证明。LOCAL_PREF、NEXT_HOP、MED、candidate visibility、Member-AS 身份和 route reflector 结构,都可能在公网 AS_PATH 完全稳定时改变可达性。
  • Leadership 只有在每个隐藏边界都有 owner、pre-sanitisation evidence、RIB/FIB 与 packet proof,并且 Member-AS 迁移可逆时,才应允许多个运行域压缩成一个公网身份。

凌晨 1:40,一次内部重组进入最后阶段。边界 router Delta 要从 Member-AS 65021 迁入 65031;两者都属于 Confederation AS 64500。设计目标很清楚:transit、customer 和 route collector 不应感知内部组织变化,外部 OPEN 身份和 public AS_PATH 必须保持不变。

变更平台显示配置已下发。Delta 的外部 sessions 全绿,public collector 仍看到 64500,prefix 的公网 origin authorization 也没有变化。按照常见 dashboard,这次迁移已经成功。

内部 adjacency 却给出另一个现实。Delta 已经用 65031 发起连接,邻居 Echo 仍把这条 link 配置为 65021 的 confederation peer。一种实现直接拒绝建立 adjacency;另一条备用路径虽然继续存在,却保留了新 Member-AS 无法 recursive resolve 的 NEXT_HOP,并进入了不同的 MED comparison set。Customer session 没断,route 却没有进入 FIB。

这是一个 synthetic incident,但每个机制都来自规范。公网 AS_PATH 没有“漏掉”内部原因;RFC 5065 本来就要求在外部 export 前移除 Member-AS history。Confederation 的价值正是让外部网络不必理解内部结构。危险发生在 operator 把干净的公网声明误读成干净的内部运行事实。

一个 identifier 不等于一个运行现实

RFC 5065 区分三个概念。AS Confederation Identifier 是整体对外使用的 ASN。Member Autonomous System 是 Confederation 内部的一个 policy domain。Member-AS Number 则是成员之间识别该 domain 的编号。

与外部 peer 交易时,router 使用 Confederation Identifier:OPEN message 里声明它,普通 AS_SEQUENCE 里也通告它。与同一 Confederation 的其他成员交互时,router 使用 Member-AS Number。跨 Member-AS 的 session 在连接机制上属于 EBGP,但 route selection 又被规范要求在若干关键步骤中当作“内部”信息处理。

因此,Confederation 不是把一个大 AS 随意画成小框。每个 Member-AS 可以拥有自己的 IBGP full mesh 或 route-reflection topology、IGP、policy owner 和 failure budget。它减少全组织范围的 full-mesh 压力,也让内部能够使用类似 AS_PATH 的 policy boundary,而不必把每次重组变成全球 peering 事件。

Public identifier 只完成最薄的一层协调:它告诉外部“哪个 AS 正在说话”。它不证明哪个 Member-AS 接受了 route、哪支团队修改了 preference、哪个 next hop 仍可达、哪个 control plane 真正把 entry 写进 hardware。一个公网编号可以代表统一管理,但编号本身不会创造统一管理。

内部路径先被保存,再被有意删除

Confederation 为 AS_PATH 增加两类 segment。AS_CONFED_SEQUENCE 是 UPDATE 在本地 Confederation 内经过 Member-AS 的有序序列;AS_CONFED_SET 是 aggregation 场景中的无序集合。Router 把 route 通告给另一个 Member-AS 时,会把自己的 Member-AS number prepend 到 sequence;不存在时就新建该 segment。

这些字段承担 loop detection。一台 router 若在收到的 confederation segment 中发现自己的 Member-AS number,就按发现本 AS loop 处理。若 route 已包含本地 Confederation Identifier,成员也必须把它当作自己的外部 AS 身份处理。

真正的外部边界执行相反动作。Router 必须先移除全部 AS_CONFED_SEQUENCE 与 AS_CONFED_SET,再把 Confederation Identifier 作为普通 AS_SEQUENCE prepend 进去。RFC 6793 还明确禁止在 AS4_PATH 中携带这两类 confederation segments,避免 four-octet compatibility attribute 变成泄露内部路径的旁路。

所以外部 collector 得到的是准确但被压缩的 statement:route 经过 AS 64500。它得不到 65021 65017 65009,因为隐藏内部 topology 本来就是设计目标。外部 speaker 无需支持 confederation extensions;所有内部参与者才必须支持。

压缩不是造假。错误是要求压缩后的记录回答内部问题。Public AS_PATH 无法证明 Member-AS traversal,也无法证明内部 policy custody;这些信息已经按规范移除。如果 operator 没在 sanitisation 之前保存 evidence,外部任何观测平台事后都不能恢复它。

Membership 是可执行配置,不是架构图标签

Topology diagram 可以把两台设备画在同一个边框里,BGP 要求更严格的双方一致。Juniper 当前 CLI 文档明确指出:两个 neighbor 若对 adjacency 是否属于某个 Confederation 意见不一致,adjacency 就不会建立。

RFC 5065 还定义了路径一致性。来自另一个 Member-AS 的 route,第一段应为 AS_CONFED_SEQUENCE。外部 neighbor 不得发送 confederation segments。所有成员都必须识别这两类 segment。Public ASN 正确,不能补救 member identity 错误或 path format 错误。

RFC 7606 把许多 malformed AS_PATH 错误收窄为 treat-as-withdraw,而不是自动 reset 整个 session。这降低无关 route 的 collateral damage,却也让 dashboard 更容易误判:peer 可继续 Established,问题 NLRI 已经消失。若内部 routers 对同一 UPDATE 采取不同结果,还可能产生 suboptimal routing、unreachability,甚至 long-lived forwarding loop。

真正的 control chain 应当逐项证明:双方配置的 identity 相符;OPEN exchange 显示预期 peer;received AS_PATH 的 segment type 与成员正确;policy 执行预期动作;RIB 与 FIB 一致;packet test 从预期出口离开。仅证明 session up,没有证明 route alive。

EBGP 的 wire,内部政策的后果

不同 Member-AS 之间使用 EBGP session。若 operator 只记住这个 label,就会套用错误的默认假设。RFC 5065 有意修改了跨这些 links 的 attribute 与 selection semantics。

在 IBGP-versus-EBGP preference 步骤,来自同一 Confederation 另一成员的路径按 internal 处理。CONFED_SEQUENCE 和 CONFED_SET 不计入 AS_PATH length。LOCAL_PREF 可跨 member boundary 传播;NEXT_HOP 与 MED 也可保持不变。这些例外让多个成员能像一个 policy system 运行。

例外同时形成隐藏 dependency。若成员共享 IGP,unchanged next hop 可能全域可达;若各 Member-AS 使用独立 IGP,这个假设就会失败。RFC 5065 因而指出,operator 可能必须用 policy 重写 NEXT_HOP。Route 可以在 BGP table 中看似完整,却无法 recursive resolve,更不可能写入 forwarding hardware。

MED 同样依赖 context。通常比较时会跳过 confederation segments,查看第一段普通 AS_SEQUENCE。Implementation 还可能提供跨 member paths 比较 MED 的 knob。Candidate visibility、member topology 或 comparison policy 任一变化,都可能让 winner 改变,而 public AS_PATH length 一个 bit 都不变。

所以 “confed EBGP” 只是危险的 shorthand。Wire session 跨越 AS numbers,policy 却继承了内部属性。必须记录具体 semantics,不能从 session type 猜测 authority。

稳定的公网 route 背后仍可能永久振荡

RFC 5065 警告,错误配置会造成 duplicate advertisements、浪费资源、route flaps 与 convergence delay。它还引用 RFC 3345 所描述的 persistent route oscillation:Confederation 与 route reflection 让不同 decision point 看到不同 candidate sets,MED 又可能形成“本地选择改变远端可见信息,远端选择再反过来改变本地”的循环。

External collector 可能只看到轻微 noise,也可能完全看不到变化。它处于 border sanitisation 之后,只能看到最终幸存并获准 export 的路径。触发下一次内部选择的 losing candidate 已经不在公网记录里。

不存在万能 knob。Topology-aware IGP metrics 能减少部分 oscillation condition;一致 tie-breaking、按 redundancy intent 过滤 duplicate、让 route reflectors 获得更完整 candidates 也可能有效。但任何配置都不能替代对实际 candidate set 的观察。

监控需要回答的不是“best path 是否变过”,而是:在这个 topology epoch,此节点有哪些 eligible candidates;哪些 MED 可比;这些路径经哪些 member 与 reflection path 到达;每条 losing route 被哪一步排除。没有这些记录,循环只能被描述成 vendor anecdote,无法被复现为 policy failure。

Private Member-AS 需要自己的 collision ledger

很多部署从 private-use ASN 范围选择 Member-AS number。RFC 6996 当前保留 64512–65534 和 4200000000–4294967294。Private space 避免为预定在外部边界消失的 identity 消耗全球唯一编号,却不保证所有未来 operating scope 内唯一。

RFC 5065 并未要求 Member-AS 必须是 private ASN;它只要求同一 Confederation 内可区分。Merger、临时 backbone interconnect 或 federation 会让两个原本隔离的 scope 相遇。若双方都有 65021,collision 就会影响 loop rejection、AS-path policy、logging 与 responsibility mapping。

连接发生前,应维护 Member-AS registry:number、owner、geography、IGP domain、RR cluster、AFI/SAFI、four-octet capability 和 retirement plan。收购与互联设计先比较 inventory;发现 collision 时,通过有界迁移 renumber 一方,并在受控边界同时验证 old/new identity。

普通 remove-private 不是同一个机制。Juniper 文档说明,private-AS removal 发生在 confederation member segments 已先被移除之后。前者按自己的规则清理普通外部 path 中的 private values,后者删除 standards-defined internal segment class。把一个 control 的结果当成另一个的证据,会再次模糊真正执行动作的边界。

在 sanitisation 之前建设证据

最小 forensic record 必须按 adjacency 与 AFI/SAFI 保存:local Member-AS、expected peer Member-AS、Confederation Identifier、four-octet negotiation、raw received/advertised segment types、policy version、LOCAL_PREF、MED、NEXT_HOP、origin、best-path reason 与 withdrawal action。

记录还要跨 stages。保存 receiving member 的 pre/post-policy Adj-RIB-In、Loc-RIB candidates、指向下个 member 的 pre/post-policy Adj-RIB-Out,以及 confederation sanitisation 后最终 external Adj-RIB-Out。Topology 与 policy version 需要 hash,让 path 能关联到真正评估它的配置 epoch。

Control plane 仍不是完整事实。继续捕获 next-hop recursion、installed FIB/ASIC state 与实际 packets。正确的 AS_CONFED_SEQUENCE 不证明 IGP 能到达 unchanged next hop;FIB entry 也不证明 traffic 经过预期 member boundary。Public collector 只适合证明最终外部 statement,不能代替内部 witness。

Alert 应检测 divergence:配置 Member-AS 与 OPEN identity 不同;外部 neighbor 发来 confederation segment;内部 neighbor 缺少它;private Member-AS collision;session 未断却触发 treat-as-withdraw;public AS_PATH 不变而 best path 改变;同一 MED set 反复形成 candidate cycle。

把 Member-AS 迁移当作 protocol change

Member-AS move 不是改一个 label。它改变内部 path prepend 的值、loop-detection identity、policy match、route tags 与 telemetry dimensions,也可能改变 session 被认定为 intra-member、inter-member 还是真正 external。RR domain 与 next-hop assumption 也可能随之变化。

先建立 old-to-new map,覆盖 routers、sessions、policies、communities、monitoring、collectors 与 incident ownership。证明目标编号在迁移期间所有可能相连的 scope 内唯一。盘点设备对 four-octet AS 与 confederation segments 的支持,找出任何可能转换 AS_PATH 的中间节点。

Canary 必须窄:一个有冗余的 boundary、一个 AFI/SAFI、一组受控 prefixes。变更前捕获双向 exact path;变更后验证 adjacency identity、raw segment sequence、candidate set、best-path reason、recursive next hop、FIB 与 packets。观察窗口要足以暴露 MED cycle 和延迟的 RR effect。

Rollback 不仅恢复旧 number,还要恢复旧 membership list、peer classification、path policy、reflection relationship、telemetry labels 与 route state。预先定义什么 evidence 触发 rollback,以及哪些 stale routes 必须 clear。若回滚依赖从 public AS_PATH 推导内部 history,它从未真正可行。