统计
  • 建站日期:2019-12-01
  • 文章总数:2002 篇
  • 评论总数:2124 条
  • 分类总数:21 个
  • 最后更新:11月21日
文章 未分类

nginx禁止高频ip访问

程序员阿鑫
首页 未分类 正文

 
nginx禁止高频ip访问
-程序员阿鑫-带你一起秃头
-第1
张图片

通过查看nginx日子发现存在高频ip的访问,为保证服务的正常运行,当存在恶意ip访问时进行屏蔽访问。

一、nginx统计日志限制ip

  简单流程:查询最新的访问日志条数,匹配ip列进行排序,去重并统计,按从大到小排序。最后把超过限制的ip进写进nginx配置文件,重启nginx服务的方式进行403限制访问。

#count.txt ,配置文件后台控制,存放日志条数和最大访问数。
[root@localhost ~]# cat count.txt
[root@localhost ~]# 10000 100
#!/bin/bash
#limit_ip.sh
#desc:限制高频ip脚本
nginx_home=/usr/local/openresty/nginx
log_path=/usr/local/openresty/nginx/logs
count=`cat count.txt |awk '{print $1}'` #访问条数
rate=`cat count.txt |awk '{print $2}'`  #限制次数
tail -n $count $log_path/access.log 
 |awk '{print $1,$12}' 
 |grep -i -v -E "google|yahoo|baidu|sogou|360" 
 |awk '{print $1}'|sort|uniq -c|sort -rn 
 |awk '{if($1>$rate)print "deny "$2";"}' >$nginx_home/conf/vhost/blockip.conf
$nginx_home/sbin/nginx -s reload
[root@localhost ~]# cat nginx.conf
...
include ./vhost/blockip.conf;
...

[root@localhost ~]# cat blockip.conf
deny 10.0.0.1;
deny 10.0.0.2;
deny 10.0.0.3;
...

#定时器,5分钟调用一次
[root@localhost ~]# crontab -e
*/5 * * * * /data/shellscript/limit_ip.sh

二、nginx模块限制ip

#nginx.conf
http{
...

limit_req_zone $binary_remote_addr zone=limits:10m rate=50r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    limit_req zone=limits burst=50;

    limit_conn addr 100;
    limit_rate 100k;
}
...

}

limit_req_zone : 限制单位时间内的请求数

limit_req_conn : 限制同一时间内的连接(并发)数

超出限制会直接返货503错误。

limit_req_zone模块

limit_req_zone $binary_remote_addr zone=five:10m rate=50r/s;

$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。 

zone=limits:10m表示生成一个大小为10M,名字为limits的内存区域,用来存储访问的频次信息。 

rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

limit_req zone=limits burst=50;

第一个参数:zone=limits设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。 

 

第二个参数:burst=50,burst这个配置的意思是设置一个大小为50的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。 

limit_conn_zone模块

这里限制的是当前请求已经读取到请求头后的所有连接的ip。$binary_remote_addr zone=addr:10m;的意思同上。

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn limits 50;

限制limits区域每个IP只能发起一个并发连接。

limit_rate 100k 对每个连接限速100k。

详细参考:

http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

三、nginx+lua waf 限制ip

ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙。

 

github地址:https://github.com/loveshell/ngx_lua_wa

 

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
这篇文章最后更新于2021-9-10,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
PHP进行安全预防和阻止XSS跨站脚本攻击过滤(通用版)
« 上一篇
okhttp jar包_okhttp 网络框架的封装 easy-okhttp
下一篇 »

发表评论