#!/bin/bash
# if [ ! -e "/etc/sysconfig/iptables" ]
iptables='/sbin/iptables'
if [ -z `command -v $iptables` ]
	then
	echo "服务器未安装iptables,无法拦截IP,脚本退出!"
	exit
fi
#要查询的网卡名,例: eth1
ip_suvan5=$1
#最大允许访问的端口种类数,超过就禁掉,默认20
ip_suvan6=$2
#自定义按顺序抓取包的数量,默认1000
ip_suvan7=$3
#最大允许ip出现的次数占已抓包总数的比例(如:0.7即占百分之70),超过就禁掉,默认500
# ip_suvan8=$4
if [ -z "$ip_suvan5" -a -z "$ip_suvan6" -a -z "$ip_suvan7" ]
	then
	ip_suvan5='eth1'
	ip_suvan6=20
	ip_suvan7=1000
	echo "因未输入参数,将使用默认参数启动,即:suvan.sh $ip_suvan5 $ip_suvan6 $ip_suvan7"
	echo '第一个参数值为要查询的网卡名,例: eth1'
	echo '第二个参数值为最大允许访问的端口种类数'
	echo '第三个参数值为按顺序抓取的包的数量'
	echo '拦截日志:/tmp/suvan_success.log'
	echo '正常访问过滤日志:/tmp/suvan_normal.log'
	echo ' '
	echo '脚本正在执行，请稍等···'
else if [ ! -z "$ip_suvan5" ] && [ -z "$ip_suvan6" -a -z "$ip_suvan7" ]
	then
	ip_suvan6=20
	ip_suvan7=1000
	echo "因未输入第二、三个参数,将使用默认参数启动,即:suvan.sh $ip_suvan5 $ip_suvan6 $ip_suvan7"
	echo '拦截日志:/tmp/suvan_success.log'
	echo '正常访问过滤日志:/tmp/suvan_normal.log'
	echo ' '
	echo '脚本正在执行，请稍等···'
else if [ -z "$ip_suvan7" ]
	then
	ip_suvan7=1000
	echo "因未输入第三个参数,将使用默认参数启动,即:suvan.sh $ip_suvan5 $ip_suvan6 $ip_suvan7"
	echo '拦截日志:/tmp/suvan_success.log'
	echo '正常访问过滤日志:/tmp/suvan_normal.log'
	echo ' '
	echo '脚本正在执行，请稍等···'
else
	echo "成功以自定义参数启动，即:suvan.sh $ip_suvan5 $ip_suvan6 $ip_suvan7"
	echo '拦截日志:/tmp/suvan_success.log'
	echo '正常访问过滤日志:/tmp/suvan_normal.log'
	echo ' '
	echo '脚本正在执行，请稍等···'
fi
fi
fi
tcpdump -i $ip_suvan5 -n -c $ip_suvan7 -w /tmp/suvan.log >/dev/null 2>& 1
if [ $? -eq 0 ]
	then
#将抓取的tcpdump日志用awk重组,保存文件以备使用
# tcpdump -r /tmp/suvan.log|awk '{print $3"\t"$5}'|grep -v '-'|grep -v '.com'|grep -v '.cn'|awk -F'.' '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"$9}'|awk '{print $1"."$2"."$3"."$4"\t"$6"."$7"."$8"."$9"\t"$10}' >/tmp/suvan1.log
#/** @Author: Suvan  @Description: 不计算端口种类，感觉没什么意义了  @DateTime: 2019-07-18 16:07:22 */
tcpdump -r /tmp/suvan.log|awk '{print $3}'|grep -v '[a-zA-Z-]'|awk -F'.' '{print $1"."$2"."$3"."$4}' >/tmp/suvan1.log
ip_suvan11=`ifconfig $ip_suvan5|grep 'inet addr:'|grep -v '127.0.0.1'|cut -d: -f2|awk '{print $1}'`
ip_suvan9=`cat /tmp/suvan1.log|wc -l`
ip_suvan10=`echo "scale=1;$ip_suvan9*0.7"|bc|awk -F'.' '{print $1}'`
#默认取发包大于20个的ip,避免循环正常访问的ip,降低服务器资源使用率
#/** @Author: Suvan  @Description: 不计算端口种类，感觉没什么意义了  @DateTime: 2019-07-18 16:07:22 */
# ip_suvan=`cat /tmp/suvan1.log|grep -v '[a-zA-Z]'|awk '{print $1}'|grep -v $ip_suvan11|sort -r|uniq -c|awk '$1>20 {print $2}'`
ip_suvan=`cat /tmp/suvan1.log|grep -v $ip_suvan11|sort -r|uniq -c|awk '$1>20 {print $2}'`
if [ -z $ip_suvan ]
	then
	echo `date|awk '{print $6"-"$2"-"$3"-"$4}'`  服务器运行正常,无DDOS攻击~ >>/tmp/suvan_normal.log
else
#for循环开始
	for n in $ip_suvan
	do
#ip($n)访问本地的端口种类数
ip_suvan1=`cat /tmp/suvan1.log|grep $n|awk '{print $3}'|sort -r|uniq|wc -l`
#查出发包的ip($n)在1000个包中出现的次数
ip_suvan2=`cat /tmp/suvan1.log|grep $n|awk '{print $1}'|wc -l`
#在iptables中查找ip($n)是否存在
ip_Suvan3=`grep $n /etc/sysconfig/iptables`
#默认不允许超过50种端口数跟500次的出现次数
if [ "$ip_suvan1" -gt $ip_suvan6 -o "$ip_suvan2" -gt $ip_suvan10 ] && [ -z $ip_Suvan3 ]
	then
	$iptables -A INPUT -s $n/32  -p tcp -j DROP
	$iptables -A OUTPUT -d $n/32 -j REJECT
	/etc/init.d/iptables save
	echo `date|awk '{print $6"-"$2"-"$3"-"$4}'`  IP:$n 因访问服务器端口的种类数大于"$ip_suvan6"\(实际:$ip_suvan1\)或该ip出现的次数大于"$ip_suvan10"\(实际:$ip_suvan2\),已成功加入iptables规则! >>/tmp/suvan_success.log
	else
	echo `date|awk '{print $6"-"$2"-"$3"-"$4}'`  IP:$n 因访问服务器端口的种类数少于"$ip_suvan6"\(实际:$ip_suvan1\)或该ip出现的次数少于"$ip_suvan10"\(实际:$ip_suvan2\)或者已在iptables中存在,自动忽略! >>/tmp/suvan_normal.log
	fi
done
fi
fi
ip_suvan12=$(cd `dirname $0`;pwd)/$(basename $0)
echo '若发现此处有报错,是脚本加密后导致,不影响脚本正常运行,可以忽略'
ip_suvan13="*/5 * * * * sh $ip_suvan12 $ip_suvan5 $ip_suvan6 $ip_suvan7 >/dev/null 2>& 1"
ip_suvan15="0,5,10,15,20,25,30,35,40,45,50,55 * * * * sh $ip_suvan12 $ip_suvan5 $ip_suvan6 $ip_suvan7 >/dev/null 2>& 1"
echo ' '
echo "脚本执行成功!"
echo "如果第一次使用,请将  $ip_suvan13  写入crontab"
echo "若因unix系统差异,导致不能实现每5分钟执行一次,可换成:"
echo "$ip_suvan15"