| 关键词: 用户 代理 服务器 Nginx 真实 clientRealIp 模式 deny forwarded |
一、真假难辨 如何禁止访问,我们先了解下常见的3种网站访问模式: 用户直接访问对外服务的普通网站 对于第一种模式,我要禁止这个用户的访问很简单,可以直接通过 iptables 或者 Nginx的deny指令来禁止均可: iptabels: 但对于后面2种模式就无能为力了,因为iptables 和 deny 都只能针对直连IP,而后面2种模式中,WEB服务器直连IP是CDN节点或者代理服务器,此时使用 iptable 或 deny 就只能把 CDN节点 或代理IP给封了,可能误杀一大片正常用户了,而真正的罪魁祸首轻轻松松换一个代理IP又能继续请求了。 那我们可以通过什么途径去解决以上问题呢? 二、火眼金睛 如果长期关注张戈博客的朋友,应该还记得之前转载过一篇分享Nginx在CDN加速之后,获取用户真实IP做并发访问限制的方法。说明Nginx还是可以实实在在的拿到用户真实IP地址的,那么事情就好办了。 要拿到用户真实IP,只要在Nginx的http模块内加入如下配置: #获取用户真实IP,并赋值给变量$clientRealIP 那么,$clientRealIP就是用户真实IP了,其实就是匹配了 $http_x_forwarded_for 的第一个值,具体原理前文也简单分享过: 其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录 三、隔山打牛 既然已经拿到了真实IP,却不能使用 iptables 和 deny 指令,是否无力感油然而生? 哈哈,在强大的 Nginx 面前只要想得到,你就做得到!通过对 $clientRealIP 这个变量的判断,Nginx就能实现隔山打牛的目的,而且规则简单易懂: #如果真实IP为 121.42.0.18、121.42.0.19,那么返回403 把这个保存为 deny.conf ,上传到 Nginx 的 conf 文件夹,然后在要生效的网站 server 模块中引入这个配置文件,并 Reload 重载 Nginx 即可生效: #禁止某些用户访问 |
| 本文出处: https://www.toutiao.com/a6732637362947359245/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|