iptables自动防御攻击

52 阅读1分钟
#!/bin/bash

nginxAccessLogFile=`cat /etc/nginx/nginx.conf | grep access_log | grep -v '#' | awk '{print $2}'`
# 判断nginx的access.log是否有设置
if [[ "$nginxAccessLogFile" = '' ]];then
        echo 'nginx access.log not found'
        exit
fi

# 获取今天日期(格式按access.log)
date=$(date +%d/%b/%Y:%H:%M)

# IP限流数,一分钟请求了一百次拉入黑名单
limit=100

# 检查最近的x条log
num=5000

# 统计每分钟请求数大于$num的IP
ips=$(tail -$num $nginxAccessLogFile | grep $date | awk -v li="$limit" '{a[$1]++}END{for(i in a)if(a[i]>li)print i}')
#echo $ips
# 加入黑名单
for ip in $ips;do
        if [[ $(iptables -vnL | grep $ip | wc -l) -eq 0 ]];then # 判断是否在规则中
                iptables -I INPUT -s $ip -j DROP # 加入drop规则
                echo "$(date +'%F_%T') $ip" >> ./drop_ip.log
        fi
done