负载均衡接入时需配置客户端真实IP透传,核心是正确处理X-Forwarded-For头:每层代理追加自身IP、Nginx用$proxy_add_x_forwarded_for并配置set_real_ip_from与real_ip_header实现IP还原,后端须主动解析XFF首IP并校验有效性。

负载均衡接入时配置客户端真实 IP 透传,核心是让每层代理正确添加、识别并信任 X-Forwarded-For(XFF)头,同时避免伪造风险。不能只靠“转发头”,必须配合可信源控制与后端解析逻辑。
明确 X-Forwarded-For 的生成规则
XFF 是一个以逗号分隔的 IP 列表,格式为:X-Forwarded-For: 客户端真实IP, 代理1, 代理2, ...
最左侧 IP 是原始客户端地址,后续是各跳代理 IP。关键点:
- 每层代理应在转发请求时 追加 自己的
$remote_addr,而不是覆盖; - Nginx 推荐用
$proxy_add_x_forwarded_for变量,它会自动判断是否已有 XFF 并做追加; - CDN(如 Cloudflare)、云负载均衡(如阿里云 SLB、AWS ALB)通常默认携带 XFF,且首 IP 可信;
- 若前端使用非标准头(如
X-Cluster-Client-IP),需在 Nginx 中显式映射:proxy_set_header X-Real-IP $http_x_cluster_client_ip;
多层代理下确保 Nginx 正确还原真实 IP
当请求经过 CDN → 负载均衡 → Nginx → 后端时,$remote_addr 已变成上一跳 IP。此时仅设 header 不够,必须让 Nginx 主动解析 XFF 并修正内置变量:
- 在
http或server块中声明可信代理段:set_real_ip_from 10.0.0.0/8;set_real_ip_from 192.168.0.0/16;set_real_ip_from 172.16.0.0/12;
(补充云厂商私有网段,如阿里云 VPC 网段100.64.0.0/10) - 指定从哪个头提取真实 IP:
real_ip_header X-Forwarded-For; - 开启递归解析(剔除已知代理 IP,取第一个非代理 IP):
real_ip_recursive on; - 配置生效后,
$remote_addr和$realip_remote_addr就是真实客户端 IP,可用于日志、限流、WAF 等场景。
后端服务必须主动读取 XFF,不能依赖 REMOTE_ADDR
无论 Nginx 是否还原了 $remote_addr,后端代码仍需按规范解析 XFF,因为:
- 某些语言框架(如 Spring Boot、Express)默认不信任 XFF,需显式启用(如
server.forward-headers-strategy=framework); - PHP 中应使用
$_SERVER['HTTP_X_FORWARDED_FOR']并取逗号分割后的首 IP,而非$_SERVER['REMOTE_ADDR']; - Java Servlet 中建议调用
request.getRemoteAddr()前先检查是否启用了RemoteIpFilter; - 务必校验 XFF 首 IP 是否为公网有效地址,过滤掉私有网段(如
127.0.0.1、192.168.x.x)以防伪造。
云环境或 Service Mesh 场景的特殊处理
在 ASM/Istio、阿里云 MSE 或腾讯云 TSE 等托管网关中,XFF 处理更依赖平台配置:
- ASM 网关需设置
numTrustedProxies注解,表示信任的代理跳数减一(例如 CDN + SLB + 网关 = 3 跳,则设为2); - 若代理链路不固定(如混合公网/内网接入),应改用
trustedProxies白名单方式,排除已知代理 IP 后取首个公网 IP; - F5 LTM、Citrix ADC 等设备需通过 iRules 或策略配置提取 XFF 首 IP,并写入新头(如
X-True-Client-IP)供后端直读。

















