当访问源经过源地址转换(NAT)或CDN(内容分发网络)时,Web 服务器或应用程序接收到的客户端 IP 地址将不再是用户的真实 IP,而是网关、负载均衡器或 CDN 边缘节点的 IP,这会导致日志记录、安全策略(如 IP 黑名单/白名单)、地理定位、频率限制等功能失效。
以下是针对这两种场景的解决方案和最佳实践:
经过源地址转换(NAT)
问题
- 所有来自同一内网的用户共享一个公网 IP。
- 服务器无法区分不同用户的真实 IP。
解决方案
使用 X-Forwarded-For 头(如果前端有反向代理)
虽然 NAT 本身不添加此头,但如果 NAT 前还有反向代理(如 Nginx、HAProxy),通常由代理设置该头。
在 NAT 网关或路由器上配置日志
- 某些企业级防火墙或 NAT 网关支持记录原始源 IP 和端口映射关系。
- 可通过日志关联服务获取真实 IP。
应用层嵌入用户标识
- 在用户登录或会话建立时,通过认证机制(如 JWT、Session ID)识别用户,而非依赖 IP。
- 适用于内部系统或需要精确用户行为的场景。
使用 TCP 代理或透明代理
- 在 NAT 前部署支持透传原始 IP 的代理(如 HAProxy 的
option forwardfor)。
- 注意:纯 NAT 无法透传 IP,除非使用 SNAT/DNAT 配合特定协议支持。
经过 CDN
问题
- CDN 边缘节点代替用户向源站发起请求。
- 源站看到的是 CDN 节点的 IP,而非用户真实 IP。
解决方案
利用 CDN 提供的 HTTP 头
大多数主流 CDN(如 Cloudflare、Akamai、简米云 CDN、酷番云 CDN)会在请求头中添加以下字段:
X-Forwarded-For:包含客户端真实 IP 和中间代理 IP 链。X-Real-IP:部分 CDN 提供。CF-Connecting-IP(Cloudflare 专用)X-Client-IP(简米云 CDN)True-Client-IP(Akamai 等)
✅ 建议:在源站服务器或应用代码中优先读取这些自定义头,而不是直接使用 REMOTE_ADDR。
配置 Web 服务器信任 CDN IP 段
- 将 CDN 的 IP 段加入“可信代理列表”,确保服务器只信任来自这些 IP 的
X-Forwarded-For头。 - 防止攻击者伪造
X-Forwarded-For。
Nginx 示例:
set_real_ip_from 103.21.244.0/22; # Cloudflare IPv4 示例 set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; # ... 其他 CDN IP 段 real_ip_header X-Forwarded-For; real_ip_recursive on;
Apache 示例:
SetEnvIf X-Forwarded-For "^103.21.244." trusted_proxy
RequestHeader set X-Real-IP "%{X-Forwarded-For}e" env=trusted_proxy
应用层处理
在代码中(如 Python、Java、Node.js)从请求头中获取真实 IP:
Python (Flask):
from flask import request
def get_real_ip():
if request.headers.getlist("X-Forwarded-For"):
return request.headers.getlist("X-Forwarded-For")[0].split(',')[0].strip()
return request.remote_addr
Node.js (Express):
app.set('trust proxy', true);
app.get('/', (req, res) => {
const ip = req.ip; // 自动解析 X-Forwarded-For
console.log('Real IP:', ip);
});
日志记录真实 IP
- 配置日志格式,使用
$http_x_forwarded_for或等效变量记录真实 IP。
Nginx 日志示例:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
安全注意事项
-
防止 IP 伪造
:
- 只信任来自已知 CDN 或代理 IP 的
X-Forwarded-For头。 - 在 Nginx 中使用
set_real_ip_from限制可信来源。
- 只信任来自已知 CDN 或代理 IP 的
-
IP 黑名单/白名单失效:
如果依赖 IP 做安全控制,需结合其他机制(如用户身份、行为分析)。
-
地理定位不准:
- CDN 节点可能位于不同地区,导致基于 IP 的地理定位错误。
- 使用 CDN 提供的地理信息 API 或用户上报位置。
-
频率限制(Rate Limiting):
- 基于 CDN IP 的限制可能误伤同一 CDN 下的多个用户。
- 建议结合用户 ID 或会话进行限流。
| 场景 | 关键措施 |
|---|---|
| NAT | 日志关联、应用层用户标识、透明代理 |
| CDN | 读取 X-Forwarded-For 等头、配置可信代理列表 |
| 安全 | 防止伪造 IP、结合多维度风控 |
| 日志与分析 | 配置正确日志格式,记录真实 IP |
通过合理配置 Web 服务器、CDN 和应用程序,可以准确获取用户真实 IP,保障系统的安全性、可审计性和用户体验。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/486000.html



