基于Nginx实现限制某IP短时间访问次数

基于Nginx实现限制某IP短时间访问次数,第1张

基于Nginx实现限制某IP短时间访问次数

本文详细介绍了如何根据Nginx限制一个IP的短期访问频率。原文根据示例代码非常详细,对大家的学习培训或者工作都有一定的参考价值,朋友们一定要参考。

如何设置某个IP在某段时间内的访问频率是一个很头疼的问题,尤其是在蓄意ddos攻击的情况下。其中CC攻击(ChallengeCollapsar)是DDOS(分布式系统拒绝服务攻击)的一种,也是一种常见的网站攻击方式。网络攻击根据服务器代理或者吃肉的鸡不断向受害服务器发送很多数据文件,导致对方服务器空耗尽,直至服务器崩溃。

cc攻击一般是利用相对有限的ip数量频繁地向网络服务器传输数据,以达到攻击的目的。nginx可以根据HttpLimitReqModul和HttpLimitZoneModule的配置,限制同一时间范围内ip的访问频率,防止cc攻击。

HttpLimitReqModul是用于限制单位时间内连接数的控制模块。limit_req_zone和limit_req命令一起用于限制连接数。一旦高并发join超过一定总数,就会返回503服务不可用。

HttpLimitConnModul用于限制单个ip的高并发连接数,应用limit_zone和limit_conn命令。

两个控制模块的区别,HttpLimitReqModul是一段时间内连接数的限制,HttpLimitConnModul是同时连接数的限制。

httplimitreqmodul在一定时间内限制ip访问次数的情况

http{ ... #界定一个名叫allips的limit_req_zone用于储存session,尺寸是10M运行内存, #以$binary_remote_addr为key,限定均值每秒钟的请求为20个, #1M能储存16000个情况,rete的值务必为整数金额, #假如限定几秒钟一个请求,能够设定成30r/m limit_req_zone$binary_remote_addrzone=allips:十米rate=20r/s; ... server{ ... location{ ... #限定每ip每秒钟不超过20个请求,漏桶数burst为5 #brust的含意便是,假如第1秒、2,3,4秒请求为19个, #第5秒的请求为25个是被容许的。 #可是假如你第1秒就25个请求,第二秒超出20的请求回到503错误。 #nodelay,如果不设定该选择项,严苛应用平均速率限定请求数, #第1秒25个请求时,五个请求放进第二秒实行, #设定nodelay,25个请求将在第1秒实行。 limit_reqzone=allipsburst=5nodelay; ... } ... } ... }

HttpLimitZoneModule有限的高并发连接数情况

limit_zone只能在http作用域中定义,limit_conn可以在http服务器位置作用域中定义。

http{ ... #界定一个名叫one的limit_zone,尺寸10M运行内存来储存session, #以$binary_remote_addr为key #nginx1.18之后用limit_conn_zone更换了limit_conn #且只有放到http作用域 limit_conn_zoneone$binary_remote_addr十米; ... server{ ... location{ ... limit_connone20;#连接数限定 #带宽控制,对单独联接限数,假如一个ip2个联接,便是500x2m limit_rate500k; ... } ... } ... }

nginx授权管理设置

上述配置将限制所有ip。在某些情况下,我们不期望限制搜索引擎蜘蛛或搜索引擎的自检测ip。
对于特殊授权管理ip,我们可以依靠geo命令。

1.

http{ geo$limited{ default1; #google 64.233.160.0/190; 65.52.0.0/140; 66.102.0.0/200; 66.249.64.0/190; 72.14.192.0/180; 74.125.0.0/160; 209.85.128.0/170; 216.239.32.0/190; #M$ 64.4.0.0/180; 157.60.0.0/160; 157.54.0.0/150; 157.56.0.0/140; 207.46.0.0/160; 207.68.192.0/200; 207.68.128.0/180; #yahoo 8.12.144.0/240; 66.196.64.0/180; 66.228.160.0/190; 67.195.0.0/160; 74.6.0.0/160; 68.142.192.0/180; 72.30.0.0/160; 209.191.64.0/180; #MyIPs 127.0.0.1/320; 123.456.0.0/280;#exampleforyourserverCIDR }

geo命令定义了授权管理$limited的独立变量,初始值为1。如果手机客户端的ip属于上述类别,则$limited的值为0。

2.使用map命令将搜索引擎的手机客户端的ip映射为空的字符串。如果不是因为搜索引擎,信息本身的ip就会显示出来,这样搜索引擎ip就无法存储在limit_req_zone运行内存会话中,所以限制搜索引擎的ip访问并不容易。

map$limited$limit{
1$binary_remote_addr;
0"";
}

3.设置limit_req_zone和limit_req

limit_req_zone$limitzone=foo:1m速率=10r/m;

limit_reqzone=fooburst=5;

最后,我们应用ab压php-fpm的方法来测试上述方法的实际效果。

示例:一分钟内只允许一个ip访问60台设备,即平均每秒一台设备

首先,提前准备一个php脚本,放在根目录$document_root

test.php

<?
for($I=0;$i<1000;$I)
echo‘HelloWorld’;
?>

nginx配有提升limit_req_zone和limit_req。

http{ ... limit_req_zone$binary_remote_addrzone=allips:十米rate=60r/m; ... server{ ... location{ ... limit_reqzone=allips; ... } ... } ... } #ab-n5-c1http://blog.rekfan.com/test.php 127.0.0.1--[22/Dec/2012:06:27:060000]"GET/test.phpHTTP/1.0"20011000"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:06:27:060000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:06:27:070000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:06:27:070000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:06:27:070000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6"

如果brust和nodelay没有设置,可以看到这个设备每秒只允许访问一次,超出的请求会返回503服务不可用。

http{ ... limit_req_zone$binary_remote_addrzone=allips:十米rate=60r/m; ... server{ ... location{ ... limit_reqzone=allipsburst=1nodelay; ... } ... } ... } #ab-n5-c1http://blog.rekfan.com/test.php 127.0.0.1--[22/Dec/2012:07:01:000000]"GET/test.phpHTTP/1.0"20011000"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:07:01:000000]"GET/test.phpHTTP/1.0"20011000"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:07:01:010000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:07:01:010000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6" 127.0.0.1--[22/Dec/2012:07:01:010000]"GET/test.phpHTTP/1.0"503537"-""Rekfan_Server/1.2.6"

设置brust=1和nodelay后,允许在第一秒内解决2个请求。

文章里的内容就这些了。期待对大家的学习和培训有所帮助,也期待大家的应用。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/774024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存