Outils pour utilisateurs

Outils du site


benevoles:technique:recursif

Serveur DNS récursif ouvert

Toute notre configuration et tous nos essais et remarques sont détaillés ici : Comment mettre en place un serveur DNS récursif-cache ouvert dans de bonnes conditions.

Nous utilisons le logiciel serveur DNS Unbound.

Sur cette page, nous résumerons juste les principales étapes pour monter un récursif DNS ouvert sans rien expliquer.

  • Pensez à activer la validation DNSSEC (même si elle profitera uniquement à vos abonné-e-s, problème dit du dernier kilomètre).
    • Exemple avec BIND (/etc/named/named.conf.options avec Debian GNU/Linux) :
        dnssec-enable yes;
        dnssec-validation auto;
        # dnssec-lookaside auto; # plus vraiment nécessaire de nos jours
    • Exemple avec Unbound (/etc/unbound/unbound.conf avec Debian GNU/Linux) :
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
    • Pensez à suivre les rotations de la KSK de la racine. Normalement, ça se passe bien mais bon…
  • Avoir une adresse email “abuse” valide associée à vos blocs IPv4 et IPv6 dans la base de données du RIPE (ou autre RIR). Utilisez ce formulaire : entrer l'IPv4 puis l'IPv6 attribuée à votre récursif. Il doit vous retourner une adresse email !
  • Grapher et surveiller votre récursif et notamment le trafic sortant : débit et nombre de paquets par seconde. Chez ARN, le monitoring émet une alerte si le débit sortant dépasse 250 kbps sur 5 minutes. Cette limite représente 10 fois le trafic moyen.
  • Préparer une configuration sûre (récursif qui répond uniquement pour vos blocs IPv4 et IPv6) que vous pourrez charger/appliquer en cas d'urgence (grosse attaque persistante).
    • Exemple avec BIND (/etc/named/named.conf.options avec Debian GNU/Linux) :
        #allow-query { 127.0.0.1; ::1; <votre_bloc_IPv4>; <votre_bloc_IPv6>; };
        #allow-query-cache { 127.0.0.1; ::1; <votre_bloc_IPv4>; <votre_bloc_IPv6>; };
        #allow-recursion { 127.0.0.1; ::1; <votre_bloc_IPv4>; <votre_bloc_IPv6>; };
    • Exemple avec Unbound (/etc/unbound/unbound.conf avec Debian GNU/Linux) :
      server: 
        [...]
        #access-control: 127.0.0.1/32 allow
        #access-control: ::1/128 allow
        #access-control: <votre_bloc_IPv4> allow
        #access-control: <votre_bloc_IPv6> allow
  • Juguler les attaques avec Netfilter
    • Un doute persiste sur l'efficacité et l'adéquation de Response Rate Limiting (RRL) à un récursif. C'est pourquoi nous ne l'utilisons pas.
    • Nous nettoyons le trafic sur nos deux routeurs pour éviter de transporter le trafic pourri en interne mais ces filtres peuvent aussi être appliqués directement sur le récursif. Pour ce faire, il faut remplacer la chaîne FORWARD par la chaîne INPUT.
    • IPv4 :
        iptables -N  DNS-RATE-LIMIT
        
        iptables -A FORWARD ! -s <votre_bloc_IPv4> -d <IPv4_de_votre_récursif> -p udp -m udp --dport 53 -j DNS-RATE-LIMIT
        
        iptables -A DNS-RATE-LIMIT -m string --hex-string "|0000ff0001|" --algo bm --from 28 --to 65535 -m hashlimit \ --hashlimit-above 1/sec --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name RL-DNS-ANY-v4 --hashlimit-srcmask 24 -m comment --comment "RATE-LIMIT ANY QTYPE 1/s burst 2" -j DROP
        
        iptables -A DNS-RATE-LIMIT -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name RL-DNS-GLOBL-v4 --hashlimit-srcmask 24 -m comment --comment "RATE-LIMIT ALL QUERIES 10/s burst 20" -j DROP
    • IPv6 :
        ip6tables -N  DNS-RATE-LIMIT
        
        ip6tables -A FORWARD ! -s <votre_bloc_IPv6> -d <IPv6_de_votre_récursif> -p udp -m udp --dport 53 -j DNS-RATE-LIMIT
        
        ip6tables -A DNS-RATE-LIMIT -m string --hex-string "|0000ff0001|" --algo bm --from 48 --to 65535 -m hashlimit --hashlimit-above 1/sec --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name RL-DNS-ANY-v6 --hashlimit-srcmask 56 -m comment --comment "RATE-LIMIT ANY QTYPE 1/s burst 2" -j DROP
        
        ip6tables -A DNS-RATE-LIMIT -m hashlimit --hashlimit-above 10/sec --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name RL-DNS-GLOBL-v6 --hashlimit-srcmask 56 -m comment --comment "RATE-LIMIT ALL QUERIES 10/s burst 20" -j DROP
    • Pensez à utiliser netfilter-persistent pour appliquer ces filtres au boot.
  • Réduire la taille maximale des réponses que votre récursif enverra sur UDP. L'idée est de demander au client de revenir poser sa question qui génère une grosse réponse en TCP. S'il est un vrai client, il reviendra, sinon non. Avec BIND (/etc/named/named.conf.options avec Debian GNU/Linux) ou Unbound (/etc/unbound.conf avec Debian) :
  max-udp-size 1460;
benevoles/technique/recursif.txt · Dernière modification : 2021/10/11 14:17 de ljf