获取客户端真实IP
为什么需要获取真实IP
在现代 Web 架构中,为了应对大量用户访问,网站通常会部署在以下架构之后:
- WAF(如 Cloudflare WAF、AWS WAF)
- 负载均衡器(如 AWS ALB/ELB、阿里云 SLB)
- CDN 服务(如 Cloudflare、AWS CloudFront)
- 反向代理(如 Nginx、Apache)
因此,一个典型的客户端请求流程如下:
如果没有特殊配置,Nginx 的访问日志只能记录到直接连接的上游设备 IP(负载均衡器或 CDN 的 IP),而不是真实用户的 IP 地址。这会导致:
- 日志分析困难:无法识别真实用户行为
- 安全防护失效:无法基于用户 IP 进行访问控制
- 地域限制失效:无法根据用户地理位置提供服务
- 监控告警不准确:无法准确识别攻击来源
技术原理
HTTP 头部传递机制
负载均衡器和 CDN 通常会在 HTTP 请求头中添加真实用户的 IP 信息:
| 头部字段 | 使用场景 | 示例 |
|---|---|---|
X-Forwarded-For | 标准字段,大多数代理使用 | X-Forwarded-For: 1.2.3.4, 172.16.1.10 |
X-Real-IP | 简单代理环境 | X-Real-IP: 1.2.3.4 |
CF-Connecting-IP | Cloudflare CDN 专用 | CF-Connecting-IP: 1.2.3.4 |
Forwarded | RFC 7239 标准 | Forwarded: for=1.2.3.4;proto=https |
关于上述字段的详细介绍,可以参考: