Назад | Перейти на главную страницу

заблокировать атаку DNS Amplification с помощью iptables

Последний раз у меня есть предупреждения об атаке DNS Amplification от NFOservers.com DDoS notifier

2015-12-30 23:28:52.609178 IP (tos 0x0, ttl 54, id 42635, offset 0, flags [+], proto UDP (17), length 1500) my.dns.ip.addr.53 > 63.251.20.x.18150: 41159| 20/0/1 cpsc.gov. MX hormel.cpsc.gov. 5, cpsc.gov.[|domain]                                    
2015-12-30 23:28:52.609632 IP (tos 0x0, ttl 54, id 42636, offset 0, flags [+], proto UDP (17), length 1500) my.dns.ip.addr.53 > 63.251.20.x.18150: 41159| 20/0/1 cpsc.gov. MX stagg.cpsc.gov. 5, cpsc.gov.[|domain]                                 ..
2015-12-30 23:28:52.610109 IP (tos 0x0, ttl 54, id 42637, offset 0, flags [+], proto UDP (17), length 1500) my.dns.ip.addr.53 > 63.251.20.x.18150: 41159| 20/0/1 cpsc.gov. MX hormel.cpsc.gov. 5, cpsc.gov.[|domain]

Для информации

my.dns.ip.addr.53 - мой VIP - внешний IP-адрес DNS

63.251.20.x.18150 - не знаю, что это за диапазон IP-адресов

Мой сервер должен предлагать рекурсивные запросы для внутренней сети компании, которую я настроил в разделе bind9:

 acl "trusted" {
 172.16.0.0/16;
 localhost;
 localnets;
 };
options {
...
allow-query { any; };
allow-recursion { trusted; };
allow-query-cache { trusted; };
...
}

Я также настроил RRL - Response Rate Limit:

rate-limit {
responses-per-second 5;
window 5;
};

Похоже, мой DNS-сервер (bind9) отклонял неверные запросы, как в журнале: http://pastebin.com/A3XGwh04

но я бы хотел заблокировать такие запросы с помощью iptables. Я бы провел небольшое исследование и нашел блок IPTABLES:

iptables -A INPUT  -p udp -m udp --dport 53 -m string --from 50 --algo bm --hex-string '|0000FF0001|' -m recent --set --name dnsanyquery --rsource
iptables -A INPUT  -p udp -m udp --dport 53 -m string --from 50 --algo bm --hex-string "|0000FF0001|" -m recent --name dnsanyquery --rcheck --seconds 10 --hitcount 1 -j DROP

но когда я тестирую свой сервер с тестовой машины с помощью команды: dig + nocmd @ my.ip.dsn.addr domain.com любой + многострочный + noall + ответ Я не получаю ответа от DNS, и, кроме того, журналы все еще полны запросов с cpsc.gov поэтому я решил вернуть свою конфигурацию iptables по умолчанию

При следующем исследовании я обнаружил, что настройки, сделанные conntrack, могут вызвать проблемы с NAT. Мой DNS настроен на NAT

При использовании другого соула, найденного здесь, по другим темам:

iptables -A INPUT -p udp --port 53 -m hashlimit --hashlimit 1/minute --hashlimit-burst 5 -j ACCEPT
iptables -A INPUT -p udp --port 53 -j DROP

получил nagios warrings - проблема с синхронизацией SOA, домен SLAVE не найден и т. д.

Моя следующая попытка:

iptables --insert INPUT -p udp --dport 53 -m string --from 40 --to 56 --algo bm --hex-string '|637073632e676f76|' -j DROP -m comment --comment "DROP DNS Q cpsc.gov"
iptables --insert INPUT -p udp --dport 53 -m string --from 40 --to 50 --algo bm --hex-string '|6370736303676f763f|' -j DROP -m comment --comment "DROP DNS Q cpsc.gov"
-A INPUT -p udp -m udp --dport 53 -m string --string "cpsc.gov" --algo bm --from 40 --to 50 -m comment --comment "DROP DNS Q cpsc.gov" -j DROP

но все еще запросы в журналах

Я все еще ищу решение, но, возможно, кто-то из присутствующих имеет большой опыт работы с такими атаками и может помочь мне заблокировать такие запросы, как: cpsc.gov

query-errors: info: client 93.48.40.139#54822 (cpsc.gov): rate limit drop REFUSED error response to 93.48.40.0/24

Любая помощь приветствуется.

Очень важно: Даже если я отключу рекурсию для ВСЕХ, мои журналы полны предупреждений вроде снижение предела скорости ОТКАЗАННЫЙ ответ на ошибку вот почему я хочу заблокировать его с помощью iptables.

Честно говоря, похоже, что ваш ACL работает как задумано:

query-errors: информация: клиент 93.48.40.139 # 54822 (cpsc.gov): сброс лимита скорости ОТКАЗАНО ответ на ошибку 93.48.40.0/24

Вы все еще получаете вопросы, но отказываетесь дать на них ответ. Код ограничения скорости вызывается, потому что запросы все еще поступают в большом объеме и должны быть отклонены сервером имен.

