使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法

网站套了 CloudFlare CDN 可以增加一定的安全性,还可以提高全球用户的访问速度,所以 CloudFlare 几乎是世界上用户人数最多的 CDN 服务商。

概述

自从我的网站启用了 CloudFlare CDN 以后,宝塔面板 Nginx 访问日志里几乎全是 CloudFlare 的节点 IP 地址,这一度让我很是蛋疼。为了彻底解决这个问题我特意写了一个脚本来自动获取更新 CloudFlare 节点 IP 并自动过滤,然后记录真实的访客 IP 到日志中。

方法

本文以宝塔面板环境为例,将下面的代码复制粘贴到 /www/wwwroot/test/get-cloudflare-ip.sh 新建空白文本中保存。

#!/bin/bash
filepath="https://cdn.otakusay.com/www/wwwroot/test/cloudflare_ip.conf"
echo "#Cloudflare" > $filepath;
for i in `curl https://www.cloudflare.com/ips-v4`; do
     echo "set_real_ip_from $i;" >> $filepath;
done
for i in `curl https://www.cloudflare.com/ips-v6`; do
     echo "set_real_ip_from $i;" >> $filepath;
done
echo "" >> $filepath;
echo "# use any of the following two" >> $filepath;
echo "#real_ip_header CF-Connecting-IP;" >> $filepath;
echo "real_ip_header X-Forwarded-For;" >> $filepath;
  • 代码中的路径 /www/wwwroot/test/cloudflare_ip.conf 可以自行修改
  • 实例中的路径 /www/wwwroot/test/get-cloudflare-ip.sh 可以自行修改
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
在宝塔面板文件管理器中创建 get-cloudflare-ip.sh 脚本

然后去宝塔面板计划任务中添加定时 Shell 脚本,执行周期可以自行设定,一般建议每天执行一次即可。

bash /www/wwwroot/test/get-cloudflare-ip.sh
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
在宝塔面板计划任务中创建定时任务
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
点击执行刚刚添加的定时任务
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
点击日志可以查看定时任务的执行情况
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
本文中定时任务生成的配置文件与脚本文件路径相同
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
在 Nginx 配置 http 段中引用 cloudflare_ip.conf

宝塔面板软件商店修改 Nginx 配置,在 http 段中引用刚刚定时任务自动生成的 cloudflare_ip.conf 配置文件。

#套CDN以后获取访客真实IP
include /www/wwwroot/test/cloudflare_ip.conf;
使用 CloudFlare CDN 以后 Nginx 无法获取访客真实 IP 的解决方法 - 宝塔面板
Nginx 重置配置后立即生效

验证

打开浏览器访问你的网站,然后回到宝塔面板查看 Nginx 访问日志,已经可以获取到访客的真实 IP 了。

给TA买糖
共{{data.count}}人
人已赞赏
VPS教程

免费工具 VPS 一键检测脚本助你辨别 VPS 主机的好坏

2020-9-2 17:59:45

VPS教程

Cloudflare 新玩法利用 Workers 反向代理

2020-10-4 1:56:30

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索