跳转至

62. 脚本:解决ddos攻击

10. 解决DOS攻击

请根据web日志或者网络连接数,监控当某个IP并发链接数或者短时间内PV达到100,即调用防火墙命令封掉对应的IP。

防火墙命令为:iptables -I INPUT -s IP -j DROP

思路分析

1.封IP命令
iptables -I INPUT -s IP -j DROP

2.web日志活网络链接数
netstat -an|grep -i est

3.判断pv或者链接数大于100,取出IP封掉

脚本

#!/bin/bash
awk '{S[$1]++}END{for(key in S) print S[key],key}' access.log |sort -rn |head >/tmp/ip.log
while read line
do
    if [ `echo $line |awk '{print $1}'` -gt 100 ];then
        iptables -I INPUT -s `echo $line|awk '{print $2}'` -j DROP && \
        echo "echo $line |awk '{print $2}'" >>/tmp/drop.log
    else
        echo "echo $line|awk '{print $2}'" >>/tmp/accept.log
    fi
done </tmp/ip.log

改造

#!/bin/bash
awk '{S[$1]++}END{for(key in S) print S[key],key}' access.log |sort -rn |head >/tmp/ip.log
while read line
do
    ip=`echo $line |awk '{print $2}'`
    count=`echo $line |awk '{print $1}'`
    if [ $count -gt 35 -a `grep "$ip" /tmp/drop.log|wc -l` -lt 1 ];then
        iptables -I INPUT -s $ip -j DROP && \
        echo "$ip" >>/tmp/drop.log
    else
        echo "$ip" >>/tmp/accept.log
    fi
done </tmp/ip.log

方法2

#!/bin/bash
awk '/ESTAB/{print $0}' netstat.log |awk -F "[ :]+" '{print $(NF-3)}' |sort |uniq -c |sort -rn |head >/tmp/ip.log
while read line
do
    ip=`echo $line|awk '{print $2}'`
    count=`echo $line|awk '{print $1}'`
    if [ $count -gt 100 -a `grep "$ip" /tmp/drop.log |wc -l` -lt 1 ];then
        iptables -I INPUT -s $ip -j DROP
        echo $ip >>/tmp/drop.log
    else
        echo $ip >>/tmp/accept.log
    fi
done</tmp/ip.log

最后更新: 2022-02-19 13:59:07