Скрипт от DDOS

Приведу пример простого скрипта против DDOS атак для NAT серверов.
Скрипт выполняется когда общее число «conntrack» соединений больше 500000, сохраняет в текстовый файл IP-адреcа у которых больше всего «conntrack» соединений, у кого больше 10000 — добавляет в ipset список.

Содержимое скрипта:

#!/bin/bash

count=`cat /proc/sys/net/netfilter/nf_conntrack_count`

if (($count > 500000));
then
    /usr/sbin/conntrack -L | awk '{if ($5 ~ /src/) print $5; else if ($4 ~ /src/) print $4}' | sed "s/src=/ /g" | sort | uniq -c | sort -n | tail -n10 > /var/log/ddos.log

    tracks=($(awk '{print $1}' /var/log/ddos.log))
    ips=($(awk '{print $2}' /var/log/ddos.log))
    for i in seq 0 9;
    do
        if ((${tracks[$i]} > 10000));
        then
         /sbin/ipset -A ddos ${ips[$i]}
        fi
    done
fi
exit 0

Соответственно должен быть создан ipset список, например с таймаутом 10 минут по истечении которых IP адрес автоматически удалится из списка.

/sbin/ipset -N ddos iphash timeout 600

Ну и запретим FORWARD всем кто в ipset списке:

/sbin/iptables -A FORWARD -m set --match-set ddos src -j DROP

Смотрите также мою статью:
Как обнаружить DDOS атаки

Did my article help you? How about buying me a cup of coffee as an encouragement? Buy me a coffe.

Вливайтесь в общение

1 комментарий

Добавить комментарий

  1. Прикольно, я получше сделал
    #!/bin/bash
    ournet=»10.10.10.0/19″
    out=`conntrack -L |awk ‘{if ($5 ~ /src/) print $5; else if ($4 ~ /src/) print $4}’ | sed «s/src=/ /g» | sort | uniq -c | sort -n | tail -n10`
    cnt=`conntrack -C`
    log_d=»/var/log/ddos»
    echo «$out»|while read a b; do
    if [ «$a» -gt 100000 ]; then
    res=`/var/scripts/netmatcher.sh «$ournet» «$b»`
    if [ «$res» = 0 ]; then
    echo `date +%d/%m/%Y\ %T` — total records: «$cnt», ip count: «$a», address: «$b» is in our network blockspase, skipping >> «$log_d»/ddos.log
    else
    TZ=UTC tcpdump -ttttnvvvi eth3 -A -s 0 host «$b» -c 100 -w «$log_d»/»$b»_`date +%d/%m/%Y\ %T`.pcap
    echo `date +%d/%m/%Y\ %T` — total records: «$cnt», ip count: «$a», address: «$b» is not in our network blockspase, adding to ipset >> «$log_d»/ddos.log
    ipset add ddos «$b»/32
    fi
    fi
    done

    Здесь у меня еще самописный netmatcher.sh, чтобы свои сети не забанить