ddos.sh

脚本下载   ddos.zip

切记先把一些连接数很高,但属于正常连接的IP写入白名单文件中。

适用环境:redhat/centos/suse等linux环境


#!/bin/bash
#Author:haibing
#Website:haibing.org
#Created Time:2016-3-8
#防止DDOS脚本:放到crontab中定时执行
#需要设置一下连接数大于多少被禁用,禁用多长时间

head()
{
 echo "DDOS-0.2"
 echo "Copyright (C) haibing.org <181322616@qq.com>"
}

#一个IP大于多少连接数才记录(有的一个两个的就没必要记录,全部记录比较浪费资源)
minnum="1"
#一个IP大于多少连接数将被限制
num="10"
#防火墙禁用条数最大值
maxnum="1000"
#当防火墙达到禁用条数最大值时,一次删除iptables表中的被禁IP条数
delnum="10"
#限制多长时间(单位:秒) 这个时间要大于cron定时运行的时间才有好效果
delay="100"
#当前服务器的外网IP,用来过滤IP,只查找连接这个外网IP的地址,这样可以排除一些内网的过多正常连接
webip="222.10.22.2:80"
dir=$(cd $(dirname $0);pwd)
#用于每次检测ip连接数,临时保存数据
dosiptmp="$(mktemp /tmp/dosip.XXXXXXXX)"
#用于检测ip时间是否到了解禁时间,检测完哪一条就删除哪一条
iptimetmp="$dir/iptime_$(date +%Y-%m-%d).txt"
#用于保存汇总数据
dosip="$dir/dosip_$(date +%Y-%m-%d).txt"
iptables_log="$dir/iptables_conf.log"
#白名单
white=$dir/whitelist
#黑名单
black=$dir/blacklist
########################################

head

#备份当前防火墙配置
/sbin/iptables-save > ${iptables_log}
if [ ! -f /etc/sysconfig/iptables.bak ];then
 cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak
fi

#读取获取到的IP
#时间戳相减,大于设置的时间即清除这个IP,取消禁用
if [ -f $iptimetmp ];then
cat $iptimetmp|while read i ip time
do
 if [ ${i:0:1} = "#" -o "$i"x = ""x ];then
 continue
 fi
 if [ $(($(date +%s) - $time)) -gt $delay ];then
 if [ "$(/sbin/iptables -L -n|grep $ip)"x != ""x ];then
 /sbin/iptables -D INPUT -s $ip -j DROP
 fi
 sed -i "/$ip $time/ d" $iptimetmp
 fi
done
fi

#查看是否有黑名单,黑名单里的IP一直保持禁用状态
if [ -f $black ];then
 cat $black|while read ip
 do
 if [ "$(/sbin/iptables -L -n|grep $ip)"x = ""x ];then
 /sbin/iptables -I INPUT -s $ip -j DROP
 fi
 done
 fi

#如果iptables中有白名单的IP,先清除掉
if [ -f $white ];then
cat $white|while read whiteip
do
 ipnum=$(/sbin/iptables -L -n|grep $whiteip|wc -l)
 if [ $ipnum -gt 0 ];then
 for ((i=0;i<$ipnum;i++)) 
 do
 /sbin/iptables -D INPUT -s $whiteip -j DROP
 done
 fi
done
fi

#如果iptables列表大于多少后,可以删除一些最早以前被禁的IP
if [ $(/sbin/iptables -L|grep DROP|wc -l) -gt $maxnum ];then
    if [ -f $dosip ];then
        head -n $delnum $dosip|while read i ip date
        do
            if [ ${i:0:1} = "#" -o "$i"x = ""x ];then
                continue
            fi
            /sbin/iptables -D INPUT -s $ip -j DROP
        done
    fi
    if [ -f $black ];then
    cat $black|while read ip
     do
       if [ "$(/sbin/iptables -L -n|grep $ip)"x = ""x ];then
       /sbin/iptables -I INPUT -s $ip -j DROP
       fi
    done
    fi
fi

#获取连接IP
echo "##$(date)" > $dosiptmp
netstat -nt |grep $webip |awk '{print $5}' |sed 's/::ffff://g'| cut -d: -f1 | sort | uniq -c | sort -nr |grep -v servers|grep -v Address|grep -v 0.0.0.0 |grep -v 127.0.0.1 |grep -v $webip | awk '{if ($1>'"$minnum"') {print $0,'"$(date +%s)"'}}' >> $dosiptmp

#假如没有获取到IP退出
if [ ! -f $dosiptmp -o $(cat $dosiptmp|wc -l) -lt 2 ];then
 rm -f $dosiptmp
 exit
fi

#把白名单在获取的IP注释掉
if [ -f $white ];then
cat $white|while read whiteip
do
 sed -i "/$whiteip/ s/^/#/g" $dosiptmp
done
fi


#根据读取到的IP连接数进行禁用
cat $dosiptmp|while read i ip time
do
 if [ ${i:0:1} = "#" -o "$i"x = ""x ];then
 continue
 fi

 if [ $i -gt $num ];then
 /sbin/iptables -I INPUT -s $ip -j DROP
 fi
done

cat $dosiptmp >> $iptimetmp
sed -i "/^#/ d" $iptimetmp
cat $dosiptmp >> $dosip
rm -f $dosiptmp




发表评论