摘要

  • RFC 10039 按租户流量的转发行为界定域,而不是照搬 AS、IGP、机房或组织边界;同一域上的所有互通网关却必须配置同一个 DOMAIN-ID。
  • D-PATH 中出现本地 DOMAIN-ID 会触发回流判断,其长度还会进入 EVPN 与 IPVPN 候选路由的选择。一个看似普通的编号错误,足以制造假环路或放过真环路。

变更评审会上,拓扑图很整齐:两个数据中心、一段 IPVPN 骨干、两组冗余网关,都位于同一个运营者的 AS 内。工程师给图上的三个色块各分配了 DOMAIN-ID。有人问:“这三个色块为什么正好是三个域?”会议突然安静下来。

问题不在编号格式,而在编号所代表的事实从未被证明。

RFC 10039 为 EVPN 与 IPVPN 域之间的租户三层互通规定了统一过程。互通 PE 把从一个域收到的路由导入 IP-VRF,再用相邻域适用的地址族和封装属性重新起源。当两台冗余网关同时连接这些域时,一台把 IPVPN 路由重发为 EVPN,另一台又可能把它送回 IPVPN,于是控制面形成回路。D-PATH 用一串域记录来识别这种返回。

但它只会处理配置提供的域,不会自行发现真实边界。

域首先是一项转发事实

RFC 10039 的定义没有沿用常见的行政标签:两台 PE 面向同一租户,且两者之间的报文无需在任何中转路由器上执行租户空间的 IP 查找,才属于同一域。需要这类查找之处,才构成网关连接的域边界。

因此,一个域可以跨越多个 AS,一个 AS 也可以包含多个域;IGP 实例同样不能自动给出答案。站点、云区域、设备厂商或运维团队可以帮助画图,却不能代替对实际转发路径的检查。若恰好重合,也应把重合当作测试结论,而不是命名惯例。

DOMAIN-ID 的外形尤其容易诱导误读。它由四字节 Global Administrator 和两字节 Local Administrator 组成;前一部分可以填公有或私有 ASN、IPv4 地址,也可以使用其他值。这种设计方便分配和排障,却不把 DOMAIN-ID 变成 ASN 断言或地址所有权证明。写成 6500:1 只是表示法,不是拓扑自动推导。

标准要求的是配置一致性:每个域必须有唯一 ID;同一域上的所有网关必须使用同一个 ID;连接两个域的网关则分别持有两个不同 ID。ID 可以按整条域互联分配,也可以按租户 IP-VRF 分配。后者在 VRF 之间发生路由泄漏时尤为关键,因为接收侧会在相应 VRF 的本地 ID 上下文中判断回流。

换言之,启用前必须有人回答四件事:谁有权分配,唯一性覆盖到哪里,哪些网关共享一个域,哪些 VRF 采用哪个作用域。协议不会替组织补齐这些答案。

一条配置声明如何变成否决权

D-PATH 是可选、可传递的 BGP 路径属性,IANA 将其登记为属性代码 36。每一项包含六字节 DOMAIN-ID 和一字节 ISF_SAFI_TYPE,后者说明该段使用 EVPN、IPVPN,或在某些本地起源场景中使用零值。

SAFI 类型有助于确认互通过程是否按设计发生,但不参与环路身份比较。只要收到的 D-PATH 中有任一 DOMAIN-ID 与该 IP-VRF 的本地 ID 相同,网关就把它视作已经返回本域;即使配套的 SAFI 类型未知或不同,判断仍然成立。

这是防环的力量来源,也是错误配置的放大器。两个真实不同的域若误用了同一个 ID,合法路由会被当成回流;同一域的两台冗余网关若使用不同 ID,返回路由又可能避开识别。把 ID 绑定在错误的 VRF 作用域中,会让网关比较的对象与工程师脑中的对象根本不是一回事。

这个声明还进入选路。对于同一前缀的 EVPN 与非 EVPN 跨子网转发候选,流程在 LOCAL_PREF 之后比较 D-PATH 长度,剔除不是最短的路径;没有 D-PATH 的路径按长度零处理。这个数字不是光纤距离、时延、拥塞、费用或可信度,只是配置声明的域经过次数,却会改变最终留下的候选。

