Фаервол iptables, модуль state — можно использовать как вид защиты?

Здравствуйте.

Исходя из статьи на habrahabr.ru об атаке DNS Amplification, там пишется: "Атака строится на отправке DNS запроса к какому либо DNS серверу с подставленным ip адресом источника, равным ip адресу жертвы."

Я не силен в сетевой части, на каком уровне происходит подмена IP адреса? Я не думаю, что это делается на сетевом уровне, в следствии этого мне представляется такая схемка:

1. Запрос от злоумышленника идет на 53 порт моего сервера, по правилам iptables срабатывает "--state NEW" для сервера злоумышленника, соединение принимается и передается на DNS сервис.
2. Далее DNS сервис разбирает полученные данные, "кушает" подставной IP (или я на этом этапе не прав?) и пытается отправить ответ на подставной сервер.

Собственно, исходя из этой схемы есть в iptables два правила:

-A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT


Вследствие iptables разрешит принять запрос на 53 порт с сервера злоумышленника, а вот далее при отправке ответа на подставной сервер iptables сбросит ли соединение? Ответ ведь разрешен только на тот сервер, с которым установлено соединение.

Я понимаю, что для защиты от этого типа атаки необходимо запретить recursion и transfer в настройках BIND и обновить ПО до последних версий, а также обновить NTP до последней версии. Проблема в том, что это всё было выполнено на момент выполнения атаки.

Сейчас весь UDP трафик разрешен только до DNS от Google, до ограниченного числа NTP серверов. Остается правило, которое предоставлено выше. Можно ли его использовать как дополнительный вид защиты? Или оно не защитит от описанной схемы?
  • Вопрос задан
  • 3221 просмотр
Решения вопроса 1
zhovner
@zhovner
Гик, задрот и богомол
Во первых, не нужно светить рекурсивным DNS в интернет.

Для bind это выглядит так:

//disable recursive requests from outside
        allow-recursion { 127.0.0.1; 
                                   ::1; };


Приведенные вами правила iptables никак не решают задачу защиты от dns amplification.


В следствии, iptables разрешит принять запрос на 53 порт с сервера злоумышленника, а вот далее при отправке ответа на подставной сервер iptables сбросит ли соединение? Ответ ведь разрешен только на тот сервер, с которым установлено соединение.


Так как в случае этой атаки используется UDP, никакие соединения не устанавливаются. Атакующий отправляет ОДИН UDP пакет с запросом (в котором source адрес заменен на атакуемый ip) и ваш сервер отправляет один пакет с ответом на этот запрос, на тот адрес который был указан в source. Состояние NEW,ESTABLISHED в таком случае вполне корректно.

Атака с подменой source адреса не возможна в случае с TCP, так как для установления соединения используется несколько пакетов в обе стороны. SYN->ACK<--SYN_ACK и только после этого открывается соединение. А так как в случае с подменой исходящего адреса ответ сервера на SYN уйдет по другому адресу, соответственно на него никто не ответит SYN_ACK.

Для решения вашей задачи нужно использовать ограничение запросов с одного адреса:

# Requests per second
RQS="15"

# Requests per 7 seconds
RQH="35"

iptables -I INPUT -p udp --dport 53 -m state --state NEW -m recent --set --name DNSQF --rsource
iptables -I INPUT -p udp --dport 53 -m state --state NEW -m recent --update --seconds 1 --hitcount ${RQS} --name DNSQF --rsource -j DROP
iptables -I INPUT -p udp --dport 53 -m state --state NEW -m recent --set --name DNSHF --rsource
iptables -I INPUT -p udp --dport 53 -m state --state NEW -m recent --update --seconds 7 --hitcount ${RQH} --name DNSHF --rsource -j DROP
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
vvpoloskin
@vvpoloskin
Инженер связи
Подмена как раз делается на сетевом. Классическая маршрутизация проверяет только адрес назначения, соответственно на адрес источника ей наплевать. Это можно сделать, например, средствами NAT на любой железке, либо самостоятельно сгенерировать запрос скриптом.
Конкретно по Вашей теме, что мешает повесить правила с разными состояниями, попробовать сделать запросы и посмотреть счетчики?

P.S. используйте уже conntrack вместо state)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы