Files
waf-platform/EdgeHttpDNS/SNI隐匿开发计划.md
2026-02-27 10:35:22 +08:00

3.3 KiB
Raw Blame History

SNI隐匿开发计划HTTPDNS专项

0. 目标

在明文网络层DNS 与 TLS ClientHello中不出现真实业务域名真实业务域名仅出现在加密后的 HTTP 层Host / :authority中传输。

1. 固定原则

  1. 只做 SNI 隐匿能力,不引入其他无关能力描述。
  2. 客户端不走系统 DNS 解析业务域名。
  3. TLS 握手阶段不发送真实业务域名 SNI。
  4. CDN/WAF 节点必须支持“空SNI接入 + Host路由”。
  5. 真实域名只在 HTTPS 加密通道内携带。

2. 端到端链路(目标形态)

  1. App 调用 SDK请求解析业务域名。
  2. SDK 从 HTTPDNS 获取业务域名对应的“接入 IP 列表”(不是业务域名 DNS
  3. SDK 直连接入 IP 发起 TLS
    • SNI 置空(或不发送)
    • 不出现真实业务域名
  4. TLS 建立后发起 HTTPS 请求:
    • Host / :authority = 真实业务域名
  5. CDN/WAF 节点在解密后读取 Host将流量路由到对应业务源站。

3. SDK 改造要求

3.1 连接行为

  1. 提供“按 IP 直连”的请求通道。
  2. TLS 握手时固定空 SNI不允许带真实域名。
  3. HTTP 层强制写入真实 Host / :authority。

3.2 证书校验

  1. 仍必须做证书链校验(不允许关闭 TLS 安全校验)。
  2. 证书校验目标为接入层证书CDN/WAF 对外证书),而非业务源站证书。

3.3 多IP与容错

  1. HTTPDNS 返回多个接入 IP 时SDK 按顺序/策略重试。
  2. 连接失败可切换下一 IP。
  3. 缓存与过期策略保持稳定,避免频繁抖动。

3.4 多端一致性

  1. Android/iOS/Flutter 需保证一致行为:
    • 空 SNI
    • Host 注入
    • 失败重试策略
  2. 文档与示例代码同步更新。

4. CDN/WAF 节点改造要求

4.1 TLS 接入

  1. 支持无 SNI ClientHello 的 TLS 握手。
  2. 为接入域名部署有效证书(覆盖客户端连接目标)。

4.2 路由逻辑

  1. 以 Host / :authority 作为业务路由主键。
  2. 路由匹配前做标准化:
    • 小写化
    • 去端口
  3. Host 未命中时返回明确错误4xx禁止兜底到默认站点。

4.3 回源行为

  1. 节点到源站可继续使用 HTTPS 回源。
  2. 回源主机名与证书校验按现有网关策略执行。

4.4 可观测性

  1. 增加日志字段:
    • tlsSniPresent(是否携带 SNI
    • host
    • routeResult
  2. 可按“空SNI请求占比、Host路由命中率”监控。

5. 控制面(管理端)要求

  1. 页面仅展示“已启用 SNI 隐匿空SNI不提供策略切换。
  2. 集群侧需可检查“节点是否支持空SNI接入”。
  3. 发布配置时支持灰度与回滚。

6. 验收标准

  1. 抓包验证:
    • DNS 明文流量中不出现真实业务域名
    • TLS ClientHello 中不出现真实业务域名 SNI
  2. 请求验证:
    • HTTPS 请求 Host 为真实业务域名
    • CDN/WAF 按 Host 正确路由
  3. 稳定性验证:
    • 多 IP 切换成功
    • 节点故障时请求可恢复

7. 上线顺序

  1. 先升级 CDN/WAF 节点能力空SNI接入 + Host路由
  2. 再升级 SDK空SNI + Host注入
  3. 最后按应用灰度开启,观察指标后全量。

8. 风险与约束

  1. 若 CDN/WAF 不支持空 SNI链路会在握手阶段失败。
  2. 若 Host 路由不严格,可能出现串站风险。
  3. 若客户端错误关闭证书校验,会引入严重安全风险。