防范爬虫流量攻击:Nginx限制同时段IP访问数量和频率
最近网站遭受爬虫攻击,经常出现CPU和带宽100%跑满,服务器陷入假死的状态,虽然持续时间不长,每次5分钟左右,或者重启nginx可恢复,但是架不住太过频繁,一天要搞十多次,也是恼火。排查日志发现,有大量的同网段IP频繁请求网络资源,尝试了封禁IP,效果并不大,对方会更换新的IP,求助网警,答复是攻击者IP为虚拟IP,无法定位。实在没办法,网络防火墙价格又太贵,只能通过nginx的基础功能,看能不能解决。网上查了一下,找到了如下解决方案。
主要用到了nginx的ngx_http_limit_conn_module和ngx_http_limit_req_module两个配置:
ngx_http_limit_conn_module:限制并发连接数;
ngx_http_limit_req_module:限制一段时间内同一IP的访问频率;
首先,我们为了防止别人来攻击,或者访问量异常过高导致服务器崩掉,就需限制访问量,如果是一瞬间的并发访问,那么我们就需要限制一秒之内的并发连接数,此时就需要用到第一个配置,可以写在nginx.conf文件里:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
#定义一个名为addr的limit_req_zone用来存储session,大小是10M内存
#以$binary_remote_addr 为key
#且只能放在http{}代码段.
server {
location / {
limit_conn addr 2; #连接数限制
#设置给定键值的共享内存区域和允许的最大连接数。超出此限制时,服务器将返回503(服务临时不可用)错误.
#如果区域存储空间不足,服务器将返回503(服务临时不可用)错误
}
}
}
上面的配置能达到的效果就是,一瞬间访问的时候,只会有100个IP能得到响应,后面的IP直接就返回503状态。
其次,如果一个IP能访问到服务器,那么它如果疯狂的调用接口,最后可能导致将服务器的带宽耗尽,从而导致服务器假死崩溃,此时就需要用到第二个配置:
http{
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr为key,限制平均每秒的请求为100个,
#1M能存储16000个状态,rate的值必须为整数,
#如果限制1分钟100个请求,可以设置成100r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=5000r/m;
server{
location / {
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
limit_req zone=allips burst=100 nodelay;
}
}
}
此时能达到的效果,同一个用户机在1分钟内可以访问5000个资源,如果1秒内超过了2个并发连接,后面的也是直接返回503。
注意:如果网站规模不大,设置 limit_conn addr 2足够,即允许同一客户机2个并发连接请求。如果页面资源较多,比如首页network里面有200个资源,可以设置brust为100,这样2秒就可以全部请求通过。
附上比较理想的配置方案:
1、在nginx.conf文件里:
http {
#限制单IP并发量开始
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=allips:10m rate=5000r/m;
#limit_req_zone:请求频率
#$binary_remote_addr:以客户端IP进行限制
#zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
#rate=10r/s:表示客户端的访问频率为每秒10次
#限制单IP并发量结束
}
2、在具体网站的.conf文件里:
server {
#限制单IP并发量开始
limit_connaddr2;
limit_req zone=allips burst=100 nodelay;
#burst:如果请求的频率超过了限制域配置的值,请求处理会被延迟
#nodelay:超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这个请求会被终止,并返回503
#限制单IP并发量结束
}
页:
[1]