在 Nginx 获取 CloudFlare 后的真实 IP
网站套上了 CF CDN,访客 IP 都是 CF 反代的节点 IP。目的是让 Nginx 日志显示真实 IP 地址。
更新脚本
简单写一个脚本,放到 /usr/local/bin/update-cloudflare-ips.sh
并标记为可执行。
※ 使用 sudo chmod +x /文件/路径
来将其标记为可执行。
#!/bin/bash
# 存放最终配置文件的路径
cf_ips_file=/etc/nginx/snippets/cf_ips
generate_cf_ips() {
echo '# Accept CloudFlare IPs'
curl -w"\n" -fsL 'https://www.cloudflare.com/ips-v4/' 'https://www.cloudflare.com/ips-v6/' \
| awk '{print "set_real_ip_from " $0 ";" }' \
| sort \
| uniq
echo 'real_ip_header CF-Connecting-IP;'
}
existing_cf_ips="$(cat "$cf_ips_file")"
new_cf_ips="$(generate_cf_ips)"
if [[ "$existing_cf_ips" != "$new_cf_ips" ]]; then
echo 'updating cf ip file...'
printf "%s" "$new_cf_ips" > "${cf_ips_file}"
nginx -t && nginx -s reload
else
echo 'no update required.'
fi
设定自动更新
然后就是设置定期更新一次:
# 每日更新一次
sudo ln -sf /usr/local/bin/update-cloudflare-ips.sh /etc/cron.daily/update-cloudflare-ips.sh
# 或者每周一次
sudo ln -sf /usr/local/bin/update-cloudflare-ips.sh /etc/cron.weekly/update-cloudflare-ips.sh
使用方法
在需要引入 CloudFlare 配置的 server
块中引入即可:
server {
# 配置 SSL 等参数
listen :443 ssl;
server_name example.com;
ssl_certificate ...;
ssl_certificate_key ...;
# 引入 CF 配置
include snippets/cf_ips;
# 省略剩余配置...
}
结语
凑合着用,日志显示的访客 IP 终于正常了。