使用 CloudFlare 后 Nginx 获取访客真实 IP 方法

  1. 首先,我们要让 Nginx 包含 http_realip_module 模块
  2. 然后在 nginx.conf 的 http 里设置已知的 CDN 节点 IP 段,如下:
    #获取开启 CDN 后访客真实IP
    #CloudFlare节点 for 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;
    #CloudFlare节点 for 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;
    #上海云盾国内节点
    set_real_ip_from 27.221.64.0/24;
    set_real_ip_from 27.221.68.0/24;
    set_real_ip_from 42.49.13.0/24;
    set_real_ip_from 42.236.6.128/27;
    set_real_ip_from 49.232.85.76/32;
    set_real_ip_from 58.222.57.0/24;
    set_real_ip_from 59.56.19.0/24;
    set_real_ip_from 59.56.78.0/24;
    set_real_ip_from 59.56.79.0/24;
    set_real_ip_from 60.163.162.32/27;
    set_real_ip_from 101.69.181.0/24;
    set_real_ip_from 103.95.220.0/25;
    set_real_ip_from 103.95.221.0/24;
    set_real_ip_from 103.136.251.0/24;
    set_real_ip_from 103.219.29.64/26;
    set_real_ip_from 111.2.127.0/24;
    set_real_ip_from 111.61.59.0/24;
    set_real_ip_from 115.231.230.0/24;
    set_real_ip_from 116.136.249.0/24;
    set_real_ip_from 116.177.238.0/24;
    set_real_ip_from 117.34.43.0/24;
    set_real_ip_from 118.121.192.0/24;
    set_real_ip_from 120.53.244.232/32;
    set_real_ip_from 120.220.20.0/24;
    set_real_ip_from 122.9.54.0/24;
    set_real_ip_from 122.226.191.192/26;
    set_real_ip_from 125.44.163.0/24;
    set_real_ip_from 129.28.193.74/32;
    set_real_ip_from 153.35.236.0/24;
    set_real_ip_from 171.111.155.0/24;
    set_real_ip_from 175.6.227.128/26;
    set_real_ip_from 183.47.233.64/26;
    set_real_ip_from 183.131.145.0/24;
    set_real_ip_from 183.131.200.0/24;
    set_real_ip_from 183.134.17.0/27;
    set_real_ip_from 183.221.215.0/24;
    set_real_ip_from 183.232.187.0/24;
    set_real_ip_from 183.249.20.0/24;
    set_real_ip_from 223.111.172.0/24;
    set_real_ip_from 223.68.10.0/24;
    #上海云盾海外节点
    set_real_ip_from 45.159.59.0/24;
    set_real_ip_from 85.237.218.0/24;
    set_real_ip_from 103.100.71.0/24;
    set_real_ip_from 103.112.3.0/24;
    set_real_ip_from 117.18.111.128/25;
    set_real_ip_from 128.1.170.0/24;
    set_real_ip_from 129.227.63.0/24;
    set_real_ip_from 156.241.6.0/24;
    set_real_ip_from 161.117.85.73/32;
    set_real_ip_from 164.88.96.0/24;
    set_real_ip_from 164.88.98.0/24;
    set_real_ip_from 202.181.144.128/25;
    set_real_ip_from 206.119.114.192/26;
    set_real_ip_from 206.119.110.192/26;
    set_real_ip_from 206.119.109.192/26;
    set_real_ip_from 206.119.108.192/26;
    set_real_ip_from 216.177.129.0/24;
  3. 然后下面紧跟开启 http_realip_module 模块的获取真实 IP 开关并传递用户 IP,如下:
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    X-Forwarded-For 这个 header 信息,用于记录此请求所进过的 ip,假设本 nginx 为第 3 层代理,那么获取到的 X-Forwarded-For 就会记录 3 个 ip,分别顺序为:用户 IP、第一层代理 IP、第二层代理 IP; 这时候就会用到real_ip_recursive参数,如果此参数不开启,就会从右往左,取第一个出现在信任中的 IP 的左边一位的 IP 作为$remote_addr,我们这里是全信任,所以就会取到第一层代理 IP,这明显就并不一定对。如果开启了 real_ip_recursive,那么就会从右边往左一直取到第一个不信任的 IP 作为$remote_addr,如果像我这里是全部信任,那么最左边的 IP 则会被作为$remote_addr。

    至此我们在 Nginx 层面已经获取到了访客的真实 IP 了,大家可以实时跟踪观察一下站点日志,自己再访问一下,看到自己的 IP 在日志里出现记录就表明成功了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容