Comme très bien défini par le JDN, le DNS (Domain Name System) est un service dont la principale fonction est de traduire un nom de domaine en adresse IP. Pour simplifier, le serveur DNS est un peu l’annuaire que consulte un ordinateur au moment d’accéder à un autre ordinateur via un réseau
Nous allons voir comment mettre en place un serveur DNS avec Bind sous Debian 9.
Installation et configuration de Bind
Dans ce tutoriel je pars d’un serveur sous Debian 9 fraichement installé et à jour. Dans l’exemple, je vais gérer le domaine domain.tld avec un adressage réseau en 10.1.2.0 /24. N’oubliez donc pas de modifier votre configuration avec votre domaine, et vos adresses IP.
Nous allons commencer par installer Bind ainsi que quelques utilitaires (dig, nslookup, host et rndc) compris dans le paquet dnsutils.
1 | apt-get install bind9 dnsutils |
Nous allons continuer en modifiant le fichier de configuration principal de Bind.
1 | nano /etc/bind/named.conf.options |
Notons que j’ai déclaré une ACL avec le sous réseau de mon LAN pour limiter les clients effectuant des requêtes sur le serveur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | acl "mylan" { 10.1.2.0/24; #LAN }; options { directory "/var/cache/bind"; dnssec-enable yes; dnssec-validation auto; auth-nxdomain no; listen-on { 127.0.0.1; 10.1.2.2; #IP_SERVEUR }; allow-query { mylan; }; allow-recursion { mylan; }; allow-transfer { none; }; notify yes; allow-update { none; }; zone-statistics yes; statistics-file "/var/cache/bind/stats.log"; version none; hostname none; server-id none; }; |
Par la suite, nous allons déclarer les zones que notre serveur va gérer. En l’occurence la zone « classique » et la zone « inversée ».
1 | nano /etc/bind/named.conf.local |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | zone "domain.tld" IN { type master; file "/etc/bind/zones/db.domain.tld"; #FICHIER_ZONE allow-transfer { 10.1.2.3; #DNS_SECONDAIRE }; allow-query { atomic; #ACL }; notify yes; }; zone "2.1.10.in-addr.arpa" IN { type master; file "/etc/bind/zones/db.2.1.10.in-addr.arpa"; #FICHIER_ZONE allow-transfer { 10.1.2.3; #DNS_SECONDAIRE }; allow-query { atomic; #ACL }; notify yes; }; |
Nous allons maintenant créer le répertoire et les fichiers qui contiendront nos fichiers de zones.
1 2 | mkdir /etc/bind/zones touch {/etc/bind/zones/db.domain.tld,/etc/bind/zones/db.2.1.10.in-addr.arpa} |
Il ne reste plus qu’à remplir nos enregistrements DNS.
1 | nano /etc/bind/zones/db.domain.tld |
Voici un exemple de zone « classique ». Lorsque l’on modifie un fichier de zone, il est important de penser à incrémenter le serial pour que le changement soit pris en compte.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | ; ZONE : domain.tld $TTL 3600 @ IN SOA ns1.domain.tld. hostmaster.domain.tld. ( 2017090401 ; SERIAL (DATE+NUMBER) 86400 ; REFRESH (SEC) 3600 ; RETRY (SEC) 3600000 ; EXPIRE (SEC) 300 ) ; MINIMUM (SEC) ; CHAMPS NS ; ------------------------------------------------------------------------ @ IN NS ns1.domain.tld. @ IN NS ns2.domain.tld. ; CHAMPS A ; ------------------------------------------------------------------------ rtr IN A 10.1.2.1 ns1 IN A 10.1.2.2 ns2 IN A 10.1.2.3 ; CHAMPS CNAME ; ------------------------------------------------------------------------ vpn IN CNAME rtr ; CHAMPS MX ; ------------------------------------------------------------------------ ; CHAMPS TXT ; ------------------------------------------------------------------------ |
Nous allons faire la même opération pour la zone « inversée ».
1 | nano /etc/bind/zones/db.2.1.10.in-addr.arpa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ; ZONE : 2.1.10.in-addr.arpa $TTL 3600 @ IN SOA 2.1.10.in-addr.arpa. hostmaster.2.1.10.in-addr.arpa. ( 2017090401 86400 3600 3600000 300 ) ; CHAMPS NS ; ------------------------------------------------------------------------ @ IN NS ns1.domain.tld. @ IN NS ns2.domain.tld. ; CHAMPS PTR ; ------------------------------------------------------------------------ 1.2.1.10.in-addr.arpa. IN PTR rtr.domain.tld. 2.2.1.10.in-addr.arpa. IN PTR ns1.domain.tld. 3.2.1.10.in-addr.arpa. IN PTR ns2.domain.tld. |
Il ne nous reste plus qu’à vérifier la validité de nos fichiers de configuration.
1 | named-checkconf -z |
Si tout se passe bien, on devrait obtenir une réponse similaire à la suivante :
1 2 3 4 5 6 | zone domain.tld/IN: loaded serial 2017090401 zone 2.1.10.in-addr.arpa/IN: loaded serial 2017090401 zone localhost/IN: loaded serial 2 zone 127.in-addr.arpa/IN: loaded serial 1 zone 0.in-addr.arpa/IN: loaded serial 1 zone 255.in-addr.arpa/IN: loaded serial 1 |
Nous pouvons enfin relancer le service Bind9 et tester notre serveur en l’interrogeant.
1 | systemctl restart bind9 |
1 | dig +short NS domain.tld |
La commande précédente permet ainsi de lister les serveurs de noms renseignés pour notre domaine.
Il est bien sur possible de faire varier les arguments de DIG pour récupérer des enregistrements de notre zone.
A la fin de la réponse de DIG on peut également vérifier que c’est bien notre serveur qui répond.
1 2 3 4 | ;; Query time: 8 msec ;; SERVER: 10.1.2.2#53(10.1.2.2) ;; WHEN: Mon Sep 04 15:00:00 CEST 2017 ;; MSG SIZE rcvd: 265 |
Nous pouvons donc désormais utiliser notre serveur DNS dans notre LAN pour résoudre les enregistrements liés à notre domaine.
Si vous souhaitez utiliser votre serveur pour un domaine « public », il sera nécessaire d’ouvrir le port 53 en UDP sur l’extérieur et de modifier l’ACL créée pour notre LAN. Par ailleurs il faudra également modifier les serveurs de noms de votre domaine chez votre registrar.
N’hésitez pas à me faire part de vos remarques ou de vos questions dans les commentaires.