J'ai un serveur de noms accessible au public car c'est le serveur de noms faisant autorité pour quelques domaines .
Actuellement, le serveur est inondé de ANY
demandes de type falsifiées pour isc.org, ripe.net et similaires (c'est une attaque DoS distribuée connue ).
Le serveur exécute BIND et a allow-recursion
défini mon LAN pour que ces demandes soient rejetées. Dans de tels cas, le serveur répond uniquement avec authority
et des additional
sections référençant les serveurs racine.
Puis-je configurer BIND pour qu'il ignore complètement ces demandes, sans envoyer de réponse du tout?
la source
iptables -t raw -S PREROUTING
. Sortie:,-P PREROUTING ACCEPT
suivie de-A PREROUTING -i eth0 -p udp -m udp --dport 53 -m string --hex-string "|01000001000000000000|" --algo kmp --from 30 --to 65535 -j DROP
. J'ai testé qu'il fonctionne correctement avechost -ar exampledomain.com dns-server.example.net
. Bien sûr, cela n'a pas fonctionné correctement jusqu'à ce que j'ajoute l'-r
option.-r
option fait la différence. Personnellement, je n'aime pas que leshost
requêtes simples ne fonctionnent plus et cela peut être très déroutant. C'est probablement une réponse valable (la meilleure jusqu'à présent) et je vais vous donner la prime, car elle est sur le point d'expirer, même si je continuerai à utiliser ma propre approche en filtrant OUTPUT.Je voudrais essayer:
Les réponses référant les clients aux serveurs racine sont contrôlées par la zone "rediriger". Cela devrait lui dire de ne pas y répondre.
Cela est indiqué dans les documents Bind9: http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#id2592674
Vous pouvez remplacer
"none"
par votre sous-réseau local.Si vous avez déjà une
zone "."
déclaration, ajoutez-la simplementallow-query "none";
.la source
zone "." { type hint; file "/etc/bind/db.root"; };
déclaration avec db.root listant les serveurs racine. La suppression de cette déclaration arrête les réponses pour les domaines étrangers, mais le serveur répond néanmoins par une "défaillance du serveur" et peut donc toujours être utilisé pour DoS.allow-query "none";
à lazone "."
config?En général, je suggère:
Activez les journaux de liaison et enregistrez les ips dont la réponse est rejetée. Installez le programme fail2ban, ajoutez une action blackhole: http://pastebin.com/k4BxrAeG (mettez la règle dans un fichier dans /etc/fail2ban/actions.d)
Créez un fichier de filtre de liaison dans /etc/fail2ban/filter.d avec quelque chose comme ça (nécessite un débogage!)
Modifiez fail2ban.conf, ajoutez une section:
J'espère que cela vous aidera!
la source
L'idée de base permet à bind de classer la réponse DNS comme Refus, puis d'utiliser iptables pour convertir Refused en silencieusement ignoré.
Refusé est la partie facile dans la section d'options named.conf:
Ou bien sûr vos listes de contrôle d'accès préférées pour les exceptions locales ...
Suivant la magie folle d'iptables, ajustez ou supprimez "-o eth0" au besoin. Cette commande suppose un en-tête de couche IPv4 standard de 20 octets avant UDP.
Cette clé sur le champ des drapeaux de la réponse DNS avec les bits suivants définis
Message de journal remarqué exécutant la liaison dans le débogage "erreur d'envoi de réponse: hôte inaccessible" lorsque la règle correspond pour avoir des commentaires à tester.
Je dois admettre que tout cela est un exercice quelque peu inutile. S'il n'y a pas d'amplification, un attaquant pourrait tout aussi bien refléter TCP SYN. En fin de compte, le DNS n'est simplement pas une solution viable autre que l'utilisation de TCP ou le déploiement des cookies DNS d'Eastlake.
la source
Avez-vous essayé de bloquer la chaîne isc.org ou de bloquer la chaîne hexadécimale pour cela?
Cela a fonctionné pour moi:
la source
iptables -A OUTPUT -p udp -m string -hex-string "|726f6f742d73657276657273|" –algo bm –to 65535 -j DROP
mais je préférerais vraiment une solution basée uniquement sur la configuration BIND, si cela est possible.'bnrexex.www.sf97.net/A/IN' 'whzpkacpxpiuycm.www.tpa.net.cn/A/IN'
Cette attaque est appelée déni de service amplifié. Vous devez configurer correctement la liaison, mais ce trafic ne doit pas atteindre votre liaison en premier lieu. Bloquez-le sur le premier périphérique réseau capable de le faire sur votre réseau. J'ai eu le même problème et je l'ai traité avec la règle de snort sourd:
la source
Tout d'abord, je sais que c'est une vieille question mais ...
Je gère mon propre serveur DNS non récursif faisant autorité depuis des décennies, mais je n'ai jamais été victime d'attaques DDoS basées sur DNS - jusqu'à présent, lorsque je suis passé à un nouveau FAI. Des milliers de requêtes DNS usurpées ont inondé mes journaux et je me suis vraiment ennuyé - pas tant sur l'impact sur mon serveur, plutôt sur le fait qu'il encombrait mes journaux et le sentiment inconfortable d'être abusé. Il semble que l'attaquant essaie d'utiliser mon DNS dans une « attaque de serveur de noms faisant autorité ».
J'ai donc pensé que, même si je limitais les requêtes récursives à mon réseau interne (en refusant tous les autres), je préférais passer mes cycles de processeur à faire correspondre les chaînes dans iptables plutôt qu'à renvoyer des réponses négatives aux adresses IP usurpées (moins d'encombrement dans mes journaux, moins trafic réseau et un niveau de satisfaction plus élevé).
J'ai commencé par faire comme tout le monde semble le faire , savoir quels noms de domaine sont interrogés et créé une correspondance de chaîne sur ce domaine avec un DROP cible. Mais je me suis vite rendu compte que je me retrouverais avec une énorme quantité de règles, chacune consommant des cycles CPU. Alors que faire? Étant donné que je n'exécute pas de serveur de noms récursif, j'ai pensé que je pourrais faire la correspondance sur les zones réelles pour lesquelles je fais autorité et supprimer tout le reste.
Ma politique par défaut dans iptables est ACCEPT, si votre politique est DROP, vous devrez probablement faire quelques ajustements si vous souhaitez utiliser la solution suivante.
Je garde ma configuration de zone dans un fichier séparé (/etc/bind/named.conf.local), utilisons ceci comme exemple:
Notez le commentaire «// Private» sur mes deux premières zones, je m'en sers dans le script suivant pour les exclure de la liste des zones valides.
Exécutez le script ci-dessus avec le fichier de configuration de zone comme argument.
Enregistrez la sortie dans un script, dirigez-la vers un shell ou copiez-collez-la dans votre terminal pour créer la nouvelle chaîne et commencer à filtrer toutes les requêtes DNS non valides.
exécutez / sbin / iptables -L DNSvalidate -nvx pour voir les compteurs de paquets (et d'octets) sur chaque règle de la nouvelle chaîne (vous voudrez peut-être déplacer la zone avec la plupart des paquets en haut de la liste pour la rendre plus efficace).
En espérant que quelqu'un puisse trouver cela utile :)
la source