文章目录
问题原因
Cloudflare 可以为网站提供免费的 CDN 加速和 DDoS 防护功能,但是当我们开启 Cloudflare 后,默认从 Web 服务器获取到的访问者 IP 就变成了 Cloudflare 的服务器 IP 地址,这显然会影响网站功能的正常运行,例如基于 IP 检查的网站登录安全防护、访客统计分析等。
修复思路
将 Cloudflare 的 IP 范围放入排除列表,然后从 HTTP 请求中的 X-Forwarded-For 或 CF-Connecting-IP 标头取得访问者的原始 IP。
以 nginx 服务器为例
-
修改并保存以下脚本为
cloudflare-sync-ips.sh
#!/bin/bash CLOUDFLARE_FILE_PATH="/etc/nginx/conf.d/cloudflare.conf" # 根据你服务器的实际情况修改配置文件路径 echo "#Cloudflare" > $CLOUDFLARE_FILE_PATH; echo "" >> $CLOUDFLARE_FILE_PATH; echo "# - IPv4" >> $CLOUDFLARE_FILE_PATH; for i in `
curl -s -L https://www.cloudflare.com/ips-v4
`; do # 从 Cloudflare 官方实时取得最新的 IPv4 地址。 echo "set_real_ip_from $i;" >> $CLOUDFLARE_FILE_PATH; done echo "" >> $CLOUDFLARE_FILE_PATH; echo "# - IPv6" >> $CLOUDFLARE_FILE_PATH; for i in `curl -s -L https://www.cloudflare.com/ips-v6
`; do # 从 Cloudflare 官方实时取得最新的 IPv6 地址。 echo "set_real_ip_from $i;" >> $CLOUDFLARE_FILE_PATH; done # 开启 Cloudflare Railgun 需要配置的部分(未启用整段删除) - 起始 echo "" >> $CLOUDFLARE_FILE_PATH; echo "# - Mine" >> $CLOUDFLARE_FILE_PATH; echo "set_real_ip_from xxx.xxx.xxx.xxx;" >> $CLOUDFLARE_FILE_PATH; # 填写安装了 Railgun 的服务器 IPv4 地址 echo "set_real_ip_from xxxx:xxxx::xxxx:xxxx:xxxx;" >> $CLOUDFLARE_FILE_PATH; # 填写安装了 Railgun 的服务器 Ipv6 地址 # 开启 Cloudflare Railgun 需要配置的部分(未启用整段删除) - 结束 echo "" >> $CLOUDFLARE_FILE_PATH; echo "real_ip_header CF-Connecting-IP;" >> $CLOUDFLARE_FILE_PATH; #test configuration and reload nginx nginx -t && systemctl reload nginx # 重新加载 nginx 配置 -
创建计划任务,以 ROOT 权限定期执行脚本
在
/etc/cron.d
创建sync
文件,内容如下30 2 * * * root bash 脚本的保存路径/cloudflare-sync-ips.sh > /dev/null 2>&1 # 每天 02:30 以 ROOT 权限执行
重启 cron 服务
systemctl restart cron