В остальном несколько вещей:

  • Не использовать rate-limit с рекурсивным сервером имен. Он не предназначен для использования с рекурсивными серверами имен и генерирует эти ненужные сообщения журнала. Это решает проблему спама в журнале.
  • iptables на самом деле не поможет с этим. Если ваша цель - добраться туда, где программа никогда не увидит запросы, даже если они будут отклонены с ответом REFUSED в любом случае, это сделано из лучших побуждений, но ошибочно. В любом случае вашему серверу придется обрабатывать запросы. Один из них заставляет ядро ​​отбрасывать трафик, другой позволяет программному обеспечению отбрасывать трафик.

Значение предотвращения обнаружения ложных запросов программным обеспечением в основном эстетическое. Большинство администраторов DNS не собираются тратить циклы ядра на то, что уже делает программное обеспечение. Независимо от того, отбрасываете ли вы трафик на полу с помощью брандмауэра или отправляете ОТКАЗАННЫЕ пакеты обратно, ваш сервер включен в список открытых преобразователей, и ботнеты вряд ли перестанут отправлять вам трафик.

Если вы действительно хотите, чтобы этот трафик уходил, настоятельно рекомендуется не предоставлять прослушиватель с выходом в Интернет на рекурсивном сервере, который обслуживает только ваши устройства. Таким образом, ваш DNS-сервер не иметь тратить ресурсы ЦП пользователя, отклоняя трафик, или ЦП ядра, отбрасывая трафик.

Даже если вы выполните это в качестве учебного упражнения или с целью вообще не отправлять ответные пакеты, это решение не масштабируется. Записи DNS, используемые в этих атаках, меняются каждый день, как и часто подделываемый IP-адрес.

Вы просили совета у людей, которые «[сталкивались] с такими атаками», и постоянный отказ от нежелательного трафика является нормальным явлением для DNS-сервера, подключенного к Интернету. Вдвойне для того, кто раньше был открытым решателем. Такой тип решения обычно используют администраторы. не делаю, хотя все равно желаю вам всего наилучшего.

Если вы хотите изучить ограничение скорости DNS и фильтрацию iptables, вы можете попробовать сделать что-то вроде этого.

Подробная информация о совпадении корневой строки фильтра любого / всего запроса находится здесь:
https://forums.centos.org/viewtopic.php?f=51&t=62148&sid=3687bf227875a582ba08964fca178dd2

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DNS_DROP - [0:0]
:DYN_DROP - [0:0]

-A PREROUTING -i lo -j ACCEPT
-A PREROUTING -i eth0 -s <our.net.work.space>/21 -j ACCEPT
-A PREROUTING -m recent --rsource --update --seconds 86400 --name DYN_DROP_LIST -j DROP
-A PREROUTING -p udp -m udp --dport 53 -j DNS_DROP
-A PREROUTING -p tcp -m tcp --dport 53 -j DNS_DROP

-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -d <our.net.work.space>/21 -j ACCEPT
-A OUTPUT -m recent --rdest --update --seconds 86400 --name DYN_DROP_LIST -j DROP

## Permanent DNS drop list (ipset)
-A DNS_DROP -m set --match-set PERM_DNS_DROP src -j DROP

## DNS - UDP progressive rate limit
-A DNS_DROP -p udp -m hashlimit --hashlimit-above  1/sec --hashlimit-burst  5 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire  10000 --hashlimit-name DNS_LIMIT_UDP  -j DROP
-A DNS_DROP -p udp -m hashlimit --hashlimit-above 10/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire 120000 --hashlimit-name DNS_LIMIT_UDP2 -j DROP
-A DNS_DROP -p udp -m hashlimit --hashlimit-above  4/min --hashlimit-burst 15 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire 240000 --hashlimit-name DNS_LIMIT_UDP3 -j DROP

## DNS - TCP progressive rate limit
-A DNS_DROP -p tcp -m hashlimit --hashlimit-above  6/sec --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire  10000 --hashlimit-name DNS_LIMIT_TCP  -j DROP
-A DNS_DROP -p tcp -m hashlimit --hashlimit-above 60/min --hashlimit-burst 60 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire 120000 --hashlimit-name DNS_LIMIT_TCP2 -j DROP
-A DNS_DROP -p tcp -m hashlimit --hashlimit-above 24/min --hashlimit-burst 90 --hashlimit-mode srcip --hashlimit-srcmask 24 --hashlimit-htable-expire 240000 --hashlimit-name DNS_LIMIT_TCP3 -j DROP

## DNS - UDP & TCP root any/all query filter
-A DNS_DROP -p udp -m string --hex-string "|0000ff0001|" --algo bm --from 40 -j DYN_DROP
-A DNS_DROP -p tcp -m string --hex-string "|0000ff0001|" --algo bm --from 52 -j DYN_DROP

## Dynamic Drop List
-A DYN_DROP -m recent --rsource --set --name DYN_DROP_LIST -j DROP