前段时间公司服务器被攻击,于是想弄一个这方面的脚本,于是便有了这个脚本。
刚开始走了不少弯路,后来发现linux系统自带的tcpdump这个命令很不错,不了解的童鞋可以直接找度娘~~
我的思路是这样:tcpdump随机抓取1000(或者自定义)个包,筛选出外部ip访问本机的端口及其ip,如果是正常访问,外部ip访问本服务器的端口按理来说不会太多,如果超过20(或者自定义)个,直接iptables禁掉,另外一个判断,随机按顺序抓取的1000(或者自定义)个包,我个人定义为同一ip数量超过70%(也可以自定义)就不正常了,我也在iptables中禁掉,这就是整个脚本的思路,剩下的就是脚本完善了~~
这里只贴出脚本的核心内容,有需要的童鞋,可以直接下载 若对这个脚本有一些建设性意见,随时欢迎M我。
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 #将抓取的tcpdump日志用awk重组,保存文件以备使用
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}'
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}' #默认取发包大于20个的ip,避免循环正常访问的ip,降低服务器资源使用率
if [ -z $ip_suvan ]
then
echo date|awk '{print $6"-"$2"-"$3"-"$4}' 服务器运行正常,无DDOS攻击~ >>/tmp/suvan_normal.log
else
for n in $ip_suvan #for循环开始
do
ip_suvan1=cat /tmp/suvan1.log|grep $n|awk '{print $3}'|sort -r|uniq|wc -l #ip($n)访问本地的端口种类数
ip_suvan2=cat /tmp/suvan1.log|grep $n|awk '{print $1}'|wc -l #查出发包的ip($n)在1000个包中出现的次数
ip_Suvan3=grep $n /etc/sysconfig/iptables #在iptables中查找ip($n)是否存在
if [ "$ip_suvan1" -gt $ip_suvan6 -o "$ip_suvan2" -gt $ip_suvan10 ] && [ -z $ip_Suvan3 ] #默认不允许超过50种端口数跟500次的出现次数
then
iptables -A INPUT -s $n/32 -p tcp -j DROP
iptables -A OUTPUT -d $n/32 -j REJECT
您可以选择一种方式赞助本站
支付宝扫一扫
微信扫一扫