通过查看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_waf