所以,看到属性并不等于看到事实。抓包只能证明某台设备发送了一个域叙述;它不能证明各网关对域边界的理解一致,更不能证明 FIB 和报文结果正确。

是否传播,是风险分配而非美德选择

RFC 10039 不默认发送 D-PATH,并把它限定在 IPVPN 与 EVPN 路由上。网关必须显式开启。跨域重新起源时,标准给出两种处理姿态。

No Propagation Mode 是默认模式。网关像处理本地起源前缀一样重新初始化路径属性,不继续携带 D-PATH。这样能缩小远端继承的属性攻击面,却也失去用于识别冗余网关回流的域历史。路由策略或 Route Origin 扩展团体可以缓解风险,但标准没有把它们说成覆盖所有场景的保证。

Uniform Propagation Mode 则保留一组受限属性:适用的 AS_PATH、D-PATH,以及 iBGP 场景下若干内部属性。其他属性只有经本地导入或导出策略明确允许,才应跨越边界。下游因此获得更多来路信息,同时也可能接收语法正确、语义却不适当甚至恶意注入的状态。

两种模式都存在代价。前者用证据连续性换取隔离,后者用更大的验证责任换取可见性。治理正确的做法不是给整个网络贴一个偏好,而是在每条边界上记录所选模式、允许传播的属性、例外负责人和回退办法。

语法容错不会纠正错误世界观

对于坏编码,规则相当明确。D-PATH 结构畸形、总长度不足,或出现在不支持的 AFI/SAFI 上时,接收者按 RFC 7606 执行 treat-as-withdraw。未知的 ISF_SAFI_TYPE 可以接受,因为它不改变域 ID 比较。同一 UPDATE 中若出现多个 D-PATH,只保留第一个并继续处理。

这些措施控制的是报文损坏,识别不了“格式完全正确、含义完全错误”的 ID。RFC 10039 明确警告:DOMAIN-ID 配错或网关支持不一致,可能带来假阳性的环路检测、流量丢弃、次优或不一致选路。属性又是可传递的,错误或恶意的域信息还可能跨越多个管理边界。

最后一道墙是客户侧。D-PATH 属于 VPN 的“封闭花园”。合规 PE 在把前缀以普通 SAFI 1 单播通告给 CE 前必须删掉该属性。升级后的设备还应通过本地策略处理来自未升级邻居却带 D-PATH 的 ISF 路由;但标准没有定义如何判定邻居是否真正支持。版本清单、能力测试和出口抓包都必须由部署者补上。

用域边界协议约束上线

一份有效的域边界协议应按租户和互联编制。第一栏不是 ID,而是定义边界的转发测试:哪些 PE 之间不经过租户空间 IP 查找,哪里发生了这类查找。随后记录 ID 分配者、唯一性范围、碰撞检索、全部网关清单,以及每个接口或 IP-VRF 的精确绑定。若使用 ASN 或地址形态,必须明确它只是命名方案。

上线收据再补齐执行事实:各设备软件版本与经过测试的 D-PATH 行为;每条边界的传播模式和属性白名单;本地起源路由的 ID 策略;混合版本的处置;观察窗口、停止阈值与独立回退路径。变更人应能在下发前写出同一前缀每一跳预期看到的 D-PATH。

测试不能只走幸福路径。让一个合法前缀经过预期域序列;注入本地 ID,验证回流被识别;使用未知 SAFI 类型,确认身份判断仍然生效;构造畸形属性,确认撤回被局部控制;加入旧版本邻居,观察它究竟忽略、透传还是异常处理。最后在 CE 出口证明 SAFI 1 中已经没有 D-PATH。

同一批金丝雀前缀还要贯穿 Adj-RIB-In、候选选路、FIB 下一跳与真实报文。BGP 会话 Established 只说明会话建立;配置命令成功只说明解析器接受;可见 D-PATH 只说明一项声明被携带。只有当全部相关网关共享正确声明,并且合法路径与回流路径在观测中如预期分离,才能说这次防环部署已经成立。

RFC 4271 给出 BGP 基础决策过程,RFC 4364 描述 IPVPN,RFC 7432、RFC 9135 与 RFC 9136 构成 EVPN 互通语境。它们是公开规则,不是任何厂商或现网的合规证书。

来源