Pas Tout A Fait

Aller au contenu | Aller au menu | Aller à la recherche

Lutter contre un possible DDoS DNS utilisant votre serveur Bind

Dernière mise à jour le 07 juin 2011

Depuis quelques temps les logs de mon serveur DNS, qui ne répond que pour mon domaine, se remplissent de requêtes qui ont été interdites. Elles proviennent toutes de quelques IPs, une grosse vingtaine, qui changent globalement toutes les heures, puis qui reviennent un ou deux jours plus tard.

dns-ddos.jpg


Dans un premier temps, je ne me suis pas inquiété de voir ces lignes, mais à force elles ont commencé à envahir mon fichier de logs à raison de quatre-cinq requêtes par seconde, ceci plusieurs jours durant.

Voici un exemple de ces logs :

26-Jan-2010 20:40:12.479 security: info: client x.x.x.x#x: query (cache) 'se/ANY/IN' denied
26-Jan-2010 20:40:12.681 security: info: client x.x.x.x#x: query (cache) 'se/ANY/IN' denied
26-Jan-2010 20:40:12.936 security: info: client x.x.x.x#x: query (cache) 'se/ANY/IN' denied
26-Jan-2010 20:40:13.265 security: info: client x.x.x.x#x: query (cache) 'se/ANY/IN' denied
26-Jan-2010 20:40:13.684 security: info: client x.x.x.x#x: query (cache) 'se/ANY/IN' denied

Après quelques recherches, je suis tombé sur plusieurs articles parlant de ce phénomène, et en particulier un sur rhau.se.

Il semble que ce type de logs soit dû au fait que mon serveur Bind est utilisé comme relai pour effectuer des attaques DDoS.

Le principe est de procéder à de multiples requêtes sur mon serveur et de nombreux autres en même temps, via des IPs spoofées, celles que je vois dans mes logs, ceci à partir d'un bot-net par exemple. Le trafic sur chaque serveur n'est pas énorme, et pas suffisant pour les mettre à mal, mais par contre, les IPs spoofées qui sont employées pour faire ces requêtes reçoivent un nombre de réponses très important de la part des serveurs DNS utilisés comme relais, et se retrouvent cible du DDoS.

La solution la plus évidente pour ne plus avoir à faire face à ce problème consiste à purement et simplement bloquer les IPs qui réalisent ces requêtes grâce à IPTables.

Le faire "à la main" est envisageable, si on dispose régulièrement de temps pour ajouter les IPs au fil des jours. Mais il est toujours plus simple d'automatiser les choses, ce que permettent les scripts suivants.


Mise en situation

J'ai légèrement adapté le script qui réalise la liste des IPs à blacklister pour convenir à la façon dont mon serveur enregistre les logs. J'utilise sur mon serveur Bind un fichier spécifique pour la catégorie "security", qui enregistre les requêtes bloquées, grâce aux lignes suivantes dans mon fichier named.conf :

logging {
    channel security_channel {
        file "/var/log/named/sec.log" versions 5 size 10m;
        severity info;
        print-category yes;
        print-severity yes;
        print-time yes;
    };

    category security { security_channel; };

Avec cela, tous les enregistrements de cette catégorie vont dans le fichier "/var/log/named/sec.log". Pour plus de détails concernant le configuration d'un serveur Bind, voir ce billet.


Faire la liste des IPs

La première étape consiste à faire la liste des IPs à bloquer, ce que permet le petit script suivant, qui parcourt le fichier "/var/log/named/sec.log", isole les adresses IP des lignes contenant "'se/ANY/IN' denied" en utilisant awk puis cut, et enfin les ajoute l'une après l'autre dans le fichier "/home/user/DNSDDos-iptoblock", fichier à créer au préalable.

#!/bin/bash
OUTFILE="/home/user/DNSDDos-iptoblock"
TEMPFILE="/tmp/DNSDDos-iptoblock.tmp"
 
# Isoler les ip et les ajouter dans le fichier specifie
cat /var/log/named/sec.log | grep "'se/ANY/IN' denied" | \
awk '{ print $6 }' | cut -d "#" -f 1 | sort | uniq >> $OUTFILE
 
# faire en sorte de ne pas avoir de doublon dans la liste des ip
cat $OUTFILE | sort | uniq > $TEMPFILE
mv $TEMPFILE $OUTFILE

On fait également attention à ne pas lister deux fois la même IP avec le programme uniq.


Bloquer ces IPs avec IPTables

Une fois la liste faite, il ne reste plus qu'à utiliser IPTables pour les interdire. Là encore, automatisons la procédure grâce aux lignes ci-dessous à ajouter dans votre script IPTables :

iptables -N DNSDROP
iptables -A DNSDROP -p udp --dport 53 -j DROP
iptables -A DNSDROP -p tcp --dport 53 -j DROP
 
BLOCKLIST="/home/user/DNSDDos-iptoblock"
for HOST in `cat $BLOCKLIST`; do
  iptables -A INPUT -s $HOST -j DNSDROP
done

Attention à bien les mettre avant toutes autres règles concernant le DNS !

Avec ces lignes, dans un premier temps on crée une nouvelle chaine nommé "DNSDROP", puis on définit comme règle de jeter les paquets UDP/53 et TCP/53. Ensuite on utilise une boucle pour parcourir le fichier "/home/user/DNSDDos-iptoblock" et appliquer une règle à chaque adresse IP qu'il contient. Une règle qui envoie les paquets vers la chaine "DNSDROP".

Et nous voilà débarrassé-e-s du problème. :-)

Matthieu Patout

Auteur: Matthieu Patout

Restez au courant de l'actualité et abonnez-vous au Flux RSS

Soyez le premier à réagir sur cet article

Ajouter un commentaire Fil des commentaires de ce billet

aucune annexe



Voir Aussi

googleplus1.jpg

Améliorer la vitesse de chargement et valider le bouton Google +1

Le bouton Google +1 s'affiche partout sur le web depuis quelques semaines. En plus de permettre la...

Lire la suite

Microphone.jpg

Enregistrer un son interne sous Ubuntu

Enregistrer les émissions de Radio France est toujours aussi simple et facile... Oublions le format...

Lire la suite


Découvrez le Nouveau « Pack Liberté »