Nginx配置CDN后无法获取IPv6客户端真实IP的技术求助
解决Nginx通过IPv6 CDN获取客户端真实IP的问题
这个问题的核心很明确:你当前的set_real_ip_from只配置了CDN的IPv4可信网段,完全没覆盖CDN的IPv6代理地址。Nginx的realip模块只会对可信代理列表内的IP来源请求,才会从real_ip_header指定的字段(这里是X-Forwarded-For)中提取真实客户端IP;如果请求来自列表外的IP(比如CDN的IPv6节点),它就会直接把这个代理IP当作remote_addr返回,不会去解析X-Forwarded-For。
具体解决步骤:
获取你的CDN服务商提供的完整IPv6可信网段
不同CDN的IPv6网段不一样,比如Cloudflare、阿里云CDN、腾讯云CDN都有公开的官方文档列出他们的IPv4/IPv6代理地址段。你需要去对应服务商的文档里找到完整的IPv6网段列表,别漏了任何一段。更新Nginx配置,添加IPv6的可信网段
在原有IPv4的set_real_ip_from规则下面,追加CDN的IPv6网段配置,示例如下(以Cloudflare的IPv6段为例,你要替换成自己CDN的实际网段):# 保留原有所有IPv4可信网段 set_real_ip_from 173.245.48.0/20; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 108.162.192.0/18; set_real_ip_from 190.93.240.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 162.158.0.0/15; set_real_ip_from 104.16.0.0/12; set_real_ip_from 172.64.0.0/13; set_real_ip_from 131.0.72.0/22; # 添加CDN的IPv6可信网段(替换成你的CDN实际网段) set_real_ip_from 2606:4700::/28; set_real_ip_from 2606:4700:10::/36; set_real_ip_from 2606:4700:20::/36; set_real_ip_from 2606:4700:30::/36; set_real_ip_from 2606:4700:40::/36; set_real_ip_from 2a06:98c0::/29; real_ip_header X-Forwarded-For; # 可选:如果X-Forwarded-For包含多个IP(比如多层代理),开启递归查找真实IP # real_ip_recursive on;验证配置并重启Nginx
执行nginx -t检查配置语法是否正确,没问题的话执行nginx -s reload重载配置。
关于你担心的「客户端直接访问时X-Forwarded-For不存在」问题:
完全不用怕!realip模块的逻辑是:
- 如果请求来自
set_real_ip_from列表内的可信代理:就从X-Forwarded-For里提取真实IP,覆盖remote_addr - 如果请求直接来自客户端(不在可信列表里):Nginx不会修改
remote_addr,这个字段就是客户端的真实IP(不管是IPv4还是IPv6),哪怕X-Forwarded-For不存在也不影响。
测试的时候可以分别用:
- IPv6设备通过CDN访问,检查
remote_addr是否为你的真实IPv6 - 直接用客户端(跳过CDN)访问,检查
remote_addr是否为客户端的真实IP
内容的提问来源于stack exchange,提问作者Free P
相关产品推荐
相关产品推荐

