BIND
Cet article est une ébauche. N'hésitez pas à contribuer ou à en discuter.
Créer un serveur DNS pour votre réseau local
Qu'est-ce que c'est ?
Un Domain Name System (ou DNS, système de noms de domaine) est un service permettant d'établir une correspondance entre une adresse IP et un nom de domaine et, plus généralement, de trouver une information à partir d'un nom de domaine.
Tous les ordinateurs pour communiquer entre eux doivent posséder une adresse IP. Ces adresses sont numériques, elles sont sous cette forme pour les adresses IPV4 : www.xxx.yyy.zzz; et de cette forme pour les adresses IPV6 : aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh.
Ces adresses sont associées à des noms, plus simples à retenir pour les humains, appelés noms de domaines. Résoudre un nom de domaine consiste à trouver l'adresse IP qui lui est associée.
Vous préférez taper google.com ou 72.14.204.103 dans votre navigateur ?
Pourquoi faire ?
- Simple curiosité, pour comprendre son fonctionnement;
- Être autonome des DNS de son FAI (Fournisseur d'accès Internet) en cas d'arrêt de ceux-ci ou pas souci de confidentialité;
- Résoudre les adresses de son réseau interne (Intranet) simplement, sans être obligé de remplir le fichier hosts de toutes vos machines;
- Résoudre les "adresses inverses": obtenir un nom de domaine ou de machine avec une IP.
Cela fait suffisamment de raisons ? Alors continuons!
== Avertissement
Nous n'aborderons pas ici les problèmes de sécurité, qui peuvent être nombreux sur un serveur DNS. Le DNS que nous allons construire est destiné UNIQUEMENT à notre réseau local, il n'est pas accessible depuis Internet.
Installation
# apt-get install bind9 bind9-host bind9utils
Pour information, trois bogues sur bind9... Vous pouvez tout de même installer sans soucis
Récupération des rapports de bogue... Fait Analyse des informations Trouvé/Corrigé... Fait Bogues de gravité grave sur bind9 ( -> 1:9.6.ESV.R1+dfsg-0+lenny2) <done> #516616 - bind9 locks up on start on mipsel and mips (Corrigé : bind9/1:9.7.0.dfsg.1-1) Réuni avec : 520688 Bogues de gravité critical sur bind9 ( -> 1:9.6.ESV.R1+dfsg-0+lenny2) <pending> #575916 - bind9: assertion fails in name.c:1699 INSIST(offset <= length) Bogues de gravité serious sur bind9 ( -> 1:9.6.ESV.R1+dfsg-0+lenny2) <pending> #584585 - file conflict with libisc50 (Corrigé : 1:9.7.0.dsfg~b3-1) Résumé : bind9 (3 bogues)
Vérifions que bind écoute bien sur toutes nos adresses :
# netstat -ntulp | grep named tcp 0 0 192.168.0.1:53 0.0.0.0:* LISTEN 2832/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2832/named tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 2832/named tcp6 0 0 :::53 :::* LISTEN 2832/named tcp6 0 0 ::1:953 :::* LISTEN 2832/named udp 0 0 192.168.0.1:53 0.0.0.0:* 2832/named udp 0 0 127.0.0.1:53 0.0.0.0:* 2832/named udp6 0 0 :::53 :::* 2832/named
Premiers contact
Ça y est, notre DNS est déjà fonctionnel... Il rempli son role de DNS récursif et répond à nos demandes de résolution! Vous ne me croyez pas ?
$ host forum.debian-fr.org 127.0.0.1 Using domain server: Name: localhost Address: 127.0.0.1#53 Aliases: forum.debian-fr.org is an alias for www.zehome.com. www.zehome.com has address 88.165.116.107
Cette commande simple nous donne déjà des renseignements :
- forum.debian-fr.org est un alias pour www.zehome.com.
- Son IP (IPV4 est 88.165.116.107)
Plus d'information ? Passons la même commande avec l'option -v (verbose)
$ host -v forum.debian-fr.org localhost Trying "forum.debian-fr.org" Using domain server: Name: localhost Address: 127.0.0.1#53 Aliases: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11492 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 1 ;; QUESTION SECTION: ;forum.debian-fr.org. IN A ;; ANSWER SECTION: forum.debian-fr.org. 37939 IN CNAME www.zehome.com. www.zehome.com. 37941 IN A 88.165.116.107 ;; AUTHORITY SECTION: zehome.com. 37941 IN NS ns.kimsufi.com. zehome.com. 37941 IN NS ns0.zehome.com. zehome.com. 37941 IN NS daboog.zehome.com. ;; ADDITIONAL SECTION: ns.kimsufi.com. 85955 IN A 213.186.33.199 Received 161 bytes from 127.0.0.1#53 in 1 ms Trying "www.zehome.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62379 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.zehome.com. IN AAAA ;; AUTHORITY SECTION: zehome.com. 10355 IN SOA ns0.zehome.com. ed.zehome.com. 2010072702 21600 3600 2592000 86400 Received 75 bytes from 127.0.0.1#53 in 0 ms Trying "www.zehome.com" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7678 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.zehome.com. IN MX ;; AUTHORITY SECTION: zehome.com. 10377 IN SOA ns0.zehome.com. ed.zehome.com. 2010072702 21600 3600 2592000 86400 Received 75 bytes from 127.0.0.1#53 in 0 ms
Avec l'option -v (verbose) c'est tout de suite plus compliqué...
Quelques remarques sur ce résultat :
- forum.debian-fr.org est un alias pour www.zehome.com;
- Son IP est 88.165.116.107;
- Ce domaine est géré par les sevreurs DNS daboog.zehome.com, ns.kimsufi.com et ns0.zehome.com;
- Il ne dispose pas d'IPV6 (pas de réponse à la question IN AAAA);
- Le SOA pour ce domaine est ns0.zehome.com
- Le mail de l'administrateur est ed@zehome.com (ed.zehome.com - ici le point vaut un arobase)
La même chose, sur un domaine plus important
$ host www.google.fr 127.0.0.1 Using domain server: Name: 127.0.0.1 Address: 127.0.0.1#53 Aliases: www.google.fr is an alias for www.google.com. www.google.com is an alias for www.l.google.com. www.l.google.com has address 72.14.204.104 www.l.google.com has address 72.14.204.147 www.l.google.com has address 72.14.204.99 www.l.google.com has address 72.14.204.103
-www.google.fr est un alias pour www.google.com -www.google.com possède plusieurs adresses IP
C'est possible, et cela s'appelle le "round-robin"... Tourniquet en Français, cet algorithme d'ordonnancement permet d'attribuer des temps aux processus, ici, il s'agit de faire tourner les IP, afin que tous les serveurs reçoivent leur part de charge...
La Configuration
L'installation de Bind9 à générée les fichiers suivants :
# cd /etc/bind lol:/etc/bind# vdir total 52 -rw-r--r-- 1 root root 237 jun 10 22:58 db.0 -rw-r--r-- 1 root root 271 jun 10 22:58 db.127 -rw-r--r-- 1 root root 237 jun 10 22:58 db.255 -rw-r--r-- 1 root root 353 jun 10 22:58 db.empty -rw-r--r-- 1 root root 270 jun 10 22:58 db.local -rw-r--r-- 1 root root 2994 aoû 3 21:30 db.root -rw-r--r-- 1 root bind 1125 jui 21 22:19 named.conf -rw-r--r-- 1 root bind 278 aoû 3 10:37 named.conf.local -rw-r--r-- 1 root bind 572 jun 10 22:58 named.conf.options -rw-r----- 1 bind bind 77 jui 20 17:25 rndc.key -rw-r--r-- 1 root root 1317 jun 10 22:58 zones.rfc1918
Le fichier principal (apuré des commentaires) :
# cat /etc/bind/named.conf include "/etc/bind/named.conf.options"; zone "." { type hint; file "/etc/bind/db.root"; }; 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";
Ce fichier renvoie vers deux fichiers de configurations : named.conf.options et named.conf.local
C'est dans ces deux fichiers qu'il faudra mettre vos configurations personnelles, le fichier named.conf ne devant en principe pas être modifié.
Le fichier named.conf déclare plusieures zones, presque toutes destinées à la résolution inverse
La zone "."
La zone root est primordiale. Ce fichier contient toutes les informations sur les root-servers sans lesquels notre DNS ne peut fonctionner. Ce fichier évolue peu.
lol:/etc/bind# cat db.root ; This file holds the information on root name servers needed to ; initialize cache of Internet domain name servers ; (e.g. reference this file in the "cache . <file>" ; configuration file of BIND domain name servers). ; ; This file is made available by InterNIC ; under anonymous FTP as ; file /domain/named.root ; on server FTP.INTERNIC.NET ; -OR- RS.INTERNIC.NET ; ; last update: Feb 04, 2008 ; related version of root zone: 2008020400 ; ; formerly NS.INTERNIC.NET ; . 3600000 IN NS A.ROOT-SERVERS.NET. A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30 ; ; formerly NS1.ISI.EDU ; . 3600000 NS B.ROOT-SERVERS.NET. B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201 ; ; formerly C.PSI.NET ; . 3600000 NS C.ROOT-SERVERS.NET. C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 ; ; formerly TERP.UMD.EDU ; . 3600000 NS D.ROOT-SERVERS.NET. D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90 ; ; formerly NS.NASA.GOV ; . 3600000 NS E.ROOT-SERVERS.NET. E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 ; ; formerly NS.ISC.ORG ; . 3600000 NS F.ROOT-SERVERS.NET. F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2f::f ; ; formerly NS.NIC.DDN.MIL ; . 3600000 NS G.ROOT-SERVERS.NET. G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 ; ; formerly AOS.ARL.ARMY.MIL ; . 3600000 NS H.ROOT-SERVERS.NET. H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53 H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803f:235 ; ; formerly NIC.NORDU.NET ; . 3600000 NS I.ROOT-SERVERS.NET. I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 ; ; operated by VeriSign, Inc. ; . 3600000 NS J.ROOT-SERVERS.NET. J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30 J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:C27::2:30 ; ; operated by RIPE NCC ; . 3600000 NS K.ROOT-SERVERS.NET. K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129 K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7fd::1 ; ; operated by ICANN ; . 3600000 NS L.ROOT-SERVERS.NET. L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42 ; ; operated by WIDE ; . 3600000 NS M.ROOT-SERVERS.NET. M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33 M.ROOT-SERVERS.NET. 3600000 AAAA 2001:dc3::35 ; End of File
La zone "localhost"
# cat db.local ; ; BIND data file for local loopback interface ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. @ IN A 127.0.0.1 @ IN AAAA ::1
Peu utilisée en général, elle permet de résoudre localhost :
La structure de ce dernier fichier est un peu déroutante au début, emplie de @ . A AAAA SOA et autres IN que nous détaillerons plus loin. Nous remarquons que localhost posède deux IP : 127.0.0.1 (IPV4) et ::1 (IPV6) vous le saviez probablement déjà!
Les zones in-addr.arpa
Nous venons de voir les fichiers qui permettent de résoudre l'adresse d'une machine à partir de son nom. Or, il arrive que certains mécanismes réclament l'inverse, c'est à dire trouver le (les) noms associés à des IP.
Les zones in-addr.arpa servent à ça.
Voici la zone inverse pour localhost :
# cat db.127 ; ; BIND reverse data file for local loopback interface ; $TTL 604800 @ IN SOA localhost. root.localhost. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS localhost. 1.0.0 IN PTR localhost.
La notation est ici inversée. Si nous cherchons dans la zone 127 l'adresse 0.0.1 nous tomberons sur localhost => 1.0.0 IN PTR localhost.
Par exemple, Pour l'adresse 192.1.2.3, nous obtenons le nom de domaine 3.2.1.192.in-addr.arpa.
Contenu d'une Zone
Une zone contient deux enregistrements obligatoires :
- SOA
- NS
SOA (Start Of Authority)
SOA (Start Of Authority). Le champ SOA indique quel est le serveur « maitre ». Ce serveur peut-avoir plusieurs serveurs esclaves
$ host -t soa google.fr google.fr has SOA record ns1.google.com. dns-admin.google.com. 1423257 21600 3600 1209600 300
Nous savons dons que le serveur ns1.google.com est le serveur maître du domaine google.com. Et nous avons l'adresse email du responsable : dns-admin@google.com (l'arobase est remplacé par un point dans le fichier de zone)
L'enregistrement SOA contient un certain nombre d'enregistrements et de paramètres:
Le nom du primaire
@ IN SOA tebilepas.chezmoi.ici. root.tebilepas.chezmoi.ici.
C'est le nom du serveur primaire pour la zone. L'adresse de courrier électronique du responsable technique de la zone (zone-contact). Il faut l'écrire en replaçant le @ par un point. On a alors par exemple: root@inria.fr qui devient root.inria.fr
A, AAAA, MX, CNAME, etc.
Les types d'enregistrements sont: A, AAAA, MX, CNAME, NS, SOA, PTR, TXT, HINFO, WKS, RP, MA, MB.
A (Address)
C'est l'enregistrement le plus courant. Le DNS a été créé en grande partie pour ça... Le champ A (Address) fait correspondre un nom à une adresse IPv4.
nom IN A 193.10.20.30
Dans le cas d'une machine qui dispose de plus d'une adresse IP (un routeur ou une machine avec plusieurs cartes), il faut indiquer indiquer un enregistrements A par adresse, mais il faut alors que tous les enregistrements PTR pointent vers ce nom là.
AAAA (Address IPV6)
Idem au champ A, mais correspond à une adresse de type IPV6
NS (Name Server)
Le champ NS (Name Server) indique le nom d'un serveur de noms. Il peut y avoir plusieurs champs NS s'il y a plusieurs serveurs de noms...
CNAME (Common Name)
Le champ CNAME (Common Name) est utilisé pour créer des alias. Un "vrai" nom doit être préalablement déclaré avec la variable A, un alias peut ensuite être créer qui pointera vers celui-ci.
MX (Mail eXchanger)
Le champ MX (Mail eXchanger), est utilé pour le protocole SMTP ou TXT.
Il indique pour un nom de domaine quel est la machine à laquelle il faut envoyer le courrier pour ce domaine.
Si plusieurs enregistrements MX sont présents, il faut leur attribuer un poids... Le MTA (Mail transfert agent) tentera d'envoyer le courrier en premier à la machine ayant le poids associé le plus faible, puis ensuite dans l'ordre croissant des poids.
Si la machine qui relaie le courrier est dans la liste des MX pour le domaine, elle envoie le courrier aux machines de poids inférieur au sien.
nom IN MX 10 premier.relais.
IN MX 20 second.relais.
Le numéro de série de la zone
Il permet aux serveurs secondaires qui interrogent régulièrement le serveur primaire de chaque zone de déterminer quand la zone a été mise à jour.
L'intervalle entre les rafraichissements (refresh)
Temps, en seconde, au bout duquel les serveurs « esclaves » devront demander à rafraichir leur données pour cette zone. 3600 secondes dans l'exemple ci-dessous, soit une heure.
3600 ; Refresh
La valeur conseillée est 24 heures, soit 86400 secondes.
L'intervalle entre les rafraichissements (retry)
Durée, en secondes, à partir de laquelle un serveur esclave doit ré-essayer de se synchroniser en cas d'échec du rafraichissement. Ici toutes les 300 secondes, soit toutes les 5 minutes.
300 ; Retry
La valeur conseillée est 6 heures, soit 21600 secondes.
La durée d'expiration des enregistrements d'un secondaire
En cas d'échec des tentatives de synchronisation, indique le temps (en secondes) au bout duquel les serveurs secondaires devront considérer qu'ils ne savent plus répondre aux requêtes concernant cette zone.
2419200 ; Expire
La valeur conseillée est de 41 jours, soit 3600000 secondes.
La durée de vie par défaut des enregistrements (default TTL)
Durée de vie de l'information fournie. Les serveurs DNS récursifs conserveront en cache les informations récoltées pendant la durée indiquée dans ce paramètre. 0 indique que les valeurs ne doivent pas être conservées en cache.
1600 ) ; Negative Cache TTL
La valeur conseillée est de 24 heures, soit 86400 secondes.
Le symbole « @ »
Dans un fichier de configuration de zone, ce symbole représente exactement le nom de domaine de la zone. Par exemple, lorsque nous allons créer notre zone maison.mrs, écrire :
maison.mrs. IN SOA ...
Nous pourrons écrire :
@ IN SOA ...
NS (Name Server)
Cet enregistrement indique une délégation pour la gestion du nom donné. C'est à dire que le nom donné devient une zone, dont la gestion est déléguée au serveur indiqué en partie droite.
L'enregistrement donne le nom d'un des serveurs de noms autoritaire pour la zone, comme il y a toujours plus d'un serveur de noms pour une zone, on répète l'enregistrement NS autant de fois qu'il y a de serveurs pour la zone.
Quand pour un nom, on a des enregistrements NS, il est interdit de faire figurer dans la zone parente (celle là) d'autres enregistrements. S'il y a à faire figurer des enregistrements, il faut les mettre dans la zone fille.
zone IN NS serveur.nom.de.domaine.
IN NS autreServeur.nom.de.domaine.
IN NS encoreUn.autreNom.de.domaine.
Créons notre première zone
Maintenant que les explications indigestes sont faites... La meilleure façon de comprendre, est d'appliquer à son réseau local sa propre zone!
La zone chezmoi.ici
Pour cet exemple j'ai pris un nom de domaine bidon, c'est tout a fait possible, vous pouvez donner n'importe quel nom à votre Intranet!
Notre serveur s'appelle tebilepas il dispose de l'IP 192.168.1.254
Le domaine est chezmoi.ici
Nous disposons d'assez d'informations pour créer la zone chezmoi.ici
Créons d'abord dans /etc/bind/ un fichier nommé : db.chezmoi.ici qui contiendrai ceci :
$TTL 1600 @ IN SOA tebilepas.chezmoi.ici. root.tebilepas.chezmoi.ici. ( 2009012907 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 1600 ) ; Negative Cache TTL chezmoi.ici. IN NS tebilepas.chezmoi.ici. chezmoi.ici. IN A 192.168.1.254 tebilepas IN A 192.168.1.254 coucou IN A 192.168.1.1 pourquoi IN CNAME coucou tespascheztoi IN CNAME forum.debian-fr.org.
Nous aurions pu écrire :
@ IN NS tebilepas.chezmoi.ici.
à la place de (cela revient au même)
chezmoi.ici. IN NS tebilepas.chezmoi.ici.
Nous aurions aussi pu éviter les commentaires (par exemple : ;Serial) mais pour les explications ce sera plus facile.
Ce sera suffisant pour commencer!
Pour que cette zone soit prise en compte, nous devons maintenant l'inclure dans le fichier /etc/bind/named.conf.local
Ceci devrait permettre de répondre aux requêtes de type NS pour le domaine maison.mrs, de répondre aussi aux requêtes de type A pour debvirt.maison.mrs et pour test1.maison.mrs, constater aussi que les alias fonctionnent dans et hors du domaine.
Il nous faut maintenant indiquer à bind que cette zone existe. Nous allons le faire dans le fichier /etc/bind/named.conf.local :
zone "chezmoi.ici" { type master; file "/etc/bind/db.chezmoi.ici"; };
Nous redémarrons notre serveur bind
# service bind9 restart Stopping domain name service...: bind9 waiting for pid 1353 to die. Starting domain name service...: bind9.
Et nous testons...
$ host -a chezmoi.ici localhost Trying "chezmoi.ici" Using domain server: Name: localhost Address: ::1#53 Aliases: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46986 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; QUESTION SECTION: ;chezmoi.ici. IN ANY ;; ANSWER SECTION: chezmoi.ici. 1600 IN SOA tebilepas.chezmoi.ici. root.tebilepas.chezmoi.ici. 2009012907 604800 86400 2419200 1600 chezmoi.ici. 1600 IN NS tebilepas.chezmoi.ici. chezmoi.ici. 1600 IN A 192.168.1.254 ;; ADDITIONAL SECTION: tebilepas.chezmoi.ici. 1600 IN A 192.168.1.254 Received 126 bytes from ::1#53 in 5 ms
$ host coucou.chezmoi.ici localhost Using domain server: Name: localhost Address: ::1#53 Aliases: coucou.chezmoi.ici has address 192.168.1.1
$ host pourquoi.chezmoi.ici localhost Using domain server: Name: localhost Address: ::1#53 Aliases: pourquoi.chezmoi.ici is an alias for coucou.chezmoi.ici. coucou.chezmoi.ici has address 192.168.1.1
$ host ailleurs.chezmoi.ici localhost Using domain server: Name: localhost Address: 127.0.0.1#53 Aliases: ailleurs.chezmoi.ici is an alias for forum.debian-fr.org. forum.debian-fr.org is an alias for www.zehome.com. www.zehome.com has address 88.165.116.107
Comme vous avez pu le constater, votre DNS fonctionne parfaitement, il renseigne nos machines sur le réseau local, et il pourvoit à nos demandes d'IP Internet !
ToDo : Conclusion - Round-robin