真实源IP审计失真主因是XFF链路污染,需首层Nginx丢弃客户端XFF并用$remote_addr强制初始化,中间层仅可信追加,末层启用real_ip_module白名单递归提取,审计应读修正后的$remote_addr或X-Real-IP。

多层 Nginx 反向代理级联时,X-Forwarded-For(XFF)链路污染是真实源 IP 审计失真的主因——不是头没传,而是传了不该信的、重复的、被中间层擅自插入或覆盖的 IP 段。关键不在“加”,而在“筛”和“信”。
只允许可信代理追加,禁止客户端或不可信中间件写入
第一层(直面公网)Nginx 必须丢弃客户端原始 XFF 头,强制用 $remote_addr 初始化:
-
proxy_set_header X-Forwarded-For $remote_addr;—— 覆盖而非拼接 proxy_set_header X-Real-IP $remote_addr;- 禁用
$proxy_add_x_forwarded_for,它会无条件拼接,引入风险
中间层仅做“可信追加”,不解析也不信任上游 XFF
第二层及以后的 Nginx(如内网网关、业务路由层)只负责扩展链路,不参与 IP 判定:
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 此时上游已清洗过,拼接的是可信代理 IP -
set_real_ip_from不在此层启用;它只属于最后一级或直接对接后端的节点 - 避免配置
real_ip_header X-Forwarded-For,否则可能误将中间代理 IP 当作客户端
最终接入层用 real_ip_module 递归提取真实 IP
最靠近后端应用的 Nginx 节点,必须启用 real_ip 模块并严格白名单:
-
set_real_ip_from 198.51.100.0/20;—— Cloudflare 网段 -
set_real_ip_from 10.0.0.0/8;—— 内网可信代理段(如 LB、WAF、上一级 Nginx) real_ip_header X-Forwarded-For;-
real_ip_recursive on;—— 从右往左剔除所有在白名单中的 IP,第一个非白名单 IP 即为真实客户端 IP - 此后
$remote_addr已被自动修正,日志、限流、风控均可直接使用
后端审计必须读取修正后的变量,而非手动解析 XFF 字符串
审计系统若仍从请求头中 split(",")[0] 取值,等于绕过全部防护:
- 推荐读
X-Real-IP(由首层 Nginx 注入,已是最左可信 IP) - 更稳妥读 Nginx 修正后的
$remote_addr(通过fastcgi_param REMOTE_ADDR $remote_addr或类似机制透传) - 禁用“fallback 到
RemoteAddr”类兜底逻辑,防止伪造头回退生效


















