- 每分钟查一下过去1分钟的日志,对IP进行分析,将访问量大于400的给封掉
- 每隔半小时针对过去半小时以来的被封的IP进行分析,如果不再有数据包过来,则解封
- 将该脚本添加到计划任务即可,设置每分钟执行一次
bash 代码:#! /bin/bash
#定义1分钟以前的时间,用于过滤1分钟以前的日志
t1=`date -d "-1 min" +%Y:%H:%M`
log=/var/log/nginx/access.log
block_ip()
{
egrep "$t1:[0-5]+" $log > /tmp/tmp_last_min.log
#把1分钟内访问量高于400的ip记录到一个临时文件中
# 过滤掉白名单IP(81.123.35.11)
awk '{print $1}' /tmp/tmp_last_min.log|grep -v '81.123.35.11' |sort -n |uniq -c|sort -n |awk '$1>400 {print $2}' > /tmp/bad_ip.list
#计算ip的数量
n=`wc -l /tmp/bad_ip.list|awk '{print $1}'`
#当ip数大于0时,才会用iptables封掉它
if [ $n -ne 0 ]
then
for ip in `cat /tmp/bad_ip.list`
do
/usr/sbin/iptables -I INPUT -s $ip -j DROP
done
#将这些被封的IP记录到日志里
echo "`date` 封掉的IP有:" >> /tmp/block_ip.log
cat /tmp/bad_ip.list >> /tmp/block_ip.log
fi
}
unblock_ip()
{
#首先将包个数小于5的ip记录到一个临时文件里,把它们标记为白名单IP
/usr/sbin/iptables -nvL INPUT|sed '1d' |awk '$1<5 {print $8}' > /tmp/good_ip.list
n=`wc -l /tmp/good_ip.list|awk '{print $1}'`
if [ $n -ne 0 ]
then
for ip in `cat /tmp/good_ip.list`
do
/usr/sbin/iptables -D INPUT -s $ip -j DROP
done
echo "`date` 解封的IP有:" >> /tmp/unblock_ip.log
cat /tmp/good_ip.list >> /tmp/unblock_ip.log
fi
#当解封完白名单IP后,将计数器清零,进入下一个计数周期
/usr/sbin/iptables -Z
}
#取当前时间的分钟数
t=`date +%M`
#当分钟数为00或者30时(即每隔30分钟),执行解封IP的函数,其他时间只执行封IP的函数
if [ $t == "00" ] || [ $t == "30" ]
then
unblock_ip
block_ip
else
block_ip
fi
已使用!
暂无点赞