Architecture DNS faisant autorité

Un petit schéma valant mieux qu'un grand discours :

     /---------------------------------------------\
     |             outils (knot)                   |
     |                                             |
     | Dépôt « dns-records » dans /srv/dns-records |
     |                   |                         |
     |           script postupdate                 |
     |                   |                         |
     |                   ↓                         |
     |       configuration des zones               |
     |                   |                         |
     \-------------------|-------------------------/
                         |
                         |
     /-------------------|-------------------------\
     |                   ↓                         |
     |   configuration des zones sur les esclaves  |
     |                                             |
     |           gaffe et radeau (bind)            |
     \---------------------------------------------/

Serveur maître : outils

Installation et configuration de knot

apt install knot

Une fois le paquet installé, on crée le répertoire slaves (destiné à accueillir les zones pour lesquelles outils serait esclave) et on clone le dépôt des enregistrements dns :

mkdir /etc/knot/slaves cd /etc/knot git clone /srv/dns-records chown -R knot:knot /etc/knot/

Dans le /etc/knot/knot.conf :

  • dans la section server, on donne les IPs/ports sur lesquels knot écoute et l'utilisateur qui fait tourner le serveur ;
  • dans la section remote, on peut saisir des noms pour des machines ou réseaux, qui serviront plus tard pour les master/slaves ;
  • dans la section acl, on spécifie les autorisations pour les différentes IPs ;
  • dans la section zone, pour chaque zone, on donne le fichier de zone, ainsi que les ACls à utiliser et les serveurs à notifier pour les zones masters.

Mise en place du dépôt et du script d'update

Le script se situe dans /usr/local/sbin/update-ns-records, appelé par un hook dans le dépôt git avec sudo : /srv/dns-records/hooks/post-update.

À chaque push sur le dépôt, le script :

  • fait un pull du dépôt dans etc/knot/records/ ;
  • incrémente le numéro de série des zones (le même pour tout le monde) ;
  • vérifie les fichiers de zone et la configuration du serveur ;
  • envoie un mail pour dire si ça s'est bien passé.

Mise à jour des zones et des enregistrements

Pour les enregistrements, il suffit de cloner le dépôt enregistrements-dns, de faire les modifications voulues dans les zones, commiter et pusher ; les scripts vont se charger du reste.

Attention : lors du push on a ce type de message :

[…]
remote: From /srv/dns-records
remote:  * branch            master     -> FETCH_HEAD
remote:    72e426f..62af07c  master     -> origin/master
remote: Updating 72e426f..62af07c
remote: Fast-forward
remote:  grenode.zone | 4 ++--
remote:  1 file changed, 2 insertions(+), 2 deletions(-)
remote: error: failed to connect to socket '/run/knot/knot.sock' (not exists)
remote: OK: nameserver restarted with serial 2018092303.
[…]

Le message error: failed to connect to socket '/run/knot/knot.sock' (not exists) n'est pas important, c'est juste la console de configuration qui n'est pas configurée comme il s'y attend.

Le message important est OK: nameserver restarted with serial, qui signifie que tout va bien ; en cas d'erreur, on a un message du type : Error in zones configuration: try again!.

Pour rajouter des zones, voilà comment faire avec la zone example.net.

Sur le master

On crée le fichier de zone /etc/knot/db.example.net sur outils, dans etc/knot/. Attention, il faut penser à mettre le même serial que les autres, sinon, il peut y avoir des soucis de mise à jour :

$TTL 10800

@   IN    SOA ns3.grenode.net. root.grenode.net. (
                  XXXXXXXXXX      ; serial
                  6h              ; refresh
                  1h              ; retry
                  7W              ; expire
                  1h              ; TTL minimum
)

$ORIGIN       example.net.
$INCLUDE      "/etc/knot/dns-records/example.net.zone"

On édite ensuite /etc/knot/knot.conf pour y ajouter :

  - domain: example.net
    file: "db.example.net"
    notify: [gaffe.grenode.net, radeau.grenode.net]
    acl: [acl_ttnn, acl_ldn]

On pense à etckeeper au passage ;)

Sur les slaves

Sur gaffe et radeau, éditer /etc/bind/named.conf.local pour y ajouter :

zone "example.net" {
      type slave;
      file "/var/lib/bind/slaves/db.example.net";
      masters { 91.216.110.20; 2001:912:404:100::2; };
      allow-query { any; };
      allow-transfer { none; };
};

On pense à etckeeper au passage ;)

Sur le dépôt

On crée le nouveau fichier de zone example.net.zone dans le dépôt dns-records, avec comme enregistrements minimaux :

@                   IN  NS      ns3.grenode.net.
@                   IN  NS      ns5.grenode.net.
@                   IN  NS      ns6.grenode.net.

Penser à ajouter dans le fichier les MX et d'autres enregistrements si voulus…

Pusher les mises à jour.

Relance

Sur gaffe / radeau :

systemctl restart bind9

Sur outils (normalement pas nécessaire) :

systemctl restart knot