Sur internet, il est facile d’usurper une adresse IP, c’est-à-dire d’envoyer un paquet IP avec une adresse source arbitraire. Une requête DNS en UDP se composant d’un unique datagramme, on peut faire bannir des adresses IP par fail2ban en les usurpant (spoofing) pour envoyer des requêtes DNS à ton serveur. Par conséquent, les utilisateurs légitimes de ces adresses IP ne pourront plus faire de requêtes DNS à ton serveur.
C’est beaucoup plus difficile en TCP car l’établissement d’une connexion passe par le “3-way handshake”, la poignée de main qui consiste à envoyer un paquet SYN au serveur, qui répond par un SYN/ACK auquel il faut répondre par un ACK. Là est la difficulté : si on n’est pas le propriétaire de l’adresse, ou si on n’est pas sur le chemin entre lui et le serveur pour intercepter les paquets, on ne reçoit pas le SYN/ACK qui contient un numéro de séquence initial repris dans le ACK. On peut certes répondre en aveugle, mais d’une part les attaques par prédiction du numéro de séquence sont devenues extrêmement difficiles avec les OS actuels, et d’autre part la machine qui reçoit un SYN/ACK inattendu risque de renvoyer un RST au serveur, coupant la connexion.
La poignée de main TCP est en soi une bonne protection anti-spoofing. En UDP il n’y a rien de tel. Cela peut être réalisé par le protocole de niveau supérieur utilisant le transport UDP, mais là encore il n’y a rien de tel dans UDP qui est conçu pour être aussi léger que possible. Mais tous ne le font pas, et permettent l’usurpation d’adresse.
La seule protection anti-spoofing IP ne peut être réalisée que par les FAI qui allouent des adresses IP à leurs clients, en vérifiant qu’un client n’utilise que les adresses qui lui sont allouées. Au pis un FAI peut faire en sorte que rien ne sorte de son réseau avec une adresse qui ne lui appartient pas.
Cela protège l’adresse de la mise au ban. Mais pas de l’usurpation.
Que fait ton serveur DNS exactement ? S’il ne fait que DNS cache récursif pour les machines de ton réseau, tu peux filtrer le trafic DNS en fonction de l’adresse source avec iptables, ainsi les requêtes DNS extérieures seront bloquées.
S’il fait cache pour ton réseau et sert des zones pour tout le monde, tu peux définir deux vues (views) : une récursive visible seulement par le réseau local, et une sans récursion visible par le reste du monde.