
CloudFlare代理下Nginx如何获取真实访客IP地址
大约 2 分钟
CloudFlare代理下Nginx如何获取真实访客IP地址
为了确保每次请求到源服务器时都能提供客户端(访问者)的IP地址,Cloudflare添加了“CF-Connecting-IP”头部信息。我们将捕获这个头部信息来获取访客的真实IP地址。
Nginx配置
通过将CloudFlare负载均衡器的IP地址配置到nginx配置文件中,我们就可以用访客的真实IP地址替代CloudFlare代理IP地址。
配置/etc/nginx/nginx.conf文件,并在http{....}块中加入以下行:
include /etc/nginx/cloudflare;
通过运行下面的Bash脚本生成/etc/nginx/cloudflare文件,即获取CloudFlare的IP列表,并让nginx加载其内容。
#!/bin/bash
CLOUDFLARE_FILE_PATH=/etc/nginx/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;
nginx -t && systemctl reload nginx
获取的/etc/nginx/cloudflare文件内容可能如下:
#Cloudflare IP地址
# - IPv4
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
...
set_real_ip_from 131.0.72.0/22;
# - IPv6
set_real_ip_from 2400:cb00::/32;
...
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
设定定时任务(Crontab)
以上Bash命令即可手动执行,也推荐将其保存为一个可执行脚本文件:
"/opt/scripts/cloudflare-ip-whitelist-sync.sh"
利用crontab -e命令添加到任务列表:
30 2 * * * /opt/scripts/cloudflare-ip-whitelist-sync.sh >/dev/null 2>&1
这样CloudFlare的IP地址每天都会自动刷新,同步完成后Nginx会自动重载。