解决网站使用 Cloudflare CDN 加速后无法获取访问者真实客户端 IP 地址的全自动脚本

问题原因

Cloudflare 可以为网站提供免费的 CDN 加速和 DDoS 防护功能,但是当我们开启 Cloudflare 后,默认从 Web 服务器获取到的访问者 IP 就变成了 Cloudflare 的服务器 IP 地址,这显然会影响网站功能的正常运行,例如基于 IP 检查的网站登录安全防护、访客统计分析等。

修复思路

将 Cloudflare 的 IP 范围放入排除列表,然后从 HTTP 请求中的 X-Forwarded-For 或 CF-Connecting-IP 标头取得访问者的原始 IP。

以 nginx 服务器为例

  1. 修改并保存以下脚本为 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 配置
  2. 创建计划任务,以 ROOT 权限定期执行脚本

    /etc/cron.d 创建 sync 文件,内容如下

    30 2 * * * root bash 脚本的保存路径/cloudflare-sync-ips.sh > /dev/null 2>&1 # 每天 02:30 以 ROOT 权限执行

    重启 cron 服务

    systemctl restart cron
0 0 投票数
文章评分
订阅评论
提醒
0 评论
内联反馈
查看所有评论
By 马丁龙猪

标签

归档

其他操作