Мне трудно понять, как заблокировать ЛЮБОЙ запрос DNS в BIND, чтобы снизить изменения атак DNS Amplification. Я видел руководства в Интернете, но большинство из них, похоже, выполняют ограничение скорости через iptables или привязку.
Какие-нибудь советы или советы?
Этот метод неэффективен, но он делает то, что вы просили
Единственный эффективный и универсальный способ, который я знаю, - это включить строковый фильтр iptables для блокировки запроса. Перед этим обязательно сделайте резервную копию конфигурации iptables.
-A PREROUTING -p udp -m udp --dport 53 -m string --hex-string "|0000ff0001|" --algo bm --from 40 -j DROP
помещается в раздел исходной таблицы iptables вашей конфигурации iptables.
... или из командной строки:
iptables -t raw -I PREROUTING -p udp -m udp --dport 53 -m string --hex-string "|0000ff0001|" --algo bm --from 40 -j DROP
Причина использования необработанной таблицы состоит в том, чтобы избежать попаданий в таблицу состояний в случае, если вы получаете высокую скорость запросов.
Необязательный шаг, который может быть полезен: Используйте с осторожностью и проверьте на тестовом сервере. Избегайте этого на критически важном для бизнеса сервере без тщательного тестирования.
Это может остановить некоторые Перечисление и усиление DNS-атак, но это нарушает пару RFC. Предотвратить уход с сервера чего-либо, кроме NOERROR, - тривиальная задача.
#
# drop anything leaving with the source port of 53 (DNS)
iptables -t raw -I OUTPUT -p udp -m udp --sport 53 -j DROP
#
# but then let through NOERROR for recursive
iptables -t raw -I OUTPUT -p udp -m udp --sport 53 -m string --hex-string "|8500|" --algo kmp --from 30 --to 31 -j ACCEPT
#
# and let through NOERROR for non-recursive
iptables -t raw -I OUTPUT -p udp -m udp --sport 53 -m string --hex-string "|8400|" --algo kmp --from 30 --to 31 -j ACCEPT
Ни один из демонов DNS не поддерживает выбор типов запросов для блокировки без изменения исходного кода, AFAIK. Например, я модифицировал rbldnsd, чтобы он отвечал на «ЛЮБОЙ» ответом «А». Это, конечно, неортодоксально и может расстроить пуристов.
Нет опции конфигурации для отбрасывания всех запросов типа ANY
. minimal-responses
может использоваться для удаления дополнительного раздела ваших ответов, за исключением случаев, когда этого требует RFC, что делает его безопасным вариантом без реальных недостатков. (помимо устранения неполадок администратора)
Честно говоря, рассматривать такой подход уже поздно. Конечно, . ANY
может время от времени появляться в ваших популярных запросах, но псевдослучайные атаки на субдомены являются текущим вкусом дня и подчеркивают количество пакетов в секунду, а не байтов в секунду. После этого будет что-то еще и так далее.
Акцент на ограничении скорости в основном связан с тем, что это одна из наиболее эффективных стратегий ограничения ущерба, который ваша инфраструктура может нанести в целом. Вот на чем вы должны сосредоточиться. Если вы используете рекурсивную инфраструктуру, убедитесь, что BCP-38 реализуется где-то между клиентом и исходящим путем. Не запускайте открытый резолвер. Так и так далее. Только после того, как вы ограничите свою общую поверхность атаки, имеет смысл сосредоточиться на конкретных стратегиях атаки, потому что, как вы обнаружите, они быстро теряют ценность.
Если у вас есть BIND 9.9 или новее, и в вашей установке включено ограничение скорости ответа во время сборки, вы можете установить ограничение скорости, как показано ниже:
options {
...
rate-limit {
responses-per-second 10;
log-only yes;
};
};
Если вы удовлетворены результатом при просмотре вашего query.log, удалите только журнал линии и наблюдайте, как она действует. По умолчанию установлено 5, если я не ошибаюсь, и не рекомендуется опускаться ниже этого числа. Также следите за коэффициентом пропускания, так как вы можете настроить его на серверах имен, на которых размещено больше зон.
И да, вы можете использовать iptables, но это не рекомендуется, поскольку в большинстве случаев IP-фильтр попадает в затруднительное положение раньше, чем ваш сервер имен. Также он не может делать различий на основе запроса, только по количеству пакетов и IP-адресу источника. Это означает, что вы потеряете много легального трафика.
Я использую Unbound DNS или Knot-resolver в качестве DNS-кеша для удаления ЛЮБОГО запроса PTR. Затем отправьте на свой восходящий преобразователь
policy.add(function (req, query)
if query.stype == kres.type.ANY then
return policy.DROP
elseif query.stype == kres.type.PTR then
return policy.DROP
end
end)