Dragon
  • 注册、登陆后即可全站无广告畅快浏览本博客了!
  • 本博客已开启支持百度AI智能内容自动审核机制!
明月登楼明月登楼  2021-09-03 11:00 明月登楼的博客 隐藏边栏 |   6 条评论  143 
文章评分 12 次,平均分 5.0
导语: 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。

最近因为被 DDoS/CC 攻击的厉害,明月就临时的迁移了服务器,原来的服务器就空置下来了,让明月有时间对服务器进行了重置重新部署安装生产环境。因为站点同时使用了上海云盾和 CloudFlare(具体思路可以参考【国内网站使用国外 CloudFlare CDN 的思路分享】一文)两个 CDN 服务,所以就要解决一下 Nginx、 WordPress 、 Typecho 里获取访客真实 IP的问题,Nginx 里是为了方便日志分析等运维工作的需要, WordPress 、 Typecho 里对于评论管理真实的 IP 还是很有必要的。

网上相关的教程倒是不少,基本上一搜可以搜出一大堆出来,明月结合自己的需求选择了 Nginx 的 http_realip_module 模块来获取开启 CDN 后的访客真实 IP。因为明月实测分析这个方法准确度和效率都是比较高的,特别是在知道 CDN 节点 IP 段前提下表现尤为突出,今天就整理出来分享给大家,为了方便大家直接使用特意在本文结尾处分享了相关的 cdn.conf 文件(包含最新上海云盾、CloudFlare 节点 IP 段等),大家只需要在 nginx.conf 里 http 里 include 这个 cdn.conf 文件即可,也方便后期更新 IP 段!

首先,我们要让 Nginx 包含 http_realip_module 模块,也就是在升级、编译 Nginx 的时候加上--with-http_realip_module选项,具体大家自行百度就是了,这里就不过多赘述了。

然后在 nginx.conf 的 http 里设置已知的 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;

然后下面紧跟开启 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 在日志里出现记录就表明成功了。

WordPress 和 Typecho 下获取访客真实 IP 方法是一样的,只需要在配置文件( WordPress 为 wp-config.php, Typecho 为 config.inc.php)里添加如下代码即可:

//防止 CDN 造成无法获取客户真实 IP 地址
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
    $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
    $_SERVER['REMOTE_ADDR'] = $list[0];
}

添加代码后,记得一定要重启一下 php-fpm 让代码生效哦,切记!切记!切记!

到这里就完成了 Nginx、 WordPress 、 Typecho 在开启了 CDN 后自动获取用户访客真实 IP 了,最后明月分享了 cdn.conf 文件,大家只需要在 Nginx 的 http 里 include 这个文件就可以完成 Nginx 的配置了,最后重启一下 Nginx 即可生效,至于 WordPress 、 Typecho 的代码大家根据自己情况按照上面说的添加即可。

「点点赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

明月登楼给明月登楼打赏
×
予人玫瑰,手有余香
  • 2
  • 5
  • 10
  • 20
  • 50
2
支付

本文来自投稿,不代表明月登楼的博客立场,版权归原作者所有,欢迎分享本文,转载请保留出处!

明月登楼
明月登楼 关注:1    粉丝:0
玉满斋(www.ymanz.com)网站创始人,☑玉器爱好者 ☑微博控 ☑手机控 ☑历史控 ☑宅 ☑网络控 ☑Wordpress控

发表评论

表情 链接 私密 格式 签到
  1. 挖站否

    网站打开速度很快。, [坏笑]

    地板 20天前
    0 0 回复
  2. 流金岁月

    不错,学习一下,更详细了

    板凳 21天前
    0 0 回复
  3. maqingxi
    maqingxi 评论达人 LV.3 来自天朝的朋友 谷歌浏览器 92.0.4515.159 Windows 10

    我说怎么就近的几位评论者的 IP 都是一样的。

    沙发 21天前
    0 0 回复
扫一扫二维码分享