DNS : Architecture split-horizon et challenges ACME

Cet article documente l architecture du service DNS du homelab : le systeme de vues split-horizon, les zones, les forwarders et l integration avec les challenges ACME pour Let's Encrypt.

Split-horizon : une vue par sous-reseau

BIND9 gere 18 vues distinctes. Chaque sous-reseau de l inventaire Ansible genere automatiquement sa propre vue avec des reponses adaptees.

flowchart TB
    subgraph views["Vues BIND9"]
        direction TB
        v1["Vue per-subnet<br/>recursion autorisee<br/>home.arpa = passerelle locale"]
        v2["Vue local<br/>clients de confiance<br/>home.arpa complet"]
        v3["Vue internet<br/>recursion desactivee<br/>autoritaire publique"]
    end
    client["Client interne"] -->|"IP source = subnet"| v1
    trusted["Client trusted"] -->|"ACL trusted"| v2
    external["Requete externe"] -->|"WAN DNAT"| v3
    acme["nsupdate TSIG"] -->|"!key tsig-key exclut des vues subnet"| v3

Mecanisme match-clients

Chaque vue per-subnet matche les clients par leur IP source. La directive !key tsig-key exclut les requetes signees TSIG pour qu elles tombent dans la vue internet (qui a l update-policy ACME).

Zone home.arpa par vue

Chaque vue a sa propre zone home.arpa ou l entree vyos pointe vers la derniere IP du subnet (la passerelle locale du client). Ainsi un client en VLAN IoT resout vyos.home.arpa vers sa passerelle IoT, pas vers le routeur LAN.

Interception DNS (DNAT rule 534)

Tout le DNS interne est intercepte par une regle DNAT. Aucun client ne sort en DNS directement vers Internet :

nat destination rule 534 :
  inbound-interface : group dnat-dns
  protocol : tcp_udp
  destination port : 53
  translation : adresse du container BIND9

Cette interception garantit que tous les clients utilisent le meme cache DNS, essentiel pour la coherence CDN avec le proxy transparent.

Zones et fichiers

Type Fichier Partage entre vues
Forward home.arpa vue_db.home.arpa Non (genere par vue)
Forward jbsky.fr vue_db.jbsky.fr Copies reelles (pas symlinks)
Reverse db.subnet Oui (symlinks entre vues)

Les copies reelles pour jbsky.fr evitent que les nsupdate ACME (qui modifient db.jbsky.fr dans la vue internet) se propagent aux autres vues.

Generation automatique

Les zones sont generees par le playbook bind.yaml a partir de l inventaire Ansible. Ajouter ou retirer un host avec ipv4 + netmask4 suffit pour faire apparaitre ou disparaitre une vue.

Le nettoyage en debut de playbook supprime les fichiers orphelins quand un subnet est retire.

Forwarders et recursion

forwarders { 1.1.1.1; 9.9.9.9; 8.8.8.8; };
forward only;
allow-recursion { trusted; };
allow-query-cache { trusted; };

La recursion est restreinte aux clients de l ACL trusted. La vue internet est purement autoritaire (pas de recursion).

Hardening du service

  • version "not disclosed" : masque la version BIND
  • hostname "not disclosed" : masque le hostname
  • server-id "not disclosed" : masque le server-id
  • minimal-responses yes : reduit les informations dans les reponses
  • rate-limit : 10 reponses/seconde pour les clients non-trusted
  • IPv6 desactive : server ::/0 { bogus yes; }

Liens

Articles connexes


Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.