摘要

  • draft-ietf-quic-address-discovery-01 定义了按 QUIC 路径发送的 OBSERVED_ADDRESS 帧,其中序号只负责连接内的先后关系;草案同时明确提醒,对端通常不能被假定为如实报告地址。
  • 运营系统必须分开保存报告者、路径、序号、接收时间、独立佐证、路径验证和服务结果,不能让“最新一帧”自动变成“当前真实地址”。

监控系统收到序号 42,于是覆盖了序号 41。数据库里的 updated_at 也随之刷新。下一层自动化读到这条“最新地址”,把流量切了过去。

每一步在软件意义上都可以正确,结论却仍可能是错的。42 只表示同一连接中的报告者在 41 之后发出了这份声明。它没有说明地址变化发生在何时、映射还会持续多久、中间是否漏过变化,也没有证明另一个观察者会看到同一个值。

2026 年 8 月 15 日发布的 QUIC Address Discovery 第 01 版,正好把这一证据边界暴露出来。这是 QUIC 工作组的活跃 Internet-Draft,标注为 Standards Track 意向,但并非 RFC、互操作测试、部署报告或采用率证明。它提出一种有用的地址发现方式,也直言不讳地指出:节点通常不能被信任为会报告正确地址。

本地套接字不知道外界如何看它

端点知道自己绑定的本地 IP 和端口,却可能位于 NAT、运营商网关、负载均衡器或多条接口之后。远端实际看到的是反射传输地址:它属于某个观察点、某条路径和某个时刻,而不是设备天然携带的一张全球身份证。

STUN 早已通过远端服务器回报源地址来处理这个问题。新草案把观察放进 QUIC。这样可以利用 QUIC 的 TLS 1.3 保护,不再让未加密的 STUN 报文向路径观察者暴露内容,也减少易识别的 STUN 格式所带来的通信类型线索。若基础设施按 QUIC 连接 ID 分流,合并机制还可能简化路由逻辑;不必与 STUN 复用时,也更容易对 QUIC bit 做 grease。

这些优点改善了传输和隐私,却没有改变陈述的性质。加密证明内容在连接中没有被普通路径设备改写,并把它归到那个对端。加密不约束对端必须诚实,也不能让一个观察点代表所有观察点。

协商的是方向,不是裁决权

草案用 address_discovery 传输参数协商功能。值 0 表示愿意提供观察、但不希望接收;值 1 表示希望接收、但不愿提供;值 2 表示双向都允许。理解该扩展的实现收到其他值时,要以传输参数错误处理。

未请求观察的一方不应收到 OBSERVED_ADDRESS;若收到,就要以协议违规关闭连接。若响应方因为路由或负载均衡结构无法可靠看到反射地址,或者观察会泄露内部网络细节,它就不应提供该功能。

这是一套边界清晰的能力与方向协商。它并没有把报告者任命为拓扑权威。请求一份观察,不等于同意把地址公开、写进永久白名单、更新 DNS,或允许对端决定生产流量下一跳。

0-RTT 更能说明生命周期差异。双方必须记住此前的参数值;服务器若接受 0-RTT,就不能在恢复连接时关闭扩展或改变值。这是为了让早期数据所依赖的协议条件保持一致。它不意味着之前观察到的地址仍然有效。能力状态可以继承,网络状态未必继承。

排序、时间、真实性和可达性是四列

OBSERVED_ADDRESS 包含 IPv4 或 IPv6 地址、16 位端口以及连接内单调递增的序号。帧可以乱序到达;对于同一路径,接收方如果已见过相同或更高序号,就应忽略旧帧。

这能防止重传的旧值回滚状态。但序号不是墙上时钟,不提供跨连接比较,不声明观察持续时间,也不证明没有漏报。运营记录还需要本地接收时间、路径 epoch、报告者身份、地址族和观察失效规则。

该帧属于应用数据包编号空间,是 probing frame,并会触发确认。丢失后应在原路径上重传。提供观察的一方要在每条新路径上尽早发送,包括握手路径;发现远端地址变化时,也应考虑再发一帧。

“同一路径”保证了陈述的运输上下文,不等于完成路径验证。QUIC 的 PATH_CHALLENGE 使用不可预测数据,并要求 PATH_RESPONSE 从被测试路径返回。即使这种验证成功,也只说明特定条件下该路径可达。一个地址字段更不能证明第三方能到达、过滤器会放行、应用正在监听,或映射仍在。

最新报告也可能是最新谎言

草案的安全章节明确指出,对端通常不能被信任为会回报正确地址。端点可以只向可信对端请求,也可以询问多个不可信对端并比较一致性,但具体验证逻辑不在草案范围内。

“可信”必须细分。一个对端可以被允许贡献诊断数据,却无权触发路由切换;可以被信任为连接身份,却不能代表其负载均衡器之后真正执行观察的组件。系统应记录信任来源、适用范围和失效时间。

多方一致也不是简单多数票。三个域名若共用同一个 anycast 前门、软件栈或上游,实际上可能只有一个观察。反过来,多个不同值未必表示有人说谎:目的相关映射、双栈路径、移动网络和多级 NAT 都可能让诚实观察发生分歧。

所以不要只保存一个 external_ip。应保存完整观察集:对端、连接、路径、地址族、IP、端口、序号、接收时间、信任类别、独立性维度和相互一致情况。系统若选出“首选解释”,还要保存选择规则和负责人。

地址变化只是一条症状

草案说,远端地址变化“可能”表明 NAT rebinding。这个词留下了必要的不确定性。迁移、接口切换、负载均衡、路由改变、路径操纵或错误报告都可能产生同样现象。

路径攻击者还可以捕获请求方报文,再用伪造源地址重放。反复操作会诱使响应方生成大量观察帧,并造成虚假的 rebinding 检测。规定响应帧只能走观察到的同一路径,可以让真正请求方收不到发往无效伪造地址的报告;但它并不能消除响应方产生的网络流量,也不能自动清除状态机中的假变化。因此仍需限速,并沿用 QUIC 防御虚假 rebinding 的逻辑。

告警应写“观察到地址改变,原因未定”,随后启动可逆探测。直接标成“NAT 已重绑”,等于把推断伪装成事实。

地址、路径与持续同意不能合并

ICE 先收集候选地址,再执行连通性检查;consent freshness 另外验证对方是否继续同意接收流量。这些相邻机制提醒我们:发现地址、验证路径、确认服务以及维持授权是不同状态。

合理的自动化阶梯是:单一报告进入遥测;满足独立性条件的多方报告触发探测;路径验证和应用检查支持可逆切换;高影响的公开或安全策略变更还需明确授权。任何一层都不能偷偷继承下一层的权力。

可审计的结论应该很窄:经连接认证的对端 P,在连接 C、路径 R 上,以序号 S 报告了地址 A;其他独立观察得到这些结果;路径探测得到结果 V;服务随后表现为 O。越是愿意保留这些坐标,自动化越不需要用一个绿色徽章虚构确定性。

来源与边界

证据包冻结了第 01 版草案、Datatracker 历史、QUIC 工作组仓库,以及 RFC 8489、9000—9002、9287、4787、8445、7675 和 8085。它们证明协议机制与限制,不证明当前部署、实现份额、互操作性、性能或任何现实对端的诚实性。

来源