#!/bin/bash
#根据并发连接数,将短时间内PV大于100的封掉,计划任务每三分钟
#environment variable
source /etc/profile
iplist=`netstat -ntu | awk '{print $5}'| cut -d':' -f1| sort |uniq -c | sed 'N;$d;P;D' | awk '{if($1>100)print $2}'`
for ip in $iplist
do
iptables -I INPUT -s $ip -j DROP
echo "$ip is drop!" >> ./drop.log
#这里也可以给管理员发送邮件通知
awk '{a[$1]++}END{for (b in a) print b,a[b] }' $1 > /tmp/access.log
exec < /tmp/access.log
while read line
do
ip=`echo $line|awk '{print $1}'`
count=`echo $line|awk '{print $2}'`
if [ $count -gt 500 ]
then
iptables -I INPUT -s $ip -j DROP
if [ -d /tmp/`date +%F` ]
then
echo "$ip is drop!" >> /tmp/`date +%F`/drop`date +%F-%H`.log
#这里也可以给管理员发送邮件通知
else
mkdir /tmp/`date +%F`
echo "$ip is drop!" >> /tmp/`date +%F`/drop`date +%F-%H`.log
#这里也可以给管理员发送邮件通知
fi
fi
done
sleep 3600
done
#根据并发连接数,将短时间内PV大于100的封掉,计划任务每三分钟
#environment variable
source /etc/profile
iplist=`netstat -ntu | awk '{print $5}'| cut -d':' -f1| sort |uniq -c | sed 'N;$d;P;D' | awk '{if($1>100)print $2}'`
for ip in $iplist
do
iptables -I INPUT -s $ip -j DROP
echo "$ip is drop!" >> ./drop.log
#这里也可以给管理员发送邮件通知
done
----------------------------------------------------------------------------------------------------------
#!/bin/bash
# 执行脚本后,每小时自动找访问日志$1循环一次,访问日志也需要按每小时切割一下,
# sh while_ip.sh access_nginx.log
while true
doawk '{a[$1]++}END{for (b in a) print b,a[b] }' $1 > /tmp/access.log
exec < /tmp/access.log
while read line
do
ip=`echo $line|awk '{print $1}'`
count=`echo $line|awk '{print $2}'`
if [ $count -gt 500 ]
then
iptables -I INPUT -s $ip -j DROP
if [ -d /tmp/`date +%F` ]
then
echo "$ip is drop!" >> /tmp/`date +%F`/drop`date +%F-%H`.log
#这里也可以给管理员发送邮件通知
else
mkdir /tmp/`date +%F`
echo "$ip is drop!" >> /tmp/`date +%F`/drop`date +%F-%H`.log
#这里也可以给管理员发送邮件通知
fi
fi
done
sleep 3600
done