如何审计 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 或会话状态。
建立受控多路复用测试
只使用获授权的代理与测试目标。准备两个租户别名、两个受控源站和不同的无害响应标记:
- 建立到批准代理的 HTTP/2 连接;
- 并行启动租户 A 到源站 A、租户 B 到源站 B 的流;
- 使用不同代理认证和应用状态别名;
- 确认每个源站只看到预期标记;
- 记录这些流是否共享客户端到代理连接;
- 在一个流完成后做顺序请求;
- 在凭据轮换、DNS 变化和空闲后重复;
- 确认不兼容请求会新建连接或安全失败。
通过条件是复用时仍正确隔离,而不是复用率最高。即使 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 日查阅。