Приведу пример простого скрипта против 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 атаки
Прикольно, я получше сделал
#!/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, чтобы свои сети не забанить