Comment installer un serveur DNS sous Ubuntu 19.04

Publié par Stéphane Brault

Un serveur DNS (Domain Name System) permet la résolution de noms de domaine en adresse IP et vice-versa, que ce soit sur un réseau privé ou sur Internet. Le logiciel de DNS le plus populaire est sans contredit BIND. Dans ce tutoriel, nous verrons comment installer et configurer Bind sur un serveur Ubuntu 19.04.

Pour la cause, j’utilise VirtualBox avec deux serveurs virtuels sous Ubuntu 19.04. Voici l’environnement utilisé:

  • Domaine: webmestre101.lan
  • Serveur de nom « master »: ubuntu01.webmestre101.lan (192.168.1.15)
  • Serveur de nom « slave »: ubuntu02.webmestre101.lan (192.168.1.16)
  • Serveur web et mail: ubuntu3.webmestre101.lan (192.168.1.17)

Avant d’installer un serveur de noms, assurez-vous toujours que celui-ci a une adresse IP statique (sauf si vous n’en faites qu’un usage local évidemment).

Installation de BIND9 sur Ubuntu 19.04

Utilisez la command apt pour installer BIND9 ainsi que les packages reliés:

sudo apt install bind9 bind9utils bind9-doc dnsutils -y

Vous pouvez maintenant activer le service bind9 au démarrage du serveur:

sudo systemctl enable bind9

Si Uncomplicated Firewall (UFW) est actif sur votre serveur Ubuntu, ouvrez les ports nécessaires:

sudo ufw allow bind9

L’installation est complétée. Avant de démarrer le service, il est primordial de passer à la configuration.

Configuration d’un serveur DNS relais uniquement

Un serveur DNS peut servir exclusivement de relais entre des clients et d’autres serveurs DNS. Par ailleurs, ce type d’usage est courant sur des réseaux privés. Un serveur DNS de relais sert aussi à cacher le résultat des requêtes effectuées.

Afin de configurer un serveur DNS pour qu’il serve uniquement de relais, modifiez le fichier de configuration:

sudo nano /etc/bind/named.conf.options

Configurez maintenant les options comme suit:

options { 
       directory "/var/cache/bind"; 
       listen-on port 53 { 127.0.0.1; 192.168.1.15; };
       allow-query { localhost; 192.168.1.0/24; };
       allow-recursion { localhost; 192.168.1.0/24; };
       forwarders { 8.8.8.8; }; 
       recursion yes; 
       dnssec-enable yes; 
       dnssec-validation auto; 
};

Démarrez (ou redémarrez) le service bind9:

sudo systemctl restart bind9

Faites maintenant un test:

Le serveur DNS a bien résolu le nom de domaine demandé. 

Attention: Il est important de noter que la récursion sur un serveur DNS est nécessaire pour le caching. Toutefois, cela rend le serveur vulnérable à de fausses requêtes qui le surchargeraient au point de ne plus répondre. Par conséquent, si vous activez la récursion, il est important de limiter l’accès à la plage d’adresses IP du réseau privé seulement.

Si vous n’avez besoin que d’un serveur DNS de cache et / ou de relais, nul besoin de lire plus loin.

Configuration du serveur DNS primaire

Le serveur primaire (ou le « master ») est le serveur sur lequel toutes les modifications de zones DNS seront effectuées. Ces modifications seront ensuite synchronisées sur le serveur secondaire (ou « slave »). Il peut y avoir plusieurs serveurs secondaires. Lorsqu’un serveur DNS est le serveur officiel d’un nom de domaine, on dit qu’il est le « serveur autorisant ». En Anglais, on parle d’un serveur DNS « authoritative ».

Pour ce tutoriel, nous mettrons en place un « serveur faisant autorité » exclusivement. Par conséquent, celui-ci ne pourra servir de relais.

Sur le serveur DNS primaire, modifiez le fichier de configuration named.conf.options. Notez qu’il s’agit en partie de la même configuration qu’à l’étape précédente.

sudo nano /etc/bind/named.conf.options

Configurez ensuite les options comme suit:

options {
        directory "/var/cache/bind";
        listen-on port 53 { any; };
        allow-query { any; };
        allow-transfer { 192.168.1.16; };
        recursion no;
        dnssec-enable yes;
        dnssec-validation auto;
        auth-nxdomain no;
};

Nous allons maintenant créer une zone DNS pour le domaine « webmestre101.lan ». Commencez par modifier le fichier /etc/bind/named.conf.local pour y ajouter les lignes suivantes:

zone    "webmestre101.lan"    { 
        type master;
        notify yes;
        also-notify { 192.168.1.16; };
        file "/etc/bind/zones/webmestre101.lan.db";
};

Sauvegardez le fichier et quittez l’éditeur. Créez ensuite un dossier pour contenir les fichiers de zones DNS ainsi que le fichier webmestre101.lan.db:

mkdir /etc/bind/zones
nano /etc/bind/zones/webmestre101.lan.db

Insérez les lignes suivantes dans le fichier:

; Designe le debut de cette zone DNS
$ORIGIN webmestre101.lan.
; Delai d'expiration par defaut pour chaque ressource de la zone
$TTL    86400
;
@       IN      SOA     ns1.webmestre101.lan. ubuntu01.webmestre01.lan. (
                2019041604      ; No serie
                6h              ; Cycle de mise a jour des serveurs secondaires
                1h              ; Delai de nouvelle tentative de synchronisation
                1w              ; Delai d'expiration sur les serveurs slaves
                1d              ; Delai d'expiration minimum
                )
;
; Adresse IP du domaine
;
@                     IN      A               192.168.1.17

;
; Serveurs DNS
;
webmestre101.lan.     IN      NS              ns1.webmestre101.lan.
webmestre101.lan.     IN      NS              ns2.webmestre101.lan.

