CDN 环境下正确识别真实访客 IP 的方法
网站接入 CDN 后,最大的变化之一就是:访问源站的请求不再来自真实用户,而是来自 CDN 节点。
这虽然能有效防御攻击、加速访问,但也带来一个问题——
日志、统计、防火墙中看到的全是 CDN 节点的 IP。
那怎么让服务器正确识别真实访客的 IP 呢?
下面我们来详细说说。
一、为什么要获取真实 IP?
1. 安全分析:判断攻击来源、封禁爆破 IP。
2. 流量统计:记录真实访客数量和地区。
3. 日志追踪:分析行为日志时更准确。
如果不做处理,Nginx、Apache、宝塔后台等看到的都是 CDN 回源 IP,
导致封禁、统计、审计都出现偏差。
二、CDN 如何传递真实 IP
主流 CDN 在回源时都会在请求头中添加真实访客 IP,常见有:
CDN 类型请求头字段
CloudflareCF-Connecting-IP
腾讯云 CDNX-Forwarded-For
阿里云 CDNX-Forwarded-For
百度云加速Cdn-Src-Ip
其他 CDN(如 FunCDN)一般也是 X-Forwarded-For
因此,只要服务器正确解析这些请求头,就能还原访客的真实 IP。
三、Nginx 配置示例
在 Nginx 中,只需要加上以下配置即可识别真实 IP:
# 在 http 段添加
set_real_ip_from 0.0.0.0/0; # 允许所有来源(也可填写 CDN IP 段)
real_ip_header X-Forwarded-For;# CDN 回源头
real_ip_recursive on;说明:
set_real_ip_from:指定信任的来源(建议填写 CDN 节点 IP 段)。
real_ip_header:指定从哪个 Header 中取真实 IP。
real_ip_recursive:表示从多层代理中取最后一个有效 IP。
重载 Nginx:
nginx -t && systemctl reload nginx然后访问日志中 $remote_addr 会变成 CDN 节点 IP,
如果改成 $realip_remote_addr 就能看到真实用户 IP。
四、宝塔面板下的设置方法
如果你使用宝塔面板:
1. 打开网站设置 → 配置文件
2. 在 server 段上方加入:
set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
3. 保存并重载配置。
有些 CDN(如 Cloudflare)使用不同的 Header,可以替换成:
real_ip_header CF-Connecting-IP;如果你使用多个 CDN,可根据来源 IP 或域名设置不同规则。
五、验证真实 IP 是否生效
执行以下命令查看访问日志:
tail -n 20 /www/wwwlogs/yourdomain.com.log如果你能看到自己的公网 IP,而不是 CDN 节点 IP,说明配置成功。
也可以用 PHP 临时脚本测试:
<?php
echo $_SERVER['REMOTE_ADDR'];
?>
六、防火墙与日志的配合
1. Fail2ban / 防火墙封禁逻辑
如果未识别真实 IP,封禁的都是 CDN 节点,会导致网站无法访问。
2. 日志分析
建议在日志中使用 $realip_remote_addr 替代 $remote_addr,例如:
log_format main '$realip_remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
七、额外建议
定期更新 CDN 节点 IP 段(部分 CDN 官方提供)。
若使用多层代理(CDN → 反代 → 源站),只信任第一层代理。
不要轻易信任所有来源 IP,防止伪造 Header。
总结
在 CDN 环境下识别真实 IP 的关键在于:
1. 了解 CDN 使用的 Header;
2. 正确配置 real_ip_header;
3. 调整防火墙与日志策略。
配置好后,无论是分析日志、封禁攻击,还是统计访问数据,
都能更准确、更安全。
页:
[1]