一般情况下,当网站接入Cloudflare后,所有用户请求都会经过Cloudflare的全球CDN网络进行转发。这会导致源站Nginx日志中记录的访问IP都是Cloudflare服务器的节点IP,而非访客真实的IP;
一、问题背景与原理
1.1 为什么需要特殊配置?
Cloudflare作为反向代理服务,所有用户请求都会经过以下路径:
访客浏览器 -> Cloudflare边缘节点 -> 源站服务器
此时Nginx接收到的连接都来自Cloudflare的IP地址,而非真实用户IP。
1.2 解决方案核心原理
Cloudflare会在转发请求时添加特定HTTP头:
- CF-Connecting-IP: 直接携带原始访客IP
- X-Forwarded-For: 记录完整的代理链路IP(最后一个IP为真实用户IP)
Nginx通过ngx_http_realip_module
模块可以重写客户端地址,核心配置:
set_real_ip_from <信任的代理IP>;
real_ip_header 需要解析的头部字段;
二、配置参数
2.1 基础配置(存在安全隐患)
http {
# 信任所有来源(仅用于测试,生产环境禁止使用!)
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
}
⚠️ 安全隐患:此配置允许任何代理服务器伪造客户端IP
2.2 推荐的安全配置
http {
# 只信任Cloudflare的IP段
include /etc/nginx/cloudflare-ips.conf;
real_ip_header CF-Connecting-IP;
# 或使用:real_ip_header X-Forwarded-For;
}
创建/etc/nginx/cloudflare-ips.conf
:
# Cloudflare IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
...(完整IP段请从官网获取)
# Cloudflare IPv6
set_real_ip_from 2400:cb00::/32;
...
三、配置步骤详解
3.1 验证模块支持
确保Nginx编译时包含ngx_http_realip_module
:
nginx -V 2>&1 | grep -q realip && echo "模块存在" || echo "需要重新编译"
3.2 生产环境推荐配置
http {
# 加载Cloudflare最新IP列表
include /etc/nginx/cloudflare-ips.conf;
# 使用官方推荐头
real_ip_header CF-Connecting-IP;
# 保留原始IP(可选)
real_ip_recursive on;
}
3.3 自动更新IP列表(推荐)
使用定时任务自动获取最新IP:
# 更新脚本 /usr/local/bin/update-cloudflare-ips.sh
curl -s https://www.cloudflare.com/ips-v4 > /etc/nginx/cloudflare-ips.conf
curl -s https://www.cloudflare.com/ips-v6 >> /etc/nginx/cloudflare-ips.conf
设置cron每周更新:
0 3 * * 1 /usr/local/bin/update-cloudflare-ips.sh
四、配置验证方法
4.1 测试命令
curl -H "CF-Connecting-IP: 1.2.3.4" http://yourdomain.com
4.2 查看日志格式
确保日志格式包含$http_x_forwarded_for
:
log_format main '$remote_addr - $http_x_forwarded_for ...';
4.3 实际访问测试
访问服务器后检查日志:
原记录(未配置):192.168.10.1(Cloudflare IP)
配置成功后:123.123.123.123(真实用户IP)
五、技术细节解析
5.1 头部字段选择
- CF-Connecting-IP:Cloudflare官方专用头,只携带原始IP
- X-Forwarded-For:通用标准头,格式为
client, proxy1, proxy2
5.2 real_ip_recursive指令
当启用时:
real_ip_recursive on;
会从右向左遍历X-Forwarded-For列表,跳过所有可信IP,取第一个不可信IP作为客户端地址。
六、安全注意事项
- 必须严格限制set_real_ip_from
仅允许Cloudflare官方IP,避免IP伪造攻击 - 定期更新IP列表
Cloudflare每季度更新IP段,需保持同步 - 优先使用CF-Connecting-IP
相比X-Forwarded-For更安全可靠
七、总结
通过正确配置ngx_http_realip_module
,我们可以准确获取经过Cloudflare代理的真实用户IP。关键要点:
- 仅信任Cloudflare官方IP段
- 推荐使用CF-Connecting-IP头
- 建立IP列表自动更新机制
- 严格的安全限制措施
正确配置后,Nginx日志、访问限制等功能都能基于真实用户IP正常工作,同时保持服务的安全性。