Que vous exécutiez un récurseur DNS ouvert ou un serveur DNS faisant autorité, le problème est le même et la plupart des solutions possibles sont également les mêmes.
La meilleure solution
Les cookies DNS sont une norme proposée qui donne aux serveurs DNS un moyen d'exiger des clients qu'ils envoient un cookie afin de prouver que l'adresse IP du client n'a pas été usurpée. Cela coûtera un aller-retour supplémentaire pour la première recherche, ce qui est le coût le plus bas qu'une solution pourrait offrir.
Remplacement pour les clients plus âgés
Étant donné que les cookies DNS ne sont pas encore standardisés, il sera bien sûr nécessaire de prendre en charge les clients plus âgés maintenant et pour les années à venir.
Vous pouvez évaluer les demandes de limite des clients sans prise en charge des cookies DNS. Mais les limites de taux permettent à un attaquant de faire plus facilement DoS votre serveur DNS. Sachez que certains serveurs DNS ont une fonction de limite de débit conçue uniquement pour les serveurs DNS faisant autorité. Étant donné que vous posez des questions sur un résolveur récursif, ces implémentations de limitation de débit peuvent ne pas vous être applicables. La limite de débit par conception deviendra le goulot d'étranglement pour votre serveur, et donc un attaquant devra vous envoyer moins de trafic afin de provoquer la suppression des demandes légitimes qu'il ne l'aurait fait s'il n'y avait pas de limite de débit.
Un avantage des limites de taux est que dans le cas où un attaquant inonde votre serveur DNS de requêtes DNS, vous avez plus de chances d'avoir une capacité restante qui vous permettra de ssh vers le serveur et d'enquêter sur la situation. De plus, les limites de débit peuvent être conçues pour supprimer principalement les demandes des adresses IP clientes envoyant de nombreuses demandes, ce qui peut être suffisant pour vous protéger contre le DoS contre les attaquants qui n'ont pas accès à l'usurpation d'adresses IP clientes.
Pour ces raisons, une limite de débit légèrement inférieure à votre capacité réelle peut être une bonne idée, même si elle ne protège pas réellement contre l'amplification.
Utilisation de TCP
Il est possible de forcer un client à utiliser TCP en envoyant un code d'erreur indiquant que la réponse est trop grande pour UDP. Cela présente quelques inconvénients. Il en coûte deux allers-retours supplémentaires. Et certains clients défectueux ne le prennent pas en charge.
Le coût de deux allers-retours supplémentaires peut être limité à la première demande en utilisant cette approche:
Lorsque l'adresse IP du client n'a pas été confirmée, le serveur DNS peut envoyer une réponse tronquée pour forcer le client à basculer vers TCP. La réponse tronquée peut être aussi courte que la demande (ou plus courte si le client utilise EDNS0 et la réponse ne le fait pas), ce qui élimine l'amplification.
Tout IP client qui termine une négociation TCP et envoie une demande DNS sur la connexion peut être temporairement mis sur liste blanche. Une fois sur liste blanche, IP peut envoyer des requêtes UDP et recevoir des réponses UDP jusqu'à 512 octets (4096 octets si vous utilisez EDNS0). Si une réponse UDP déclenche un message d'erreur ICMP, l'adresse IP est à nouveau supprimée de la liste blanche.
La méthode peut également être inversée à l'aide d'une liste noire, ce qui signifie simplement que les adresses IP des clients sont autorisées à interroger UDP par défaut, mais tout message d'erreur ICMP entraîne la liste noire de l'IP, nécessitant une requête TCP pour sortir de la liste noire.
Un bitmap couvrant toutes les adresses IPv4 pertinentes pourrait être stocké dans 444 Mo de mémoire. Les adresses IPv6 devraient être stockées d'une autre manière.
Je ne sais pas si un serveur DNS a mis en œuvre cette approche.
Il a également été signalé que certaines piles TCP peuvent être exploitées lors d'attaques d'amplification. Cela s'applique cependant à tout service basé sur TCP et pas seulement au DNS. Ces vulnérabilités devraient être atténuées par la mise à niveau vers une version du noyau où la pile TCP a été corrigée pour ne pas envoyer plus d'un paquet en réponse à un paquet SYN.