Etape 5 – Le serveur DNS : Bind9

Etape 5 – Le serveur DNS : Bind9

Vous êtes ici :
Article 7/11 de la série suivante :

1. Introduction

Un serveur DNS a 2 rôles :

  • Obtenir la correspondance entre un nom de domaine et une adresse IP
  • Transmettre aux autres serveurs de noms les adresses IP des zones de vos domaines.

De plus, il existe les serveurs DNS primaires qui définissent des zones pour votre domaine, et les DNS secondaires qui relaient ces données de zones. Je vais vous expliquer comment faire un DNS qui sera à la fois selon le cas primaire / secondaire et de cache (chargé de résoudre les noms pour votre réseau local).

Je ne vais pas vous faire un cours sur les serveurs DNS, mais comme d’habitude vous trouverez ici des fichiers à presque copier-coller et à adapter facilement pour avoir un serveur DNS qui fonctionne très rapidement 🙂

2. Installation

apt update
apt upgrade
apt install --yes bind9

3. Configuration de base

3.1 – Changement du répertoire (optionnel) /serveur/dns

3.1.1 Avec ZFS

Cette modification est surtout recommandée quand vous utilisez ZFS pour mettre toutes vos données dans le même dataset.

On créé donc le dataset où l’on va stocker les données des domaines :

zfs create rpool/serveur/dns
chown root:bind /serveur/dns
chmod 775 /serveur/dns
3.1.2 Sans ZFS

On créé le répertoire où l’on va stocker les données des domaines :

mkdir /serveur/dns
chown root:bind /serveur/dns
chmod 775 /serveur/dns

3.2 – Fichier /etc/logrotate.d/bind

/var/log/bindsecurity.log {
	daily
	rotate 7
	compress
	delaycompress
	missingok
	notifempty
	create 0644 bind root
	postrotate
	/usr/sbin/rndc reload > /dev/null 2>&1 || true
  	endscript
}

Sans oublier de créer le fichier /var/log/bindsecurity.log :

touch /var/log/bindsecurity.log && chmod 664 /var/log/bindsecurity.log && chown bind:bind /var/log/bindsecurity.log

3.3 – Fichier /etc/resolv.conf

nameserver 127.0.0.1
nameserver ::1

3.4 – Fichier /etc/host.conf

order hosts,bind
multi on

4. Scénario 1 – Serveur de cache & dns local (Serveur Maison IPv4 Only)

4.1 – Fichier /etc/default/bind

Sur ce type de serveur l’IPv4 est le plus souvent inutile donc on désactive

# run resolvconf?
RESOLVCONF=no

# startup options for the server
OPTIONS="-u bind -4"

4.2 – Fichier /etc/bind/named.conf.options

logging {
    channel security_file {
        file "/var/log/bindsecurity.log" versions 3 size 30m;
        severity dynamic;
        print-time yes;
    };
    category security {
        security_file;
    };
};

options {
    directory "/serveur/dns";
    dnssec-validation auto;
    auth-nxdomain no;

    // On cache la version de bind
    version "version";
    // On limite son utilisation
    listen-on { 127.0.0.1; 192.168.0.1;};
    allow-transfer { none; };
    allow-query { 192.168.0.0/24; 127.0.0.1; };
    allow-recursion  { 192.168.0.0/24; 127.0.0.1; };

    // On desactive IPV6
    listen-on-v6 { none; };
};

4.2 – Fichier /etc/bind/named.conf.local

//
// Configuration locale
//

// DNS LOCAL
zone "monreseau.lan" {
        type master;
        file "/serveur/dns/db.monreseau.lan";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "/serveur/dns/db.monreseau.lan.rev";
};

4.3 – Exemples de fichiers de zones pour un domaine local (monreseau.lan)

  • Zone locale :
