Защищаем сервер от атаки DNS Amplification с помощью fail2ban

Наверное, каждый владелец и арендатор серверов, которые обслуживают доменные зоны, рано или поздно сталкивается с атакой «DNS усиление» и ее негативными последствиями: жалобами и резким увеличением исходящего трафика, — это потеря времени и денег. Описание атаки и методы защиты описаны на данном сайте, я же хочу предложить свой вариант защиты.

Установка и настройка необходимого ПО


Устанавливаем необходимый софт:
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 создаем файл iptables-ipset.conf со следующим содержимым:
[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
Tags:
dns, dos, dns amplification, iptables, fail2ban, ipset, linux, firewall

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.