Наверное, каждый владелец и арендатор серверов, которые обслуживают доменные зоны, рано или поздно сталкивается с атакой «DNS усиление» и ее негативными последствиями: жалобами и резким увеличением исходящего трафика, — это потеря времени и денег. Описание атаки и методы защиты описаны на данном сайте, я же хочу предложить свой вариант защиты.
Устанавливаем необходимый софт:
В /etc/fail2ban/jail.conf необходимо ввести следующие строки:
В /etc/fail2ban/action.d создаем файлiptables-ipset.conf со следующим содержимым:
Установка и настройка необходимого ПО
Устанавливаем необходимый софт:
sudo aptitude install fail2ban ipset logrotate
Настройка fail2ban
В /etc/fail2ban/jail.conf необходимо ввести следующие строки:
[named-antidos]
enabled = true
banaction = iptables-ipset
logpath = /var/log/iptables.log
filter = iptables-named
port = any
protocol = all
В /etc/fail2ban/action.d создаем файл
[Definition]
actionstart = ipset --create fail2ban- iphash
actionstop = ipset --flush fail2ban- ipset --destroy fail2ban-actionban = ipset --test fail2ban- || ipset --add fail2ban- actionunban = ipset --test fail2ban- && ipset --del fail2ban-
И в /etc/fail2ban/filter.d файл iptables-named.conf с содержимым
[Definition]
failregex = .* IPTables-Dropped: .* SRC= .*
ignoreregex =
На этом настройка fail2ban закончена. Перезапускаем демона командой:
sudo invoke-rc.d fail2ban restart
Настройка iptables
Добавляем правила командами:
sudo iptables -N bl
sudo iptables -A bl -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
sudo iptables -A bl -j DROP
sudo iptables -I INPUT -p udp --dport 53 -m recent --name ddns --set
sudo iptables -I INPUT -p tcp --dport 53 -m recent --name ddns --set
sudo iptables -I INPUT -p udp --dport 53 -m recent --name ddns --update --seconds 60 --hitcount 15 -j bl
sudo iptables -I INPUT -p tcp --dport 53 -m recent --name ddns --update --seconds 60 --hitcount 15 -j bl
sudo iptables -I INPUT -m set --match-set fail2ban-named-antidos src -j DROP
Настройка syslog
Теперь необходимо организовать вывод в лог от iptables в отдельный файл, чтобы не захламлять syslog. На примере rsyslog в /etc/rsyslog.conf добавляем строчку
kern.warning /var/log/iptables.log
И перезапускаем демон:
sudo invoke-rc.d rsyslog restart
Настройка logrotate
При интенсивных атаках с нескольких хостов, размер лог файла может разрастись до нескольких десятков мегабайт за сутки. Чтобы логи не забили все свободное дисковое пространство, создадим файл /etc/logrotate.d/iptables с содержимым:
/var/log/iptables.log
{
rotate 3
daily
missingok
notifempty
delaycompress
compress
postrotate
invoke-rc.d rsyslog rotate > /dev/null
endscript
}
Заключение
После вышеописанной настройке, трафик по DNS ответам упал с нескольких гигабайт в час до незначительных значений. Нагрузка так же незаметна.
iptables-ipset-proto4.conf на GitHub