Esteja você executando um recursor DNS aberto ou um servidor DNS autoritativo, o problema é o mesmo e a maioria das soluções possíveis também é a mesma.
A melhor solução
Os cookies DNS são um padrão proposto que fornece aos servidores DNS uma maneira de exigir que os clientes enviem um cookie para provar que o endereço IP do cliente não foi falsificado. Isso custará uma viagem de ida e volta adicional para a primeira pesquisa, que é a menor sobrecarga que qualquer solução poderia oferecer.
Fallback para clientes mais antigos
Como os cookies DNS ainda não estão padronizados, é claro que será necessário oferecer suporte a clientes mais antigos agora e nos próximos anos.
Você pode classificar solicitações de limite de clientes sem suporte a cookies DNS. Mas os limites de taxa facilitam a invasão do DoS ao servidor DNS. Observe que alguns servidores DNS têm um recurso de limite de taxa projetado apenas para servidores DNS autoritativos. Como você está perguntando sobre um resolvedor recursivo, essas implementações de limitação de taxa podem não ser aplicáveis a você. O limite de taxa por design se tornará o gargalo do seu servidor e, portanto, um invasor precisará enviar menos tráfego para causar a queda de solicitações legítimas do que ele faria se não houvesse limite de taxa.
Uma vantagem dos limites de taxa é que, no caso de um invasor inundar seu servidor DNS com solicitações de DNS, é mais provável que você tenha capacidade sobrando, o que permitirá que você faça ssh no servidor e investigue a situação. Além disso, os limites de taxa podem ser projetados para eliminar solicitações de IPs de clientes, enviando muitas solicitações, o que pode ser suficiente para protegê-lo contra DoS de invasores que não têm acesso a IPs de clientes falsificados.
Por esses motivos, um limite de taxa um pouco abaixo da sua capacidade real pode ser uma boa ideia, mesmo que na verdade não proteja contra a amplificação.
Usando TCP
É possível forçar um cliente a usar o TCP enviando um código de erro indicando que a resposta é muito grande para o UDP. Isso tem algumas desvantagens. Custa duas viagens de ida e volta adicionais. E alguns clientes defeituosos não o suportam.
O custo de duas viagens de ida e volta adicionais pode ser limitado apenas à primeira solicitação usando esta abordagem:
Quando o IP do cliente não foi confirmado, o servidor DNS pode enviar uma resposta truncada para forçar o cliente a mudar para o TCP. A resposta truncada pode ser tão curta quanto a solicitação (ou mais curta se o cliente usa EDNS0 e a resposta não) que elimina a amplificação.
Qualquer IP do cliente que conclua um handshake TCP e envie uma solicitação DNS na conexão pode ser temporariamente incluído na lista de permissões. Uma vez na lista branca, o IP pode enviar consultas UDP e receber respostas UDP de até 512 bytes (4096 bytes se estiver usando EDNS0). Se uma resposta UDP acionar uma mensagem de erro ICMP, o IP será removido da lista de desbloqueio novamente.
O método também pode ser revertido usando uma lista negra, o que significa apenas que os IPs do cliente podem consultar sobre UDP por padrão, mas qualquer mensagem de erro ICMP faz com que o IP seja incluído na lista negra, necessitando de uma consulta TCP para sair da lista negra.
Um bitmap cobrindo todos os endereços IPv4 relevantes pode ser armazenado em 444 MB de memória. Os endereços IPv6 teriam que ser armazenados de outra maneira.
Não sei se algum servidor DNS implementou essa abordagem.
Também foi relatado que algumas pilhas TCP podem ser exploradas em ataques de amplificação. No entanto, isso se aplica a qualquer serviço baseado em TCP e não apenas ao DNS. Tais vulnerabilidades devem ser atenuadas atualizando para uma versão do kernel em que a pilha TCP foi corrigida para não enviar mais de um pacote em resposta a um pacote SYN.