;
; Zone de monreseau.lan (domaine local)
;
$TTL    604800
@       IN      SOA     monordi.monreseau.lan. root.monreseau.lan. (
                     2018030301         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      monordi.monrezo.lan.

monordi         IN      A       192.168.0.1
autrordi        IN      A       192.168.0.2
  • Zone reverse locale :
;
; Zone Reverse de monreseau.lan (domaine local)
;
$TTL    604800
@       IN      SOA     monordi.monreseau.lan. root.monreseau.lan. (
                     2018030301         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      monordi.monreseau.lan.
1       IN      PTR     monordi.monreseau.lan.
2       IN      PTR     autreordi.monreseau.lan.

Vous ne pouvez faire des zones reverses (inversées) que pour les domaines locaux. Pour les autres, il faut configurer directement à partir du fournisseur d’IP (chez online par exemple ou chez votre fournisseur d’accès).

5. Scénario 2 – Serveur DNS Primaire (ou Secondaire)

5.1 – Fichier /etc/bind/named.conf.options

acl ipv4-ok {
    127.0.0.1;
    1.2.3.4;
    5.6.7.8;
};

acl ipv6-ok {
    ::1;
    1111:2222::3333:4444;
};


logging {
    channel security_file {
        file "/var/log/bindsecurity.log" versions 3 size 30m;
        severity dynamic;
        print-time yes;
    };
    category security {
        security_file;
    };
};

options {
    directory "/serveur/dns";
    dnssec-validation auto;
    auth-nxdomain no;

    // On cache la version de bind
    version "version";

    allow-transfer { none; };
    allow-query { ipv4-ok; ipv6-ok; };
    allow-recursion  { ipv4-ok; ipv6-ok; };

    // On ouvre le serveur sur l'IPv4
    listen-on { 127.0.0.1; 1.2.3.4;};
    query-source address 1.2.3.4 port *;
    transfer-source 1.2.3.4;
    notify-source 1.2.3.4;

    // On ouvre le serveur sur l'IPv6                                                                                                                                                            
    listen-on-v6 { ::1;  1111:2222::3333:4444;};
    query-source-v6 address 1111:2222::3333:4444 port *;
    transfer-source-v6 1111:2222::3333:4444;
    notify-source-v6 1111:2222::3333:4444;

};

5.2 – Fichier /etc/bind/named.conf.local

5.2.1 – Version DNS Primaire
//
// Configuration locale
//

// IP du serveur dns secondaire
acl "ip_ns2" {
        // ns2.mondomaine.com
        10.20.30.40;
        2222:3333::4444:5555
};

// DNS PRIMAIRE
zone "domainecool.net" {
        type master;
        file "/serveur/dns/db.domainecool.net";
        allow-transfer { ip_ns2; };
        allow-query { any; };
};
5.2.2 – Version DNS Secondaire
//
// Configuration locale
//

// IP d'un serveur dns primaire
acl "ip_ns1_autre" {
        // ns1.autredomaine.fr
        50.60.70.80;
        1111:2222::3333:4444;
};

// DNS SECONDAIRE
zone "undomaine.com" {
        type slave;
        file "/serveur/dns/secondaire/db.undomaine.com";
        masters { ip_ns1_autre;};
        allow-query { any; };
        notify no;
};

5.3 – Exemple de fichiers de zones

;
; Zone de domaineprim.net
;
$TTL    3D
@       IN      SOA     monordi.mondomaine.net. contactdns.mondomaine.net. (
                     2018020304         ; Serial
                          86400         ; Refresh
                           7200         ; Retry
                        3628800         ; Expire
                         604800 )       ; Negative Cache TTL

        IN      NS      monordi.mondomaine.net.
        IN      NS      ns2.mondomaine.net.
        IN      MX      10      mx1.mondomaine.net.
        IN      MX      30      mx2.mondomaine.net.

domaineprim.net. IN      A       1.2.3.4
www              IN      A       1.2.3.4
blog             IN      A       1.2.3.4
ftp              IN      A       1.2.3.4
www6             IN      AAAA    2222:3333::4444:8888
  • Le serial 2018020304 a un format précis que vous devez respecter, ce serial ici signifie que la dernière modification a eu le 03/02/2018 et que c’est la 4ème modification (vous l’avez compris vous êtes limités à 99 modifications par jours).
  • monordi.mondomaine.net pointe vers votre serveur (vu que c’est lui le serveur primaire), il faut donc aller au préalabe configurer votre serveur primaire qui gere mondomaine.net.
  • Le point terminal . indique que c’est une adresse complete, si vous ne mettez pas de point il complete par le nom du domaine.

Il y a deux façon de mettre en place un serveur primaire :

  • On peut utiliser un domaine que j’appelle « utilitaire », c’est à dire qu’il ne va servir qu’à nommer des serveurs par exemple ns1.mondomaine.net, ns2.mondomaine.net, monordi.mondomaine.net, etc… Ce domaine doit être géré intégralement par votre registrar (au passage je vous conseille Bookmyname). Ainsi chez ce registrar (chez qui vous avez déclaré domaineprim.net) vous indiquez monordi.mondomaine.net comme serveur primaire.
  • L’autre façon de faire est de s’auto-déclarer auprès des serveurs root (voir avec votre registrar), cela permet d’avoir comme adresse de dns ns1.domaineprim.net et ns2.domaineprim.net qui gere domaineprim.net

5.4 – Délégation IPv6

Si vous avez un bloc IPv6 chez online vous souhaitez peut être faire en sorte que le reverse DNS IPv6 fonctionne (c’est obligatoire pour un serveur de mail par exemple).

[...]
// Pour un bloc 2001:0bd6:2743::/48
zone "3.4.7.2.6.d.b.0.1.0.0.2.ip6.arpa" {
        type master;
        file "/serveur/dns/db.3.4.7.2.6.d.b.0.1.0.0.2.ip6.arpa";
        allow-transfer { 1111:2222::3333:4444; };
        allow-query { any; };
};
[...]

Puis vous créez un fichier zone PTR (vous pouvez vous aider du site rdns6.com) :

;
; 2001:0bd6:2743::/48
;
; Zone file built with the IPv6 Reverse DNS zone builder
; http://rdns6.com/
;
$TTL 1h	; Default TTL
@	IN	SOA	ns1.mondomaine.net. contactdns.mondomaine.net. (
	2018080601	; serial
	1h		; slave refresh interval
	15m		; slave retry interval
	1w		; slave copy expire time
	1h		; NXDOMAIN cache time
	)

;
; domain name servers
;
@	IN	NS	ns1.mondomaine.net.
@	IN	NS	ns2.mondomaine.net.

; IPv6 PTR entries
1.0.0.0.8.0.1.0.5.0.0.0.1.0.0.0.1.1.1.0.3.4.7.2.6.d.b.0.1.0.0.2.ip6.arpa.    IN    PTR    ns1.mondomaine.net.
2.0.0.0.8.0.1.0.5.0.0.0.1.0.0.0.1.1.1.0.3.4.7.2.6.d.b.0.1.0.0.2.ip6.arpa.    IN    PTR    ns2.mondomaine.net.
3.0.0.0.8.0.1.0.5.0.0.0.1.0.0.0.1.1.1.0.3.4.7.2.6.d.b.0.1.0.0.2.ip6.arpa.    IN    PTR    www.mondomaine.net.

6. Astuces

6.1 Prendre en compte les changements de fichiers zones

rndc reload

6.2 L’utilitaire DIG

  • L’utilitaire dig est très pratique analyser les zones d’un domaine (nécessite le package dnsutils)
apt install --yes dnsutils
dig free.fr
; <<>> DiG 9.10.3-P4-Debian <<>> free.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27415
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;free.fr.			IN	A

;; ANSWER SECTION:
free.fr.		86392	IN	A	212.27.48.10

;; AUTHORITY SECTION:
free.fr.		93849	IN	NS	freens2-g20.free.fr.
free.fr.		93849	IN	NS	freens1-g20.free.fr.

;; ADDITIONAL SECTION:
freens1-g20.free.fr.	93849	IN	A	212.27.60.19
freens2-g20.free.fr.	93849	IN	A	212.27.60.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 04 22:05:41 CET 2018
;; MSG SIZE  rcvd: 136

6.3 Fixer le fichier /etc/resolv.conf

Ce fichier peut être mis parfois à jour par inadvertance. Si vous souhaitez le paramétrer une bonne fois pour toute rien de plus simple :

chattr +i /etc/resolv.conf

Et afin d'être totalement tranquille (version ceinture ET bretelles), créez un fichier /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate :

#!/bin/sh
make_resolv_conf(){
    :
}

Sans oublier de le rendre executable :

chmod +x /etc/dhcp/dhclient-enter-hooks.d/nodnsupdate

Laisser un commentaire

Votre adresse de messagerie 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 comment les données de vos commentaires sont utilisées.