最近服务器被恶意攻击,顾将这些访问次数达到一定数值的ip使用nginx做封禁ip的操作。本文将使用shell脚本分析nginx生成的日志,自动封单个ip访问量大于指定值。
因为需要分析nginx的日志,所以我们需要将nginx的日志进行分割处理,因为日志太大,消耗的系统资源也就越多。日志分割可以按天分割,也可以按小时分割。我们的access.log是按天进行分割的。
- 首先选择一个目录,新建一个blockip.conf配置文件,用于屏蔽ip的文件。
-
blockip.conf里面的内容即我们要屏蔽的ip,之后屏蔽的ip可以直接修改这个文件。内容格式为:
-
在nginx的nginx.conf中http段或者server段中引入拒绝访问的IP列表
include /etc/nginx/vhost/blockip.conf;
-
编写shell脚本
#!/bin/bash log_nginx="/var/log/nginx" block_file="/etc/nginx/vhost" #取出日志中符合条件的ip写入一个文件中 grep "api/v1" $log_nginx/access.log | awk '{print $1}' | sort -rn |uniq -c |awk '{print $2}' > $log_nginx/ip.txt for ip in `cat $log_nginx/ip.txt` do result=$(grep $ip $block_file/blockip.conf) #判断ip是否被屏蔽 if [ -z "$result" ]; then #计算出每个ip请求的次数 count=$(grep $ip $log_nginx/access.log|grep "api/v1"|wc -l) #请求次数大于等于100次就进行屏蔽 if [ $count -ge 100 ]; then echo "deny $ip;" >> $block_file/blockip.conf fi fi done # 重新加载nginx service nginx reload
-
写一个定时任务,自动执行脚本
# 设置5分钟执行一次 */5 * * * * /etc/nginx/vhost/untitled.sh #7天清空一次 0 0 */7 * * cat /data/null > /etc/nginx/vhost/blockip.conf
-
ip被封禁之后,效果如下:
附:
blockip.conf格式还有许多种,可以配置只允许的IP访问或者IP段访问:
#屏蔽单个IP
deny IP;
#允许一个ip
allow IP;
#屏蔽所有
deny all;
#允许所有
allow all;
屏蔽单个ip
deny 139.71.83.6
屏蔽整个ip段即从139.0.0.1到139.255.255.254
deny 139.0.0.0/8
屏蔽ip段即从139.71.0.1到139.71.255.254
deny 139.71.0.0/16
屏蔽ip段即从139.71.83.1到139.71.83.254
deny 139.71.83.0/24