屏蔽访问URL频繁的IP

2020-11-05  本文已影响0人  阿当运维

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

java网站为例,先来查看tomcat访问日志,192.168.1.6是我客户端IP,后面是访问时间,url 和 状态码


image.png

思路:
我们可以根据自己需求来设立条件,如想要多久时间内的恶意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。

如:-----------找出日志中访问IP超过100次的IP--------------- image.png

脚本如下:

#!/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
上一篇 下一篇

猜你喜欢

热点阅读