摘要

  • BGP 端点既监听 TCP 179,也可主动连接;双方同时发起时,一个配置邻接可能短暂出现两条完整 TCP 连接,RFC 4271 要求关闭一条。
  • 双方比较 BGP Identifier,保留由较大标识符一端发起的连接;若外部邻居合法地拥有相同标识符,RFC 6286 再以较大 AS 号一端为胜者。
  • 该规则只提供确定顺序,不提供身份认证。安全运营依赖 AS 内唯一且稳定的编号、传输认证、碰撞事件取证,以及能在路由变化前预测存活套接字的演练。

维护窗口在两地同时结束。自动化让 A 向 B 发起 TCP,也让 B 向 A 发起 TCP。每个主动连接都到达对方监听器,形成两个源/目的地址互为镜像的四元组。每条连接都有自己的 TCP 序列空间、BGP FSM、OPEN 协商和计时器。

这不是 TCP simultaneous open。交叉 SYN 可以在 TCP 内收敛为一条连接;此处已经存在两条独立 TCP 连接,BGP 无法合并它们的状态。若都保留,一个邻接就会出现两种权威历史。

存活连接是按规则选择,而不是靠时序发现

RFC 4271 把同一对端、地址方向互换的并行连接定义为连接碰撞。通常要等 OPEN 到达,本端才知道远端 BGP Identifier,并把两个 FSM 归入同一碰撞集合。

规则很窄:将两端 Identifier 作为四字节无符号整数比较,只保留由较大 Identifier 一端发起的连接。本端编号较小时,关闭自己已有的 OpenConfirm 连接,接受远端较大编号一端新发起的连接;否则关闭新连接,保留已有连接。

“已有”和“新建”是本地视角,两端看到的方向相反。共享比较规则让它们仍会选中同一个 TCP 实例。较大的数字不代表更重要的路由器、AS 或运营商;它只是一个稳定排序键,避免网络时延偶然决定会话权威。

RFC 4486 为这种关闭分配 Cease 子码 7 Connection Collision Resolution。该通知解释一条套接字为何关闭,却不能单独证明另一条选对了。完整证据还要标出存活四元组,并证明它继续通过 OPEN、KEEPALIVE 与路由交换。

并行会话不一定都是碰撞

RFC 4271 允许同一对路由器使用不同地址对配置多个邻接。环回地址、接口地址或不同路由实例可以是有意的独立政策对象。碰撞集合由互换地址对与配置邻接共同界定,不能只按远端 ASN 合并。

自动清理若“同一 ASN 只留一个”,可能摧毁真正的冗余;若只按临时本地端口区分,又可能把一次碰撞误判为两个邻居。资产记录必须说明本地地址、远端地址、路由实例和邻居政策共同构成哪个邻接。

主动与被动也只是 TCP 建连角色。最终会话进入 Established 后,路由语义不会因为谁使用 179 端口而改变。把某个组织永久设为“只能呼叫”或“只能接听”的防火墙假设,可能在恢复时破坏协议对称性。

RFC 6286 把标识符从 IPv4 地址中解放出来

早期定义把 BGP Identifier 描述为有效 IPv4 单播地址。这对 IPv6-only 设备以及不希望身份跟随某个接口的系统并不理想。RFC 6286 改为 AS 内唯一、非零的四字节无符号整数,不再要求语法上是 IPv4 地址;按旧规则分配的值仍然有效。

AS 内唯一不等于全球唯一。不同 AS 的两台外部邻居可以合法拥有相同 Identifier。若它们发生碰撞,RFC 6286 保留由较大 AS 号一端发起的连接。这个补充只适用于外部邻居;同一 AS 内相同 Identifier 仍违反唯一性。联盟结构则把整个 confederation 视为一个 AS。

兼容性不能想当然。只有双方软件都支持 RFC 6286 的修订后,外部邻居才可安全共享标识符;否则最需要确定性的相等输入可能得到不一致处理。

四字节编号并非无副作用元数据

BGP Identifier 还参与聚合器身份、路由反射属性以及部分最优路径后段比较。修改 router ID 可能重置会话、改变反射路由身份与诊断连续性,因此不能当作纯展示字段。

FRRouting 文档提供显式 bgp router-id,并指出缺少接口信息时自动值可能保持无效的 0.0.0.0。BIRD 也要求非零、AS 内唯一的四字节 router ID,但默认选择方式不同。产品默认值的差异正是应当显式固定和盘点的理由。

虚拟路由实例、克隆模板和设备替换扩大了治理面。克隆可能继承编号,替代设备可能在目标环回地址出现前启动,接口派生值也可能随地址变化。应记录 BGP 进程、VRF、AS、配置值、OPEN 实测值、分配来源、唯一性范围与预期寿命。

正确的碰撞清理也可能演变成抖动

一次短暂碰撞可以完全正常:两端看到两条连接,作出同一选择,关闭一条并让另一条 Established。把每个 Cease 或 TCP close 都算作停机,会制造误报。

但只看最终 Established 又会漏掉循环。编号不稳定、地址配置不一致、防火墙阻断理论胜者,或自动化反复重启监听器,都可能造成“两条建立—淘汰一条—胜者失败—再次建立”。每轮都会触发撤回、重算、日志和 TCP 状态增长。

确定性规则只保证双方同意哪条应当存活,不保证该连接能通过防火墙、认证、KEEPALIVE 或路由政策。监控应把两个套接字、两个 OPEN 和一个存活会话聚合为一次碰撞事件,并对重复、胜者失败、编号漂移和后续路由抖动告警。

Identifier 排序连接,却不认证对端

远端 Identifier 来自 OPEN,本质上是一项声明,不是密码学身份证。RFC 4272 描述一种有界攻击:攻击者若能在正确时机完成所需 TCP/BGP 序列,并选择能赢得碰撞的 Identifier,可能使合法连接被丢弃。这远不只是向 179 端口随便发送 OPEN;TCP 序列、时机、邻居准入与传输认证都是现实障碍。

RFC 4272 以 TCP MD5 作为对应缓解;RFC 5925 的 TCP-AO 提供更完整的算法和密钥管理框架。两者都只保护配置密钥下的传输段,不验证 UPDATE 政策,也不会把 Identifier 变成组织身份。合法邻居仍可能错误编号或发送错误路由。

因此密钥覆盖的地址、轮换负责人、重叠期、失败告警与碰撞日志必须共同治理。router-ID 迁移时若密钥不同步,会让正确的碰撞逻辑看起来像故障。

演练必须先算出胜者

先确认一个明确的配置邻接:地址对、AS、Identifier、认证状态,并排除第二地址对是有意独立会话。随后在隔离或低影响环境中让双方并发发起,捕获两组 SYN、两个完整四元组、OPEN 和 FSM。

观察结果前,先按 Identifier 计算哪一端发起的连接应存活;若是双方均支持的外部同号场景,再按 AS 号判断。解析时记录 Cease 7、套接字关闭、FSM 清理和重试。预测连接必须进入 Established,另一条消失。

之后验证预期进出口路由、消息计数与 Adj-RIB,没有重复通告、异常撤回或再次碰撞。若声称服务连续,还要检查 FIB 与真实报文。回退不是反复 clear 邻居碰运气,而是恢复已知唯一编号、正确密钥和一个文档化地址对,再重做预测。