撰于 阅读 81

网站接入Cloudflare后,Nginx获取真实访客IP方法

一般情况下,当网站接入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作为客户端地址。


六、安全注意事项

  1. 必须严格限制set_real_ip_from
    仅允许Cloudflare官方IP,避免IP伪造攻击
  2. 定期更新IP列表
    Cloudflare每季度更新IP段,需保持同步
  3. 优先使用CF-Connecting-IP
    相比X-Forwarded-For更安全可靠

七、总结

通过正确配置ngx_http_realip_module,我们可以准确获取经过Cloudflare代理的真实用户IP。关键要点:

  • 仅信任Cloudflare官方IP段
  • 推荐使用CF-Connecting-IP头
  • 建立IP列表自动更新机制
  • 严格的安全限制措施

正确配置后,Nginx日志、访问限制等功能都能基于真实用户IP正常工作,同时保持服务的安全性。