set_real_ip_from必须配合real_ip_header才能生效,单独配置无效;典型组合为set_real_ip_from指定信任代理网段、real_ip_header指定x-forwarded-for或cf-connecting-ip等头部,real_ip_recursive on启用递归解析以准确提取最左端未被信任的客户端ip。

Set-Real-IP-From 必须配合 real_ip_header 才生效
单独写 set_real_ip_from 没用,Nginx 不会自动改 $remote_addr。必须同时指定从哪个请求头取真实 IP,常见的是 X-Forwarded-For 或 X-Real-IP。
典型配置组合:
set_real_ip_from 10.0.0.0/8; set_real_ip_from 172.16.0.0/12; set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For; real_ip_recursive on;
real_ip_recursive on 表示启用递归解析:当 X-Forwarded-For 是逗号分隔的多段 IP(如 1.1.1.1, 2.2.2.2, 3.3.3.3),Nginx 会从右往左剔除已信任的代理 IP,把最左边未被信任的 IP 当作真实客户端 IP。
信任网段写错会导致真实 IP 被覆盖成代理内网地址
如果 set_real_ip_from 写漏了某层网关(比如漏掉 Kubernetes Service 的 ClusterIP 网段 10.96.0.0/12),而该网关又在 X-Forwarded-For 最右侧,Nginx 就会把它当成真实 IP —— 结果日志里全是 10.96.x.x 这类内网地址,丢失用户真实 IP。
排查方法:
- 用
curl -H "X-Forwarded-For: 8.8.8.8, 10.10.10.10" http://your-site/测试,看 access log 中$remote_addr是否变成8.8.8.8 - 检查 Nginx error log,若出现
ignoring invalid real IP address,说明X-Forwarded-For解析失败,大概率是信任网段没对齐 - 确认所有中间代理(CDN、Ingress Controller、API 网关)出口 IP 或网段都已加入
set_real_ip_from
real_ip_recursive on/off 决定取哪个 IP 段
假设请求头是 X-Forwarded-For: 203.0.113.5, 198.51.100.2, 192.0.2.1,且你只信任 192.0.2.0/24:
-
real_ip_recursive off(默认):只检查最右边一个 IP(192.0.2.1),它在信任网段内 → 取前一个198.51.100.2作为真实 IP -
real_ip_recursive on:从右往左逐个剔除信任 IP,直到遇到第一个不信任的 →203.0.113.5成为真实 IP
大多数生产环境应设为 on,否则多层代理下容易误取中间某级代理的出口 IP。
Cloudflare、AWS ALB 等托管服务需用专用 IP 段
不能只写自己机房网段。例如:
- Cloudflare:必须加
set_real_ip_from对应其官方 IP 段(如173.245.48.0/20),并确保real_ip_header设为CF-Connecting-IP(比X-Forwarded-For更可靠) - AWS ALB / NLB:信任其文档中公布的 CIDR(如
130.176.0.0/16),且注意 ALB 默认不传X-Forwarded-For给后端,要确认监听器规则已启用「Preserve Host header」和「Proxy protocol v2」(后者需 Nginx 编译时带--with-stream_realip_module) - 阿里云 SLB:使用
X-Forwarded-For,但需额外加 SLB 公网出口段(如100.64.0.0/10)到set_real_ip_from
这些 IP 段会更新,建议定期同步官方列表,或用自动化脚本拉取后 reload 配置。











