网站接入 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 仓库,本文也是来源于此。
我是用 google analytic 统计的,它比单纯依靠 IP 要准确得多。我在其他依据 IP 推测位置的地方都看不见我的真实位置,只有 google analytic 能
Google 也是基于 IP,加入了 Google 对你的追踪分析。
感觉对于国内用户来说,加了 cloudflare 只会降速。
的确如此。但 1 IP 博客也无所谓了。最主要的 Cloudflare 更隐蔽一些。