一、案例介绍
以下面的例子为例,我们来分享下,网关收到后的处理逻辑是怎么样的。
curl https://baidu.com/hello -H "Host: abc.in.com"
这个请求的特点是:
· URL 中的域名:baidu.com(用于 DNS 解析和 TLS 握手)
· 自定义 Host 头:abc.in.com(用于告诉服务器要访问的虚拟主机)
二、处理逻辑
网关(反向代理、负载均衡器等)在收到这样的请求时,会经历网络层 → TLS 层 → HTTP 层的逐步处理。下面详细拆解每一步的逻辑,以及可能导致的结果。
-
DNS 解析 baidu.com → IP 确定目标服务器
-
TCP 连接 IP:443 网络层连通
-
TLS 握手 SNI = baidu.com 选择证书,建立安全通道
-
HTTP 请求 Host = abc.in.com 携带应用层目标
-
网关路由 根据配置决定 可能基于 Host 头、SNI 或两者结合
-
后端响应 由后端处理 可能成功、失败或被拦截

- 网络层与 DNS 解析
· curl 首先解析 baidu.com 得到目标服务器的 IP 地址(假设为 1.2.3.4)。
· 建立 TCP 连接到 1.2.3.4:443。
网关的视角:看到来自客户端的 TCP 连接,目标 IP 是网关自身的 IP(如果网关就是 baidu.com 的入口),或者经过 NAT 转发。
- TLS 层:SNI(Server Name Indication)
2.1 什么是 SNI
在 TLS 握手时,客户端会在 ClientHello 消息中携带 SNI 扩展,告诉服务器它要连接的主机名(即 URL 中的域名 baidu.com)。这是为了让服务器能够返回匹配的 TLS 证书。
2.2 网关如何处理 SNI

· 如果网关是 TLS 终结者(即 SSL 卸载),它必须根据 SNI 选择正确的证书与客户端握手。例如:
· SNI = baidu.com → 使用 baidu.com 的证书。
· 如果网关没有 baidu.com 的证书,但配置了默认证书,可能会返回默认证书,导致浏览器警告,但 curl 加 -k 可忽略。
· 如果网关是透传 TLS(如 TCP 代理),它不查看 SNI,直接将 TLS 流量转发给后端,由后端完成握手。
关键点:SNI 通常由 URL 中的域名决定,而 -H 修改的 Host 头此时尚未出现。因此 TLS 层使用的域名是 baidu.com,而不是 abc.in.com。
- HTTP 层:Host 头处理
TLS 握手完成后,客户端发送加密的 HTTP 请求,其中包含:
GET /hello HTTP/1.1
Host: abc.in.com
...
网关(如果作为反向代理)会解析 HTTP 头部。此时 Host 头的值是 abc.in.com,与 SNI 的 baidu.com 不同。
3.1 网关的常见处理方式
场景 A:基于 Host 头路由(最常见)
大多数反向代理(如 Nginx、Envoy)在 HTTP 层根据 Host 头决定将请求转发到哪个后端服务。即使 SNI 是 baidu.com,只要 Host 头是 abc.in.com,网关可能会:
· 查找与 abc.in.com 匹配的 server_name 配置。
· 如果找到,则转发到对应的后端(例如内网服务器 abc.in.com)。
· 如果没找到,可能返回 404 或使用默认后端。
此时可能出现"绕过"现象:外网用户通过 baidu.com 的入口,却访问到了本该只对内网暴露的 abc.in.com 服务(如果 abc.in.com 也在该网关的配置中)。
场景 B:基于 SNI 路由(较少见,如某些 Service Mesh)
有些网关在 TLS 层就根据 SNI 决定路由,然后将请求转发给对应的后端。此时 SNI 决定了目标,Host 头可能被忽略或校验。如果 SNI 是 baidu.com,网关会转发给 baidu.com 的后端,即使 Host 头是 abc.in.com,后端收到后可能无法正确处理(因为后端可能依赖 Host 头)。
场景 C:严格校验 Host 头
安全配置严格的网关会检查 Host 头是否与 SNI 或 TLS 证书中的域名匹配。例如:
· 如果 SNI 是 baidu.com,但 Host 头是 abc.in.com,则拒绝请求(返回 400)。
· 或者配置了 Host 头白名单,只允许特定的值。
- 特殊细节:HTTPS 下的证书警告
由于 SNI 是 baidu.com,网关会使用 baidu.com 的证书与客户端建立 TLS 连接。当客户端看到证书中的 CN 或 SAN 包含 baidu.com 但不包含 abc.in.com 时,会产生证书警告(除非使用 -k 忽略)。这是 HTTPS 的基本安全机制。
4.1 curl -k 的作用
如果命令加上 -k(--insecure),curl 会忽略证书验证,即使证书与 Host 头不匹配也能建立连接。这常用于测试,但也模拟了攻击者可能的行为。
三、Host攻击
攻击成功的前提:
· 网关允许基于 Host 头路由。
· 网关没有校验 Host 头与 SNI 的一致性。
· 内网域名 abc.in.com 也在该网关的配置中(或通配符匹配)。
· 客户端忽略证书错误(-k)或证书恰好也包含 abc.in.com(极少数)。
防御要点:
· 网关应配置默认 server 块拒绝未匹配的 Host。
· 在 TLS 层和 HTTP 层做域名一致性检查(如 nginx 的 host 与 ssl_server_name 比较)。
· 避免直接将 Host 头用于路由敏感内部服务。