;
; Adresses IP des serveurs DNS
;
ns1                   IN      A               192.168.1.15
ns2                   IN      A               192.168.1.16

;
; Serveur de courriel
;
webmestre101.lan.     IN      MX      10      mail.webmestre101.lan.
mail                  IN      A               192.168.1.17

;
; Noms canoniques pointant sur l'adresse IP du domaine
;
www                   IN      CNAME           webmestre101.lan.
ftp                   IN      CNAME           webmestre101.lan.

Notez qu’à chaque fois qu’une modification est faite à un fichier de zone DNS, la valeur du numéro de série doit être incrémentée pour que les changements soient pris en compte par le serveur.

Redémarrez le service « bind »:

sudo systemctl restart bind9

Testez maintenant la nouvelle zone DNS:

Si tout est bien configuré, le serveur répondra aux requêtes DNS pour le domaine webmestre101.lan.

Validation des fichiers de configuration et de zones DNS

Si le service bind ne redémarre pas après avoir modifié des fichiers, tapez la commande suivante:

sudo systemctl status bind9

Avec un peu de chance, vous y trouverez des informations qui vous permettront de résoudre le problème. Par contre, les messages d’erreur qu’on y trouve ne sont pas très détaillés.

Pour valider les fichiers de configuration de Bind, tapez la commande suivante:

sudo named-checkconf

Si vous ne passez de paramètre à la commande, la configuration par défaut sera validé. Si la commande ne retourne rien, c’est qu’il n’y a pas d’erreur.

Pour valider les zones DNS, utilisez la commande named-checkzone comme suit:

sudo named-checkzone webmestre101.lan /etc/bind/zones/webmestre101.lan.db

Corrigez les erreurs s’il y en a puis redémarrez le service bind9.

Configuration du serveur DNS secondaire

Un serveur DNS primaire peut fonctionner seul, il n’est pas nécessaire d’avoir un serveur secondaire. Toutefois, si vous hébergez une zone DNS publique, vous devez avoir au moins deux serveurs DNS.

Sur le serveur DNS secondaire, modifiez le fichier /etc/bind/named.conf.options et remplacez le contenu par celui-ci:

options { 
        directory "/var/cache/bind";
        listen-on port 53 { 127.0.0.1; 127.0.1.1; 192.168.1.16; };
        allow-query { any; };
        allow-new-zones yes;
        recursion no;
        allow-transfer { none; };
        dnssec-enable yes;
        dnssec-validation auto;
        auth-nxdomain no;
        allow-notify { 192.168.1.15; };
};

Toujours sur le serveur DNS secondaire, modifiez le fichier de configuration /etc/bind/named.conf.local pour y ajouter la zone webmestre101.lan:

zone "webmestre101.lan" { 
       type slave; 
       masters { 192.168.1.15; }; 
       file "/etc/bind/slaves/webmestre101.lan.db"; 
}; 

Créez un répertoire pour contenir les fichiers de zones DNS:

sudo mkdir /etc/bind/slaves
sudo chmod 0775 /etc/bind/slaves

Si apparmor est actif sur votre serveur Ubuntu, assurez-vous de permettre l’accès en écriture sur le répertoire créé:

sudo nano /etc/apparmor.d/usr.sbin.named

Ajoutez la ligne suivante:

[...]
/etc/bind/** r, 
/etc/bind/slaves/** rw, 
/var/lib/bind/** rw, 
/var/lib/bind/ rw, 
/var/cache/bind/** lrw, 
/var/cache/bind/ rw,
[...]

Redémarrez apparmor ainsi que bind:

sudo systemctl restart apparmor
sudo systemctl restart bind9

Vérifiez le contenu du dossier /etc/bind/slaves. Si le transfert de zone s’est effectué correctement entre le serveur primaire et le serveur secondaire, le fichier de zone DNS webmestre101.lan.db s’y trouvera.

Utilisez la commande dig pour tester le serveur DNS secondaire:

Si tout s’est bien passé, le serveur DNS secondaire peut maintenant répondre aux requêtes pour le domaine webmestre101.lan.

Les fichiers de journalisation (logs)

Par défaut, les évènements de bind seront journalisé dans /var/log/syslog. Afin que bind ait son propre fichier de log, créez le répertoire ainsi:

sudo mkdir /var/log/named
sudo chown root.bind /var/log/named
sudo chmod 0775 /var/log/named/

Insérez ensuite la configuration suivante au fichier /etc/bind/named.conf.local:

logging { 
       channel dnslog { 
               file "/var/log/named/named.log"; 
               severity dynamic; 
               print-time yes; 
               print-category yes; 
               print-severity yes; 
       }; 

       category queries { dnslog; }; 
       category default { dnslog; }; 
};

Si toutefois vous deviez faire du troubleshooting, utilisez:

severity debug;

Redémarrez ensuite bind. Vous pouvez maintenant visualiser le fichier de journalisation en temps réel pour des fins de débogage:

tail -f /var/log/named/named.log

Troubleshooting

Si vous rencontrez des problèmes de synchronisation entre les serveurs DNS, voici quelques trucs que vous pouvez essayer.

Commencez par vérifier la connexion au port 53 depuis le serveur primaire vers le serveur secondaire, et vice-versa à l’aide de la commande nc:

nc -zv 192.168.1.16 53

Si la connexion échoue, il y a probablement un problème de firewall.

Si la connexion réussi mais que la synchronisation ne fonctionne toujours pas, testez le transfert de zone manuellement. Depuis le serveur DNS secondaire, tapez la commande:

dig axfr @192.168.1.15 webmestre101.lan

Si la requête échoue, il y a donc un problème de configuration du côté du serveur DNS primaire.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.