shell脚本+iptables+crontab防ddos

近期发现有一个ip不停的刷我们网站各种页面静态资源,平均每分钟刷了三五千次,于是乎心血来潮写了这个脚本。网站查了很久都说iptables没法直接达到这种需求,索性就自己来写脚本了。脚本没有注意格式,因为我的习惯强行加格式更难查看格式对不对。

1、iptables添加自定义链:
iptables -N DDOS

2、编写脚本内容如下:
vim /mnt/auto_ddos.sh
#!/bin/bash
#获取access日志每分钟单个ip访问次数超过500次的ip,并将此ip加入iptables,24小时后解封

log_path=/alidata/weblogs/access/www.xxx.com_access.log #nginx的access日志路径
month=env LANG=en_US.UTF-8 date|awk '{print $2}' #获取当月月份,以英文显示,因为日志时间格式月份是这个格式
date=date +%d/${month}/%Y:%H:%M #日志时间格式,到分钟
grep “${date}” ${log_path}|awk ‘{print $1}’|sort |uniq -c|sort -nr|grep -v 184.109.153.13 >/mnt/number_ip.txt #获取单个ip单分钟访问次 数,184.109.153.13是公司公网ip,不能封自己
line=cat /mnt/number_ip.txt|wc -l #获取当前分钟访问ip个数
for line in seq $line
do
number_ip=sed -n ${line}p /mnt/number_ip.txt #访问次数 访问的ip
number=sed -n ${line}p /mnt/number_ip.txt|awk '{print $1}' #访问次数
ip=sed -n ${line}p /mnt/number_ip.txt|awk '{print $2}' #访问的ip
time_new=date +%s #当前时间
if [ ${number} -gt 500 ];then #如果当前分钟访问次数超过500次
/sbin/iptables -nL DDOS|grep ${ip} #防火墙还没有加入这个ip
if [ $? != 0 ];then
iptables -A DDOS -s ${ip} -j DROP #那就将这个ip加入防火墙封掉
grep ${ip} /mnt/ip_ddos.txt #已经封掉的ip所在文件内查找是否有这个ip
if [ ?!=0];thenecho"? != 0 ];then echo "{time_new} ${ip}" >>/mnt/ip_ddos.txt #如果没有就将当前时间和这个ip写入文件记录下来
fi
fi
fi
done

#24小时后解封ip
line=cat /mnt/ip_ddos.txt|wc -l #计算已经封掉的ip总数
for line in seq $line
do
time_old=sed -n ${line}p /mnt/ip_ddos.txt|awk '{print $1}' #获取ip被封的时间
time_new=date +%s #获取当前时间
time_finish=echo $((time_new-time_old)) #计算被封时间到现在是否过了24小时
ip=sed -n ${line}p /mnt/ip_ddos.txt|awk '{print $2}' #获取被封的ip
if [ ${time_finish} -gt 86400 ];then #如果被封的时间超过24小时
/sbin/iptables -nL DDOS|grep ${ip} #并且他还在防火墙里面待着
if [ $? = 0 ];then
iptables -D DDOS -s KaTeX parse error: Expected 'EOF', got '#' at position 21: …-j DROP #̲那么就让他重获自由 sed -…{ip}/d" /mnt/ip_ddos.txt #并且在已经被封的ip列表将他除名
fi
fi
done

3、编写定时任务:
crontab -e

          • sleep 58;/bin/sh /mnt/auto_ddos.sh
            因为定时任务每分钟执行的话都是第0-1秒开始执行的,所以我们先sleep 58秒,到每分钟的第59秒执行这个脚本,这样才能获取当前分钟的单个ip访问次数的总和是最大的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章