跳至内容

Jixun's Blog 填坑还是开坑,这是个好问题。

在 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 终于正常了。

知识共享许可协议 本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

评论区