Etape 5 – Le serveur DNS : Bind9
- Introduction
- Etape 1 (V1) – Installation – Boot EFI & ZFS on Debian Bullseye avec Proxmox (sans cryptage / serveur local)
- Prochainement: Etape 1 (V2) – Installation – Disque crypté LUKS RAID & Debian Bullseye avec Proxmox
- Etape 1 (V1) – Installation – ZFS Native Encryption & Debian Bullseye avec Proxmox
- Etape 2 – Le firewall IPv4 : Shorewall
- Etape 3 – Le firewall IPv6 : Shorewall6
- Etape 4 – Le serveur DHCP : isc-dhcp-server
- Etape 5 – Le serveur DNS : Bind9
- Etape 6 – La base de données : MariaDB
- Etape 7 – Le serveur WEB : Nginx & SSL (Let’s Encrypt)
- Etape 8 – Le partage de fichier : SAMBA (Compatible Time Machine Monterey)
- Etape 9 – Le serveur de MAIL : Postfix / Dovecot / Rspamd
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