域前置(Domain Fronting)是什么?SNI 与 Host 错配、CDN 反向代理原理与现状
导读摘要:从 CDN 和反向代理怎么根据 SNI 与 Host 分发请求讲起,解释域前置的原理、曾经的用途,以及为什么谷歌、亚马逊等主流云厂商已经禁止 SNI 与 Host 不一致的请求,最后说明服务端如何检测和防御。
简短回答:域前置是指在 TLS 握手中(SNI)填写一个正常的域名,在加密后的 HTTP 请求里(Host 头)填写另一个真实目标,利用同一家 CDN 内部转发的特点到达真实目标。外部观察者只能看到那个正常域名。2018 年起,谷歌和亚马逊等主流云服务商已陆续在边缘节点拒绝这种「SNI 与 Host 不一致」的请求,域前置在主流 CDN 上基本失效。
一、先理解反向代理和 CDN 如何分发请求
反向代理(如 Nginx、Traefik)和 CDN 边缘节点同时为成千上万个网站服务,它们靠两个信息判断你要访问哪个网站:
- SNI:TLS 握手第一个包 ClientHello 中的明文域名,服务器据此选择返回哪张证书;
- Host 头:HTTP 请求里的域名,在 TLS 加密之后才发送,服务器据此决定把请求转发给哪个后端。
正常情况下两者相同。TLS 握手和 SNI 的细节可以看 HTTPS 握手与 ECH 详解。
二、域前置的原理
如果 CDN 只用 SNI 选证书、只用 Host 选后端,又不检查两者是否一致,就会出现这样的请求:
TLS ClientHello SNI: allowed.example.com ← 外部可见
HTTP(已加密) Host: hidden.example.net ← 外部不可见
CDN 按 Host 把请求转发到 hidden.example.net 的源站
观察者只看到一个正常的大网站域名,要阻断就得连这个大网站一起阻断,代价很高。这正是域前置曾经被 Signal、Tor(meek 传输)等用于抗审查的原因,也被部分恶意软件用来隐藏通信。
三、为什么现在基本不可用
- 2018 年 4 月前后,谷歌云和亚马逊 CloudFront 相继调整,拒绝或不再保证 SNI 与 Host 不一致的请求;
- 此后微软 Azure 等厂商也宣布逐步禁止域前置;
- 各家给出的理由是一致的:这种行为会让第三方「借用」其他客户的域名信誉,难以追责。
在隐藏访问目标这件事上,正规的替代方案是 ECH(加密 ClientHello):它直接把真实 SNI 加密,不需要伪造任何字段。
四、服务端如何检测和防御
- 校验 SNI 与 Host 一致:Nginx 中可以比较
$ssl_server_name与$host,不一致直接返回 421(Misdirected Request); - 为每个站点使用独立证书和 server 块,不设置会兜底接收任意 Host 的默认站点;
- 源站只允许 CDN 回源 IP 访问,或使用回源双向 TLS 认证,防止绕过 CDN 直接访问;
- 记录并告警:日志中出现大量 Host 与证书域名不匹配的请求,往往意味着探测或滥用。
# Nginx 示例:SNI 与 Host 不一致时拒绝
if ($ssl_server_name != $host) {
return 421;
}
五、小结
域前置利用的是「加密前看 SNI、加密后看 Host」的信息差。理解它有助于理解反向代理和 CDN 的工作方式,以及 TLS 中哪些信息是明文的。但在今天的主流 CDN 上,它已经不是一个可用的技术手段;无论用于研究还是防御,都请在授权和合法的范围内进行。
💡 机场情报局精选推荐:高品质海外节点与 IEPL 专线是流畅访问的基础,欢迎查阅我们的实时评测:【2026 稳定高速机场推荐榜单】。