自定义 Host 头访问 HTTPS 服务时的网关处理逻辑

一、案例介绍

以下面的例子为例,我们来分享下,网关收到后的处理逻辑是怎么样的。

curl https://baidu.com/hello -H "Host: abc.in.com"

这个请求的特点是:

· URL 中的域名:baidu.com(用于 DNS 解析和 TLS 握手)

· 自定义 Host 头:abc.in.com(用于告诉服务器要访问的虚拟主机)

二、处理逻辑

网关(反向代理、负载均衡器等)在收到这样的请求时,会经历网络层 → TLS 层 → HTTP 层的逐步处理。下面详细拆解每一步的逻辑,以及可能导致的结果。

  1. DNS 解析 baidu.com → IP 确定目标服务器

  2. TCP 连接 IP:443 网络层连通

  3. TLS 握手 SNI = baidu.com 选择证书,建立安全通道

  4. HTTP 请求 Host = abc.in.com 携带应用层目标

  5. 网关路由 根据配置决定 可能基于 Host 头、SNI 或两者结合

  6. 后端响应 由后端处理 可能成功、失败或被拦截

  1. 网络层与 DNS 解析

· curl 首先解析 baidu.com 得到目标服务器的 IP 地址(假设为 1.2.3.4)。

· 建立 TCP 连接到 1.2.3.4:443。

网关的视角:看到来自客户端的 TCP 连接,目标 IP 是网关自身的 IP(如果网关就是 baidu.com 的入口),或者经过 NAT 转发。

  1. 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

  1. 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 头白名单,只允许特定的值。

  1. 特殊细节: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 头用于路由敏感内部服务。

https://developer.aliyun.com/article/1610799

https://cloud.tencent.cn/developer/article/2394920?from=15425\&policyId=undefined\&traceId=\&frompage=seopage

相关推荐
ARM+FPGA+AI工业主板定制专家2 小时前
基于ARM+FPGA+AI的船舶状态智能监测系统(一)总体设计
网络·arm开发·人工智能·机器学习·fpga开发·自动驾驶
taxunjishu2 小时前
Profinet转MODBUS TCP汽车零部件工业自动化柔性产线方案
网络·自动化·汽车
甘露s2 小时前
从明文到加密:HTTP 与 HTTPS 的本质区别与建立全解析
网络协议·http·https
虾..2 小时前
IP 协议
网络·网络协议·tcp/ip
9稳2 小时前
基于智能巡检机器人与PLC系统联动控制设计
开发语言·网络·数据库·嵌入式硬件·plc
倔强的石头1062 小时前
技术拆解:P2P组网如何一键远程AI
人工智能·网络协议·p2p
记忆多2 小时前
tcp的编程 三次握手 四次挥手
服务器·网络·tcp/ip
以太浮标10 小时前
华为eNSP模拟器综合实验之- ACL控制列表核心命令全解析及场景应用
运维·网络·网络协议·华为·信息与通信
yosh'joy!!10 小时前
IT/OT接口规范
网络协议·接口·modbus tcp·modbus rtu