网站接入 Cloudflare 后如何获取访客 IP

网站接入 Cloudflare CDN 后,NGINX 等服务器收到的请求是由 Cloudflare 的服务器转发的,观察访问日志,看到的访客 IP 也就都成了 Cloudflare 的服务器 IP。这对部分好奇心比较强的博主,或者有分析日志进行数据统计的用户来说,不够友好。

好在 Cloudflare 在请求头中其实是携带了访客的 IP 的,也有 官方文章 介绍如何处理。这里记录一个 NGINX 的处理方式:

1. 创建一个空的 NGINX 配置文件

touch /usr/local/nginx/conf/cloudflare

2. 修改你默认的 nginx.conf 配置文件,在 http 段落中引用刚刚创建的配置文件:

include /usr/local/nginx/conf/cloudflare;

3. 使用 vi cloudflare-real-ip.sh 创建一个 bash 脚本,内容为:

#!/bin/bash

CLOUDFLARE_FILE_PATH=/usr/local/nginx/conf/cloudflare

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
    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
    echo "set_real_ip_from $i;" >> $CLOUDFLARE_FILE_PATH;
done

echo "" >> $CLOUDFLARE_FILE_PATH;
echo "real_ip_header CF-Connecting-IP;" >> $CLOUDFLARE_FILE_PATH;

#test configuration and reload nginx
nginx -t && systemctl reload nginx

4. 给该脚本赋予执行权限:

chmod +x cloudflare-real-ip.sh

5. 执行脚本,就会自动获取 Cloudflare 的服务器 IP、生成 real-ip-header 配置并写入第一步创建的文件、测试并重载 NGINX 服务器。生成的配置类似以下内容:

#Cloudflare

# - IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

# - IPv6
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

real_ip_header CF-Connecting-IP;

6. 如果有需要,可以使用 crontab -e 将脚本添加到定时任务中(将 path/to 替换成你的脚本路径 ):

30 2 * * * /path/to/cloudflare-real-ip.sh >/dev/null 2>&1

记得将上面 cron 中的路径换成你的脚本路径。

本脚本有一个 Github 仓库,本文也是来源于此。

# #


《 “网站接入 Cloudflare 后如何获取访客 IP” 》 有 4 条评论

  1. springwood说道:

    我是用 google analytic 统计的,它比单纯依靠 IP 要准确得多。我在其他依据 IP 推测位置的地方都看不见我的真实位置,只有 google analytic 能

  2. 涛叔说道:

    感觉对于国内用户来说,加了 cloudflare 只会降速。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注