Serveur DNS avec BIND
Serveur DNS
La mise en place d’un serveur DNS sur votre réseau local permettra de résoudre localement les noms des différents serveurs ou poste de travail de votre réseaux. De plus, correctement configuré, cela permettra au serveur DHCP de mettre à jour dynamiquement les noms et adresse des clients du serveur.
Commencez par installer le serveur DNS :
apt-get install bind9 bind9-doc
- La signature TSIG
Cette signature a pour but d’authentifier les transactions avec BIND. Ainsi, le serveur DHCP ne pourra mettre à jour le domaine example.com que s’il dispose de cette clef.
On recopie une clef existante
cd /etc/bind/ cp rndc.key ns-example-com_rndc.key
Dans le cas où le fichier rndc.key ne serait pas existant (peu probable), créez le et copiez y le texte suivant.
key « rndc-key » { algorithm hmac-md5 ; secret «QJc08cnP1xkOF4a/eSZZbw== » ; } ;
Une fois la clef copiée, on en génère une nouvelle :
dnssec-keygen –a HMAC-MD5 –b 512 –n USER ns-example-com_rndc-key
En plus de générer la clef, cette commande va générer deux fichiers, l’un avec une extension key, l’autre avec une extension private. Ces deux fichiers pourront être supprimés.
Par mesure de sécurité, la clef elle-même ne devra pas être lisible par tout le monde car la configuration de Bind est, quand à elle, lisible par tout le monde.
Chmod 640 ns-example-com_rndc.key
- Le fichier named.conf
Ce fichier est le fichier principal de configuration du serveur DNS.(pensez à remplacer yyy.yyy.yyy.0
par la plage réseau de votre réseau interne) :
// Gérer les acls acl internals { 127.0.0.0/8; yyy.yyy.yyy.0/24; }; // Charger les options include "/etc/bind/named.conf.options"; // Déclaration de la clef TSIG utilisée pour la mise à jour dynamique include "/etc/bind/ns-example-com_rndc-key"; // Configurer le canal de communication pour administrer BIND9 avec rndc // Par défaut, la clef est située dans le fichier rndc.key et utilisée par // rndc et bind9 sur localhost controls { inet 127.0.0.1 port 953 allow { 127.0.0.1; }; }; // prime the server with knowledge of the root servers zone "." { type hint; file "/etc/bind/db.root"; }; // be authoritative for the localhost forward and reverse zones, and for // broadcast zones as per RFC 1912 zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; include "/etc/bind/named.conf.local";
- Le fichier named.conf.options
Ce fichier contient l’ensemble des options du serveur DNS :
options { directory "/var/cache/bind"; // Port d'échange entre les serveurs DNS query-source address * port *; // Transmettre les requêtes à 192.168.1.1 si ce serveur ne sait pas résoudre ces adresses. // On pourrait aussi bien renseigner les serveurs DNS du FAI plutôt que de renseigner // l'adresse IP du routeur (xxxbox) forward only; forwarders { xxx.xxx.xxx.1; }; auth-nxdomain no; # conform to RFC1035 // Ecouter sur les interfaces locales uniquement (IPV4) listen-on-v6 { none; }; listen-on { 127.0.0.1; yyy.yyy.yyy.11; }; // Ne pas transférer les informations de zones aux DNS secondaires allow-transfer { none; }; // Accepter les requêtes pour le réseau interne uniquement allow-query { internals; }; // Autoriser les requêtes récursives pour les hôtes locaux allow-recursion { internals; }; // Ne pas rendre publique la version de BIND version none; };
Pour des raisons de sécurité, le port lié à l’option query-source ne doit pas être figé.
Afin de diminuer la temporisation de timeout pour les connexions UDP, saisissez la commande suivante :
sysctl -w net.netfilter.nf_conntrack_udp_timeout=10
- Le fichier named.conf.local
Ce fichier contient la configuration locale du serveur, on y indique les zones associées au domaine :
// Gérer les fichiers de logs include "/etc/bind/named.conf.log"; // Gestion du domaine example.com // ------------------------------ // - Le serveur est défini comme maître sur ce domaine // - Il n'y a aucun forwarder pour ce domaine car nous avons la main mise dessus. // Pour tous les autres domaines, nous utiliserons le forwarder mentionné dans *named.conf.options* // - Les entrees sur le domaine peuvent être ajoutées dynamiquement avec le clef ns-example-com_rndc-key zone "example.com" { type master; file "/var/cache/bind/db.example.com"; forwarders {}; allow-update { key ns-example-com_rndc-key; }; }; zone "zzz.yyy.xxx.in-addr.arpa" { type master; file "/var/cache/bind/db.example.com.inv"; forwarders {}; allow-update { key ns-example-com_rndc-key; }; }; // Consider adding the 1918 zones here, if they are not used in your // organization include "/etc/bind/zones.rfc1918";
Dans ce fichier de configuration, vous remarquerez deux paramètres important :
zone "zzz.yyy.xxx.in-addr.arpa" {
l’adresse zzz.yyy.xxx
correspond à l’inverse de votre plage réseau. Je m’explique, votre plage réseau est 192.168.100.0/24, vous indiquerez donc 100.168.192.in-addr.arpa
include "/etc/bind/zones.rfc1918";
La RFC1918 définit les classes de réseaux réservés pour les réseaux privés. Pour chaque classe de réseau de type A, B ou C, une plage est réservée :
Classe | Préfixe | Bloc | Plage IP | Nombre d’adresses |
A | 10.0.0.0/8 | Bloc 24 bit | 10.0.0.0 – 10.255.255.255 | 16 777 216 |
B | 172.16.0.0/12 | Bloc 20 bit | 172.16.0.0 – 172.31.255.255 | 1 048 576 |
C | 192.168.0.0/16 | Bloc 16 bit | 192.168.0.0 – 192.168.255.255 | 65 536 |
Donc si vous décidez de constituer votre réseau en utilisant une des plages d’adresses de la RFC1918, vous n’aurez pas besoin de décrire vos zones au sein de la configuration de BIND9 car ces zones le sont déjà dans le fichier "/etc/bind/zones.rfc1918".
- Le fichier named.conf.log
Ce fichier sert à définir les différentes méthodes de log pour les différentes catégories
logging { channel update_debug { file "/var/log/update_debug.log" versions 3 size 100k; severity debug; print-severity yes; print-time yes; }; channel security_info { file "/var/log/security_info.log" versions 1 size 100k; severity info; print-severity yes; print-time yes; }; channel bind_log { file "/var/log/bind.log" versions 3 size 1m; severity info; print-category yes; print-severity yes; print-time yes; }; category default { bind_log; }; category lame-servers { null; }; category update { update_debug; }; category update-security { update_debug; }; category security { security_info; }; };
- Les Ressources Records
Un DNS est constitué de plusieurs enregistrements, les Ressources Records, définissant les informations relatives au domaine.
Chaque Ressources Records est constitué de deux fichiers. Prenons pour exemple le domaine example.com :
- pour la résolution de noms, on trouvera le fichier db.example.com qui contient les éléments suivants :
$TTL 3600 @ IN SOA sid.example.com. root.example.com. ( 2007010401 ; Serial 3600 ; Refresh [1h] 600 ; Retry [10m] 86400 ; Expire [1d] 600 ) ; Negative Cache TTL [1h] ; @ IN NS sid.example.com. @ IN MX 10 sid.example.com. sid IN A 192.168.0.1 etch IN A 192.168.0.2 pop IN CNAME sid www IN CNAME sid mail IN CNAME sid
- pour la résolution inverse, on trouvera le fichier db.example.com.inv qui contient les éléments suivants :
@ IN SOA sid.example.com. root.example.com. ( 2007010401 ; Serial 3600 ; Refresh [1h] 600 ; Retry [10m] 86400 ; Expire [1d] 600 ) ; Negative Cache TTL [1h] ; @ IN NS sid.example.com. 1 IN PTR sid.example.com. 2 IN PTR etch.example.com.
Explications :
- $TTL : (Time To Live) exprime la durée (en secondes) de validité, par défaut, des informations que contiennent les RRs. Une fois ce délai expiré, il est nécessaire de vérifier à nouveau les données. Les différents types :
- SOA: permet de définir les informations relatives à la zone. En l’occurrence le nom du serveurDNS primaire « sid.example.com. » et l’adresse mail du contact technique (root.example.com. ; le @ estremplace par un point). Il estcompose de plusieurs champs :
- Serial : est un entier non signé 32 bits. C’est le numéro de série à incrémenter à chaque modification du fichier. Il permet au serveur secondaire de recharger les informations qu’ils ont. L’usage général vient à le formater de cette manière YYYYMMDDXX, soit pour la première modification du 01/04/2007 -> 2007040101, pour la seconde 2007040102.
- Refresh : définit la période de rafraîchissement des données.
- Retry : si une erreur survient au cours du dernier rafraîchissement, celle-ci sera répétée au bout du délai Retry.
- Expire : le serveur sera considéré comme non disponible au bout du délai Expire.
- Negative cache TTL : définit la durée de vie d’une réponse NXDOMAIN de notre part.
NS : renseigne le nom des serveurs de noms pour le domaine.
MX : renseigne sur le serveur de messagerie. Plusieurs peuvent être définis. Ainsi, il est possible de leur donner une priorité en leur affectant un numéro. Plus bas est le numéro, plus haute est la priorité.
A : associe une nom d’hôte à une adresse ipv4 (32 bits)
AAAA : associe une nom d’hôte à une adresse ipv6 (128 bits)
CNAME : identifie le nom canonique d’un alias (un nom pointant sur un autre nom)
PTR : c’est simplement la résolution inverse (le contraire du type A).
Les classes : IN détermine l’association a la classe Internet. D’autres classes sont disponibles (CH et HS). Pour de plus amples informations vous pouvez consulter la RFC 1035
- Fichier /etc/resolv.conf
Ce fichier est utilisé pour la résolution de noms, il indique au serveur DNS par quel noms de domaines compléter le nom recherché.
Éditez le et insérez la ligne suivante :
search example.com
Ainsi si vous rechercher « mail », le DNS saura qu’il faut rechercher « mail.example.com »
- Chroot de bind
Par défaut, la configuration de bind emploie l’utilisateur bind pour exécuter le démon named. Ainsi, on retrouve cette option dans /etc/default/bind9
:
OPTIONS="-u bind"
qui est pris en compte lors du lancement du service bind9. Voici un extrait du fichier /etc/init.d/bind9
:
test -f /etc/default/bind9 && . /etc/default/bind9 ... if start-stop-daemon --start --quiet --exec /usr/sbin/named \ --pidfile /var/run/bind/run/named.pid -- $OPTIONS;
C’est déjà une bonne chose. Mais à cela, il faut ajouter l’utilisation d’une racine autre que / pour emprisonner le démon named dans sa prison. Il s’agit tout simplement d’employer l’option « -t
» en précisant le répertoire de chroot. La variable OPTIONS dans le fichier /etc/default/bind9
devient :
OPTIONS="-u bind -t /var/lib/named"
Maintenant il faut créer l’arborescence dans le chroot.
/var/lib/named/ | |__ /etc |__ /dev |__ /var |__ /cache | |__ /bind | |__ /log
mkdir -p /var/lib/named/etc mkdir /var/lib/named/dev mkdir -p /var/lib/named/var/cache/bind mkdir /var/lib/named/var/log
On déplace l’ancien répertoire de travail de Bind dans la prison, et l’on met en place un lien symbolique /etc/bind
vers ce même répertoire pour permettre au processus rndc de retrouver ces petits puisqu’il va utiliser le fichier rndc.key par défaut pour s’authentifier sur le channel d’administration port 953.
mv /etc/bind /var/lib/named/etc ln -s /var/lib/named/etc/bind /etc/bindOn ajoute les périphériques null et random : mknod /var/lib/named/dev/null c 1 3 mknod /var/lib/named/dev/random c 1 8 chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
Pour autoriser le démon Syslog à prendre en compte les logs de bind, il nous faut lui préciser d’écouter le socket /var/lib/named/dev/log
. Pour ce faire, modifier le fichier /etc/default/syslogd
pour utiliser l’option suivante.
SYSLOGD="-a /var/lib/named/dev/log"
Une dernière chose, consiste à créer le répertoire pour stocker le pid du processus. J’ai opté pour une amélioration du fichier de démarrage du service. J’ai modifié le fichier /etc/init.d/bind9
:
- Création de la variable CHROOT_DIR
- Modification de la création du répertoire contenant le pid du processus
CHROOT_DIR=`echo $OPTIONS | cut -d ' ' -f 4` # dirs under /var/run can go away on reboots. mkdir -p $CHROOT_DIR/var/run/bind/run chmod 775 $CHROOT_DIR/var/run/bind/run chown root:bind $CHROOT_DIR/var/run/bind/run >/dev/null 2>&1 || true
Il faut déplacer les fichiers précédemment stockés dans /var/cache/bind/
, dans /var/lib/named/var/cache/bind
mv /var/cache/bind/* /var/lib/named/var/cache/bind/
L’arborescence est complète et tous les fichiers sont présents, mais les droits ne sont pas encore corrects, donc :
chown -R root:bind /var/lib/named/etc/bind chmod 640 /var/lib/named/etc/bind/* chown bind:bind /var/lib/named/var/*
- Gestion des clients
Comme je l’ai mentionne au début, l’attribution des adresses IP sur le réseau local est effectuée par le serveur DHCP.
Ainsi, pour définir notre serveur DNS aux différents clients, il est nécessaire d’ajouter au fichier de configuration DHCP les deux lignes suivantes :
* option domain-name "example.com" * option domain-name-servers sid.example.com
- Partage de fichier entre Samba, Docker et SELinux – 29/11/2017
- Mise à jour vers Windows 10 : Pas assez de mémoire vive… – 24/08/2015
- Améliorer les performances RAID – 15/05/2015