关键在于构建可信IP传递链:Nginx需配置proxy_set_header透传X-Real-IP、X-Forwarded-For和Host头;多层代理时必须启用real_ip_module,用set_real_ip_from限定可信网段、real_ip_header指定源头、real_ip_recursive开启递归解析;后端须优先读X-Real-IP,禁用request.getRemoteAddr()。

直接在 Nginx 配置中透传真实客户端 IP,关键不是“加一个头”,而是构建一条可信、可追溯、不被污染的 IP 传递链。尤其在多层代理(如 CDN → WAF → Nginx LB → 应用)场景下,原始 IP 极易被覆盖或伪造,必须分层校验与还原。
一、Nginx 必须设置的三项核心 Header
这三行要写在 location 或 server 块内,且顺序和变量选择不能错:
-
Host 头保留原始域名:
proxy_set_header Host $http_host;—— 防止后端因 Host 变化导致路由/证书/静态资源路径异常 -
单点真实 IP 标识:
proxy_set_header X-Real-IP $remote_addr;—— 仅取当前直连客户端 IP(即上一级代理出口 IP),适合简单架构 -
完整 IP 路径链:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 自动追加当前$remote_addr到已有 XFF 值末尾,形成X.X.X.X, Y.Y.Y.Y, Z.Z.Z.Z格式
二、多层代理时必须启用 real_ip 模块还原
仅靠 X-Forwarded-For 不够安全:该头可被客户端伪造。Nginx 需结合可信代理白名单,从 XFF 中“剥洋葱”提取最外层真实 IP。
在 http 或 server 块中添加:
-
set_real_ip_from 10.0.0.0/8;—— 声明可信内网段(如你自己的 WAF、CDN 回源 IP 段) set_real_ip_from 172.16.0.0/12;set_real_ip_from 192.168.0.0/16;-
real_ip_header X-Forwarded-For;—— 指定从哪个 header 解析 -
real_ip_recursive on;—— 启用递归解析,自动跳过中间不可信 IP,取最左侧可信来源
配置生效后,$remote_addr 就会变成真实用户 IP,日志、限流、风控等模块可直接使用,无需再手动解析 XFF。
三、后端服务需配合识别逻辑
Nginx 配置只是前端一环,后端代码也得正确读取。以 Java Spring Boot 为例:
- 优先读
X-Real-IP(若 Nginx 已用real_ip模块还原,则它就是真实 IP) - 备选读
X-Forwarded-For的第一个非私有地址(需过滤127.0.0.1、10.x.x.x、172.16.x.x–172.31.x.x、192.168.x.x等) - 绝对不要只用
request.getRemoteAddr()—— 它返回的是直连 TCP 客户端(即 Nginx 或上一级代理)
四、验证是否生效的实操方法
别只看配置文件,要动手验证链路是否打通:
- 用 curl 模拟多层代理请求:
curl -H "X-Forwarded-For: 203.0.113.5, 198.51.100.2" http://your-domain.com/test-ip - 在 Nginx access_log 中加入
$remote_addr — $http_x_forwarded_for字段,观察日志输出 - 后端接口返回
request.getHeader("X-Real-IP")和request.getHeader("X-Forwarded-For")内容,比对是否符合预期 - 检查防火墙/WAF 是否已将自身 IP 加入 Nginx 的
set_real_ip_from白名单,否则会被当作不可信而丢弃


















