Nginx 防御伪造 HTTP 头部的核心措施包括:1. 用 default_server 拦截非法 Host 头;2. 对 X-Forwarded-For 做可信源校验;3. 用 map 实现多维度头部白名单;4. 内网服务强制 IP 与头部双重隔离。

伪造 HTTP 头部不是“会不会发生”的问题,而是“什么时候被利用”的问题。Nginx 作为最常部署的反向代理和 Web 服务器,天然处于攻击链的第一线——它必须在请求进入后端应用前,就识别并拦截恶意头部,否则像 Host、X-Forwarded-For、Referer 等字段就可能被用于密码重置劫持、缓存污染、SSRF 或内网探测。
用 default_server 拦截非法 Host 头(最基础也最有效)
这是防御 Host 头攻击的基石配置。原理很简单:让 Nginx 把所有不匹配合法域名的请求,全部交给一个专用的“兜底 server”,由它统一返回 403 或直接丢弃。
- 在
http块中定义一个监听 80/443 的server,不设server_name,只加default_server标志 - 这个 server 不提供任何业务内容,仅做拒绝响应:
return 403;或return 444;(444 是 Nginx 特有状态,表示关闭连接不发响应) - 其余真正提供服务的 server 块,必须显式声明
server_name example.com www.example.com;,且不能遗漏常用别名(如带 www 和不带 www)
这样,当攻击者发送 Host: evil.com 或 Host: 127.0.0.1 时,请求根本不会路由到你的业务 server,从源头切断风险。
对 X-Forwarded-For 等可信链头部做可信源校验
X-Forwarded-For 本身不可信,但它的“来源 IP”是真实的。关键在于:只信任来自你可控代理(如 CDN、负载均衡器)的该头部,其他来源一律忽略或覆盖。
- 在
http块中使用set_real_ip_from明确指定可信上游 IP 段(例如:CDN 回源 IP 段、公司内网 LB 地址) - 启用
real_ip_header X-Forwarded-For;和real_ip_recursive on;,让 Nginx 正确解析嵌套的 IP 链 - 在业务逻辑中,永远使用
$remote_addr(已被 realip 模块修正)代替原始$http_x_forwarded_for
这样做之后,即使攻击者用 Postman 伪造 X-Forwarded-For: 1.1.1.1, 127.0.0.1,只要请求不是从你白名单里的代理发来,Nginx 就不会采信它。
用 map 指令实现多维度头部白名单控制
单一 if 判断容易出错且不支持嵌套,而 map 是 Nginx 官方推荐的高效、安全的条件映射方式,适合处理 Host、User-Agent、Referer 等字段的黑白名单。
- 在
http块中定义 map 变量,比如:map $host $valid_host { default 0; "example.com" 1; "www.example.com" 1; } - 在 server 块中直接引用:
if ($valid_host = 0) { return 403; } - 还可组合多个 map,例如同时校验 Host + Referer 是否来自允许的跳转域,防止 CSRF 关键操作被外部诱导触发
比起硬编码 if 块,map 更易维护、性能更高,且避免了 Nginx 中 if 的“陷阱行为”(如在 location 中误用导致变量失效)。
内网服务强制隔离:禁止非内网请求携带敏感头
面向内网的服务(如管理后台、API 网关、健康检查接口),必须杜绝公网流量通过伪造头部绕过访问控制。
- 在对应 server 或 location 块中,用
allow/deny严格限制来源 IP 段(如allow 10.0.0.0/8;) - 额外增加头部校验:如果请求来自公网(即不满足 allow 规则),却携带了
X-Real-IP、X-Forwarded-For或自定义管理头(如X-Admin-Token),一律return 400 - 配合
location ~ ^/internal/这类路径前缀,把内网接口与公网接口物理隔离,降低误配风险
这种“IP 层 + 头部层”双重校验,能有效封堵攻击者通过公网入口试探内网服务的路径。











