摘要

  • RFC 9532 允许 HTTP 中间代理通过 Proxy-Status 报告解析下一跳时收到的 CNAME 别名与规范名称。
  • 该字段可以缺席、为空或只包含部分链条;它不传递 DNSSEC 信息,可信度不会高于代理及其解析器。
  • 可辩护的决策必须分别保留代理身份、DNS 原始响应、DNSSEC 验证、端点认证、本地策略和实际结果。

客户端终于看见了一串名字。最初访问的域名指向另一个名称,后者又指向最终地址。隐藏在代理后的解析过程第一次出现在响应里。

可见性增加了,身份并没有因此被认证。

RFC 9532 定义了 next-hop-aliases,作为 HTTP Proxy-Status 的参数。代理可以用它报告为下一跳做 DNS 解析时从 CNAME 记录中收到的别名和规范名称。前向代理的客户端通常只知道自己请求了什么,不知道代理实际解析出怎样的名称链;而 CNAME 又可能把跟踪器或恶意目标藏在看似无害的第一方名称之后。这个参数补回了被委托解析拿走的一部分视野。

但它补回的是代理的观察,不是权威 DNS 的公证。

一段字符串里有两层语法

外层是 RFC 8941 的 Structured Fields 字符串,内层才是 RFC 9532 规定的逗号分隔名称列表。列表可以包含原始请求名称、后续别名与最终解析到地址的规范名称。规范建议按收到的顺序排列,以便保持一致,但这不是强制的完整历史证明。

名称本身可能包含逗号,因此非 URI unreserved 字符必须进行百分号编码。DNS 标签内部的点要先用反斜杠转义,再编码反斜杠;字面反斜杠还有额外的转义规则。如果程序把 Structured Fields 解析、百分号解码和 DNS 标签还原混成一步,就可能得到另一个名称。

审计记录不能只保存界面上已经展开的字符串。还需要原始 HTTP 字节、解析器版本、每一步解码结果与最终标签。否则很难判断异常来自 DNS 数据、代理编码还是客户端解析。

格式完整不代表链条完整

代理能报告多少,取决于它的解析接口能看见多少。RFC 9532 特别指出,常见的 getaddrinfo 即使使用 AI_CANONNAME,也可能只返回最后的规范名称,而不提供中间别名。规范因此允许代理在无法取得全部链条时报告不完整信息。

这意味着完全合规、语法正确的字段仍可能只是片段。

至少要区分四种状态:字段缺席、空字符串、非空列表和解析失败。缺席可能是不支持、不适用、未发送或被另一层中间设备移除。空字符串只是代理声称这次解析没有遇到 CNAME。非空列表是代理声称见到若干名称。解析失败则意味着客户端没有可靠还原陈述。

它们都不能说明另一个解析器、另一个缓存状态或另一个时间点会看到什么。递归或权威解析器可以省略 CNAME,以掩盖 cloaking;恶意代理也可以选择不报告。没有报告的证据,不能直接变成“没有别名”的证据。

DNSSEC 是另一条证明链

RFC 9532 明确说明,next-hop-aliases 不包含任何 DNSSEC 信息,也不暗示做过 DNSSEC 验证。客户端只能在信任代理及其解析器的范围内信任该字段。规范把它定位为 hint,并要求不要用它决定所访问资源的身份。

RFC 4033 与 RFC 4035 描述的是 DNS 数据来源与完整性验证、信任链和认证否定。别名字符串里没有这些签名材料,也没有验证状态。

即使另外完成 DNSSEC 验证,也只完成 DNS 层。连接端点是否持有正确密钥、HTTP authority 是否匹配、账户是否属于相应主体、Cookie 是否可以发送、数据是否可以披露,仍需各自的证据与责任人。一个层次的成功不能自动授权下一层。

先确认是谁在作证

RFC 9209 让中间代理说明自己如何处理请求。因此 Proxy-Status 的核心不是“出现了一条客观事实”,而是“路径中的某个参与者提交了一份处理陈述”。

可复核记录应先写明代理身份、信任关系、软件版本和它在中间链中的位置。然后写明代理使用的递归解析器、是否验证 DNSSEC、缓存与配置代际。接着保存查询、响应码、CNAME、最终名称、地址记录、TTL,以及单独取得的 DNSSEC 材料。

之后才是披露转换:链条是否完整、排序方式、转义与序列化。最后记录连接结果、端点认证、客户端策略、决策者和实际动作。

这条链符合 Heng Lu 对“现实层次”的要求。名称不是响应,响应不是代理声明,声明不是验证,验证不是认证,认证也不是授权。注册表可以统一字段名称,却不能替运行中的系统完成这些转换。

最小公共格式,保留本地决定

RFC 9532 的价值恰恰在于边界清楚。浏览器可以把新出现的别名当作收紧 Cookie 的信号;企业可以用它解释代理为何连接到意外服务;事件响应人员可以把链条变化与故障时间对齐。每一种使用都可以是本地、可逆、带不确定性的决定。

这与“最小初始规范、未来决定本地化”的思路一致:公共层只负责让代理能以共同格式披露名称;具体阻断、放行、认证或披露规则仍归客户端和应用所有。运行代码的证据则要求从 DNS 响应、代理编码、客户端解析一直追到策略效果,而不是看到 IANA 注册或功能开关就宣布完成。

现有来源并不证明任何具体浏览器或代理已经部署 RFC 9532,也不提供采用率、cloaking 发生率或真实安全结果。规范中的域名与地址是说明机制的例子,不是现实事件。

因此,最诚实的结论不是“别名链不可靠”,而是它的权限有限:它能说明代理声称自己看见什么,不能独自说明资源是谁。

来源