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