|
|
这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
网站接入 CDN 后,最大的变化之一就是:
访问源站的请求不再来自真实用户,而是来自 CDN 节点。
这虽然能有效防御攻击、加速访问,但也带来一个问题——
日志、统计、防火墙中看到的全是 CDN 节点的 IP。
那怎么让服务器正确识别真实访客的 IP 呢?
下面我们来详细说说。
一、为什么要获取真实 IP?
1. 安全分析:判断攻击来源、封禁爆破 IP。
2. 流量统计:记录真实访客数量和地区。
3. 日志追踪:分析行为日志时更准确。
如果不做处理,Nginx、Apache、宝塔后台等看到的都是 CDN 回源 IP,
导致封禁、统计、审计都出现偏差。
二、CDN 如何传递真实 IP
主流 CDN 在回源时都会在请求头中添加真实访客 IP,常见有:
[td]| CDN 类型 | 请求头字段 | | Cloudflare | CF-Connecting-IP | | 腾讯云 CDN | X-Forwarded-For | | 阿里云 CDN | X-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. 调整防火墙与日志策略。
配置好后,无论是分析日志、封禁攻击,还是统计访问数据,
都能更准确、更安全。
|
|