Во первых, не нужно светить рекурсивным 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