DOS攻击会大量给服务器发出请求,三次握手的第二次服务器给予响应,但客户端不确认,服务器一直在等待超时时间,大量IP以此类推去访问服务器那么将会导致服务器性能大大降低,此脚本就是要将这类短时间内访问极其频繁的IP 找出来,加入防火墙限制访问,减少服务器压力
java网站为例,先来查看tomcat访问日志,192.168.1.6是我客户端IP,后面是访问时间,url 和 状态码

思路:
我们可以根据自己需求来设立条件,如想要多久时间内的恶意IP,并且针对于uRL等,利用grep
主要的一步在于用awk 把恶意IP过滤出来,还是之前多次用过的定义数组,利用awk数组特性(键值对)
来求出恶意IP。
awk -F" " -v NUMBER=$NUMBER '{a[$1]++}END{for (i in a) if(a[i]>$NUMBER) print i}')
number是我们自定义的访问次数,当找出的IP超过这个数,视为恶意IP;如果针对url,在grep 设条件。
要用到的awk语法解读:
a[$1]++ 是以$1为键存入数组中,++ 代表每遇到一次相同的$1,长度加1,继续向下查找,也实现了一个去重,这样轻易就能求出 ,同一个IP出现了多少次。 a[i]--键,打印出次数;i --值,打印出IP。

脚本如下:
#!/bin/bash
LOG_DIR=/usr/local/tomcat/logs
LOG_NAME=localhost_access_log.2020-11-05.txt
DATE=$(date +%d/%b/%Y:%H:%M)
NUMBER=20
GONGJI_IP=$(tail -n100 $LOG_DIR/$LOG_NAME|grep $DATE |awk -F" " -v NUMBER=$NUMBER '{a[$1]++}END{for (i in a) if(a[i]>$NUMBER) print i}')
for ip in $GONGJI_IP
do
if [ $(iptables -L -nv|grep -c $ip) -eq 0 ];then
iptables -I INPUT -s$ip -j DROP
echo -e "$(date +%F_%T)---- $IP">>/root/drop_ip.log
fi
done
if [ $? -eq 0 ];then
echo "脚本运行完成"
exit
else
echo "脚本运行失败"
exit
fi
网友评论