!/bin/bash
#
根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
#
logfile=/data/log/access.log
显示一分钟前的小时和分钟
d1=date -d "-1 minute" +%H%M
d2=date +%M
ipt=/sbin/iptables
ips=/tmp/ips.txt
block()
{
将一分钟前的日志全部过滤出来并提取IP以及统计访问次数
grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips
利用for循环将次数超过100的IP依次遍历出来并予以封禁
for i in awk '$1>100 {print $2}' $ips
do
$ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT
echo "date +%F-%T
$i" >> /tmp/badip.log
done
}
unblock()
{
将封禁后所产生的pkts数量小于10的IP依次遍历予以解封
for a in $ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2<10 {print $1}'|sort -nr
do
$ipt -D INPUT $a
done
$ipt -Z
}
当时间在00分以及30分时执行解封函数
if [ $d2 -eq "00" ] || [ $d2 -eq "30" ]
then
要先解再封,因为刚刚封禁时产生的pkts数量很少
unblock
block
else
block
fi