在Nginx、CDN、负载均衡或WAF等反向代理场景下,获取客户端真实IP必须读取X-Forwarded-For(XFF)头部链中最左侧的非内网地址,并配合代理层追加策略与可信代理白名单过滤;直接读取TCP对端地址只能拿到代理IP。

为什么会取错IP:先理解链路
服务器看到的只是直连设备
- 当客户端经CDN、WAF、反向代理或负载均衡访问源站时,源站内核的remote_addr记录的是直连设备IP,也就是CDN回源节点或Nginx的地址。
- 直接取remote_addr得到的并不是用户真实IP,这也是“服务器获取客户端真实IP地址失败怎么解决”最常见的原因。
多级代理会让地址出现串链
- X-Forwarded-For由每一级代理追加,格式为:客户端IP, 代理1, 代理2。
- 如果不加白名单直接取第一个值,容易被伪造请求头欺骗。
获取真实IP的三种主流方案
读取X-Forwarded-For并过滤可信代理
- 最常用、改造成本最低。
- 需明确代理链层级,只从右往左剔除可信代理IP,剩余最左侧为客户端IP。
- 适合中小站点、单层代理。
使用Nginx realip模块还原
- nginx获取真实ip怎么配置?核心是realip_module,它可以在日志、限速和访问控制中直接使用真实IP。
- 配置示例:
set_real_ip_from 10.0.0.0/8; set_real_ip_from 172.16.0.0/12; real_ip_header X-Forwarded-For; real_ip_recursive on;
- real_ip_recursive on会从右往左递归排除可信代理,避免取到伪造IP。
按CDN/云厂商官方方案取头
- CDN后获取真实IP的方法:国内主流云厂商CDN回源通常携带X-Forwarded-For和X-Real-IP,海外Cloudflare还会给出CF-Connecting-IP。
- 必须在后端仅信任CDN回源IP段,不要信任所有来源的XFF。
代理层与后端还原:Nginx实战配置
Nginx作为反向代理时向后传递真实IP
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
- X-Real-IP写入直连设备IP,后端可快速读取。
- X-Forwarded-For若已存在则追加,若不存在则创建,符合代理追加语义。
Nginx作为后端时从XFF还原真实IP
- 将前面的set_real_ip_from配置放在server或http块,使$remote_addr变成真实客户端IP。
- 安全前提:set_real_ip_from白名单必须只包含实际直连代理IP段,例如CDN回源节点、内网负载均衡IP。
- 若白名单过宽,攻击者可伪造XFF绕过IP限制。
Java/Spring Boot获取客户端真实IP地址的代码与避坑
通用工具方法
- java获取客户端真实ip地址时,不要只读X-Forwarded-For第一个元素。
- 应优先从可信代理倒序排除:从右往左找到第一个非可信IP。
public static String getClientIp(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff != null && !xff.isEmpty() && !"unknown".equalsIgnoreCase(xff)) {
String[] ips = xff.split(",");
for (int i = ips.length 1; i >= 0; i--) {
String ip = ips[i].trim();
if (!isTrustedProxy(ip)) {
return ip;
}
}
}
return request.getRemoteAddr();
}
- isTrustedProxy需匹配CDN回源IP段或内网代理IP,不能简单用非空判断。
常见错误对比
| 写法 | 结果 | 风险 |
|---|---|---|
直接取request.getRemoteAddr() |
拿到CDN/代理IP | 业务统计失真 |
| 直接取XFF第一个值 | 可能拿到伪造IP | 可绕过风控 |
| 从右往左排除可信代理 | 获得真实客户端IP | 需维护白名单 |
安全防护:为什么不能无脑取XFF第一个IP
- 攻击者可自行添加X-Forwarded-For: 1.2.3.4,若后端不校验来源,会记录伪造IP。
- OWASP指南指出,未经代理层覆盖的XFF头不应直接信任。
防护清单
- 在入口代理统一覆盖或追加XFF,丢弃客户端自带的XFF。
- 后端仅接受来自可信入口代理的连接,可通过安全组、防火墙限制。
- 使用realip模块时开启real_ip_recursive on,并从右到左排除可信代理。
- 日志中同时记录原始remote_addr和还原后的真实IP,便于审计。
2026年生产环境推荐配置顺序
- 第一步:确认链路中是否包含CDN/多级代理。
- 第二步:在代理层统一拼接XFF并设置X-Real-IP。
- 第三步:后端配置可信代理白名单,开启递归还原。
- 第四步:用测试请求验证日志和风控是否取到真实IP。
- 第五步:定期更新CDN回源IP段,国内云厂商会不定期变更。
- 获取真实客户端IP不是简单读取remote_addr,而是要在代理层规范追加、后端白名单过滤、递归还原三个环节共同配合。
- 只要把XFF当作不可信输入,结合可信代理IP段,就能在CDN、Nginx、Java等场景稳定取到真实IP。
相关问答
nginx获取真实ip怎么配置?
- 在Nginx中使用realip_module:设置set_real_ip_from为可信代理IP段,real_ip_header X-Forwarded-For,并开启real_ip_recursive on,代理层需用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for追加。
服务器获取客户端真实IP地址失败怎么解决?
- 先检查链路中是否有CDN、WAF、反代;再确认这些代理是否回源携带XFF;然后核对后端set_real_ip_from白名单是否包含实际回源IP段;最后在日志中区分remote_addr与真实IP,定位遗漏层级。
国内CDN与海外Cloudflare获取真实IP有什么区别?
- 国内云厂商CDN通常回源带X-Forwarded-For和X-Real-IP,海外Cloudflare还会提供CF-Connecting-IP,但都必须配置对应回源IP白名单,否则存在伪造风险。
如果你在Kubernetes Service或WAF链路上仍取不到真实IP,可以在评论区说明你的转发层级,我们继续定位。

参考文献
- IETF RFC 7239: Forwarded HTTP Extension,2014年6月。
- NGINX Inc.:ngx_http_realip_module官方模块文档,2025年更新。
- OWASP Secure Headers Project:X-Forwarded-For伪造与信任边界指南,2023年。
- Spring Framework:HttpServletRequest接口文档,2025年发布。
小伙伴们,上文介绍服务器端获取客户端真实ip_获取真实客户端IP的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/189338.html