如何审计 HTTP/2 代理连接复用并避免租户状态混用

互联网路由织机让多路复用请求纤维保持在独立目标通道

HTTP/2 可以在一个持久连接中承载多个并发流。使用 HTTP/2 代理时,请求可能复用到代理的同一条连接,而 CONNECT 将目标隧道建立在独立流上。这能降低延迟和连接开销,也使连接池成为安全与正确性边界。

审计需要证明:客户端只复用兼容连接,目标 authority 正确,租户与认证状态隔离,并能正确处理 421 Misdirected Request 和 GOAWAY。

映射连接身份

为物理连接和逻辑流记录脱敏字段:

连接ID
流ID
代理网关别名
代理协议
代理认证配置别名
目标authority
TLS SNI
证书配置别名
租户别名
Cookie Jar别名
客户端身份别名
地址族
创建与最后使用时间
是否收到GOAWAY
响应类别

不得记录代理密码、Cookie、Token、原始客户端证书或客户身份。

定义允许复用的键

至少考虑代理网关、代理协议、代理认证配置、目标 authority、TLS 设置、客户端证书、租户、隐私模式和网络命名空间。

不能只按代理主机与端口建立连接池。两个租户可以使用同一网关,但凭据、Cookie、目标策略和审计边界完全不同。只有全部相关属性一致时,同一授权任务的多个流才可安全共享连接。

分开三个层级

层级共享对象必须保留的证据
客户端到代理HTTP/2 连接网关、TLS 与代理认证身份
代理 CONNECT流与隧道目标主机、端口与策略
源站请求隧道内 HTTP 流authority、Cookie 与应用身份

单一代理连接不代表单一目标连接;CONNECT 成功也不证明源站请求使用了正确 authority 或会话状态。

建立受控多路复用测试

只使用获授权的代理与测试目标。准备两个租户别名、两个受控源站和不同的无害响应标记:

  1. 建立到批准代理的 HTTP/2 连接;
  2. 并行启动租户 A 到源站 A、租户 B 到源站 B 的流;
  3. 使用不同代理认证和应用状态别名;
  4. 确认每个源站只看到预期标记;
  5. 记录这些流是否共享客户端到代理连接;
  6. 在一个流完成后做顺序请求;
  7. 在凭据轮换、DNS 变化和空闲后重复;
  8. 确认不兼容请求会新建连接或安全失败。

通过条件是复用时仍正确隔离,而不是复用率最高。即使 HTTP 全部成功,状态出现在错误源站也是硬失败。

验证 authority 与证书规则

只有服务器对新源站具有权威性时,才能跨源站复用 HTTP/2 连接。HTTPS 还必须通过为该主机新建连接时应执行的证书检查。

测试正确的 :authority、TLS SNI 与 Host 语义。不得通过关闭证书或主机名验证提高复用率。如果基础设施按 SNI 路由,应同时验证证书与受控响应标记。

测试 421 恢复

服务器可以用 421 Misdirected Request 拒绝某个 authority 的复用。客户端应只在适合的新连接上重试受影响请求,并遵守严格预算。

  • 不把 421 当成笼统的代理质量问题;
  • 不重放无关流;
  • 只在请求体可安全重放时重试;
  • 使用正确租户与认证上下文;
  • 不立即为同一 authority 再选旧连接;
  • 记录重试次数和最终结果。

421 不应自动触发代理出口轮换,它指向连接上的路由或 authority 问题,不等于住宅 IP 信誉问题。

测试 GOAWAY 与部分完成

收到 GOAWAY 时,部分较早流可能已完成,较新流可能需要恢复。先使用幂等实验请求注入 GOAWAY,确认完成请求不重复、未处理请求遵守任务预算。非幂等操作必须有应用级幂等键或人工恢复规则。

检查连接池公平性

单一租户不能占满全部流或连接。设置并测试每连接并发流、每网关连接数、排队时间、任务截止时间和租户份额。

监控有效结果、排队延迟、首次成功率、421 比例、GOAWAY 恢复、新建连接率和重试放大。复用率很高但尾延迟或跨租户排队上升,仍是不健康优化。

生产检查清单

  • [ ] 已记录并测试连接池复用键。
  • [ ] 代理凭据参与兼容性判断。
  • [ ] 租户与 Cookie Jar 身份保持隔离。
  • [ ] authority、SNI 与证书检查未被削弱。
  • [ ] CONNECT 流映射正确目标。
  • [ ] 受控响应标记证明后端身份。
  • [ ] 421 在适合的新连接上恢复。
  • [ ] GOAWAY 不重复已完成工作。
  • [ ] 非幂等请求有明确恢复规则。
  • [ ] 租户级流与队列限制避免饥饿。
  • [ ] 连接年龄、空闲时间和版本可观测。
  • [ ] 日志仅含别名,不含凭据或 Cookie。

延伸阅读 98IP 的住宅代理会话粘性测试代理故障转移恢复演练代理网关 DNS 缓存切换

常见问题

HTTP/2 多路复用意味着所有目标共享一条隧道吗?

不意味着。到代理的一条 HTTP/2 连接可承载多个流,每个 CONNECT 流标识独立目标。必须同时观测物理连接与逻辑隧道。

租户不同是否总应新建连接?

凭据或状态不同时,这是最安全默认值。只有实现能证明所有安全与策略属性在流级隔离时,才可共享。

禁用复用可以永久解决吗?

可作为临时诊断或止损,但会降低性能并增加连接负载。修正复用键与隔离控制后,再通过金丝雀恢复。

421 是否应触发代理轮换?

不应。应在合适的新连接上重试受影响且可安全重放的请求,代理轮换应是独立、有明确理由的路由决策。

合规说明

只使用获授权代理与测试源站。遵守目标条款、速率限制和隐私要求,隔离客户状态,减少日志,保护认证材料;不得利用连接复用绕过源站路由或访问决定。

内部资料说明:IETF RFC 9113《HTTP/2》,2022 年 6 月;curl 项目《libcurl API overview》与《CURLOPT_FORBID_REUSE》,2026 年 9 月 5 日查阅。