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
  1. 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

 

  1. 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";

 

  1. 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

 

  1. 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 :

ClassePréfixeBlocPlage IPNombre d’adresses
A10.0.0.0/8Bloc 24 bit10.0.0.0 – 10.255.255.25516 777 216
B172.16.0.0/12Bloc 20 bit172.16.0.0 – 172.31.255.2551 048 576
C192.168.0.0/16Bloc 16 bit192.168.0.0 – 192.168.255.25565 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".

  1. 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; };
};
  1. 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

  1. 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 »

 

  1. 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/*

 

  1. 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
Gawindx
Gawindx

Gawindx

Passionné de l'outil informatique dès mon plus jeune âge (j'ai commencé sur un MO5), je mets mes compétences au service de la communauté. Je "flirte" avec Linux depuis 2005 et j'ai complétement basculé dans le libre depuis plus de 3 ans.