#/bin/bash
#日志文件,可以根据需要改成你自己的路径
logfile=/www/wwwlogs/
#取出nginx一分钟内的日志
#Nginx日志格式:
# 192.168.0.161 - - [26/Mar/2015:14:29:20 +0800] "GET / HTTP/1.1" 200 2126 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36" -
#日志文件
#logfile=/data/logs/nginx/admin.kuaiyouxi.com.log
#开始时间
start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"`
echo "$start_time"
#start_time="14:29:20"
#结束时间
stop_time=`date +"%H:%M:%S"`
echo "$stop_time"
#stop_time="14:35:36"
#过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
tac $logfile/www.gwell.cc.log | awk -v st="$start_time" -v et="$stop_time" ' {t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}' |awk '{print $1}'|sort | uniq -c | sort -nr > $logfile/log_ip_top10
ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
ip=`cat $logfile/log_ip_top10 | awk '{if($1>100)print $2}'`
echo "一分钟内大于50次的IP"
echo "$ip"
# 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.txt,这里为了测试设置了2,你需要改成其它的数字
for line in $ip
do
echo $line >> $logfile/black.txt
if [ `/usr/bin/firewall-cmd --list-all|grep "$line"|wc -l` -ge 0 ]; then
/usr/bin/firewall-cmd --zone=public --add-rich-rule="rule family='ipv4' source address='$line' drop" --permanent
fi
done
/usr/bin/firewall-cmd --reload