Независимо от того, используете ли вы открытый рекурсор DNS или авторитетный сервер DNS, проблема одна и та же, и большинство возможных решений также одинаковые.
Лучшее решение
DNS-файлы cookie - это предлагаемый стандарт, который позволяет DNS-серверам требовать от клиентов отправки файлов cookie, чтобы доказать, что IP-адрес клиента не был подделан. Это будет стоить одну дополнительную поездку туда и обратно при первом поиске, что является минимальными издержками, которые может предложить любое решение.
Резервный вариант для пожилых клиентов
Поскольку куки-файлы DNS еще не стандартизированы, конечно, будет необходимо поддерживать старых клиентов сейчас и на годы вперед.
Вы можете оценить ограничение запросов от клиентов без поддержки файлов cookie DNS. Но ограничения скорости облегчают злоумышленнику DoS вашего DNS-сервера. Помните, что некоторые DNS-серверы имеют функцию ограничения скорости, предназначенную только для авторитетных DNS-серверов. Поскольку вы спрашиваете о рекурсивном преобразователе, такие реализации ограничения скорости могут быть неприменимы к вам. Заданное ограничение скорости станет узким местом для вашего сервера, и, таким образом, злоумышленнику потребуется отправить вам меньше трафика, чтобы вызвать отклонение допустимых запросов, чем если бы не было ограничения скорости.
Одним из преимуществ ограничения скорости является то, что в случае, если злоумышленник затопит ваш DNS-сервер DNS-запросами, у вас, скорее всего, останется пропускная способность, которая позволит вам подключиться к серверу по ssh и исследовать ситуацию. Кроме того, ограничения скорости могут быть разработаны таким образом, чтобы в первую очередь отбрасывать запросы с клиентских IP-адресов, отправляющих много запросов, которых может быть достаточно, чтобы защитить вас от DoS от злоумышленников, которые не имеют доступа к подделке клиентских IP-адресов.
По этим причинам ограничение скорости, немного превышающее вашу фактическую емкость, может быть хорошей идеей, даже если оно фактически не защищает от усиления.
Использование TCP
Можно заставить клиента использовать TCP, отправив код ошибки, указывающий, что ответ слишком велик для UDP. Это имеет пару недостатков. Это стоит две дополнительные поездки туда и обратно. И некоторые неисправные клиенты не поддерживают это.
Стоимость двух дополнительных обращений может быть ограничена только первым запросом с использованием этого подхода:
Если IP-адрес клиента не подтвержден, DNS-сервер может отправить усеченный ответ, чтобы заставить клиента переключиться на TCP. Усеченный ответ может быть таким же коротким, как и запрос (или более коротким, если клиент использует EDNS0, а ответ - нет), что исключает усиление.
Любой клиентский IP-адрес, который завершает квитирование TCP и отправляет запрос DNS на соединение, может быть временно внесен в белый список. После внесения в белый список IP получает возможность отправлять UDP-запросы и получать UDP-ответы размером до 512 байт (4096 байт, если используется EDNS0). Если ответ UDP вызывает сообщение об ошибке ICMP, IP снова удаляется из белого списка.
Этот метод также может быть изменен с помощью черного списка, что означает, что IP-адреса клиентов по умолчанию разрешают запрашивать через UDP, но любое сообщение об ошибке ICMP приводит к тому, что IP-адрес заносится в черный список, и для выхода из черного списка требуется запрос TCP.
Растровое изображение, охватывающее все соответствующие адреса IPv4, может храниться в 444 МБ памяти. Адреса IPv6 должны быть сохранены другим способом.
Я не знаю, если какой-либо DNS-сервер реализовал этот подход.
Также сообщалось, что некоторые стеки TCP могут использоваться в атаках усиления. Это, однако, относится к любой службе на основе TCP, а не только к DNS. Такие уязвимости следует устранить путем обновления до версии ядра, где стек TCP был исправлен, чтобы не отправлять более одного пакета в ответ на пакет SYN.