# Le système d'exploitation GNU-Linux/Le serveur de noms BIND

* Qu'est-ce qu'un système d'exploitation ?
* Unix et Linux
* Partitionnement du disque
* Installation
** Installer Debian via le réseau
* Utilisateur Unix, l'interface console
** Le login
** Variables d'environnement
** Commandes de base
** L'aide en ligne man
** L'éditeur de texte vi
** Les shells
** La complétion
** Les jokers
** Les répertoires importants
** Redirection des entrées/sorties
** Invoquer un programme en tâche de fond
** Propriétaires et droits d'accès
** Processus
** Locale
* Administration du système
** Configuration du réseau
** Les utilisateurs et groupes
** Le processus d'initialisation
** Les systèmes de fichiers
** Le système virtuel /proc
** Les périphériques /dev
** L'ordonnanceur de travaux cron
** Le backup : tar et gzip
** ghost avec partimage
** sauvegarde de fichiers avec rsync
** Les fichiers journaux syslog
** Installation de nouveaux logiciels
** Le noyau Linux et les modules
** Autres commandes utiles
** Installation RAID1 logiciel + LVM + XFS
** Scripts de surveillance
** Réseaux sans fil
* Administration des services réseaux
** L'outil d'administration Webmin
** telnet
** cURL
** wget
** Le serveur de noms BIND
** Le serveur de configuration réseau DHCP
** Le serveur de shell distant SSH
** Le partage de fichiers Samba
** Le partage de fichiers NFS
** Le serveur d'impression CUPS
** Le serveur de fichiers FTP
** Le serveur Web Apache
** Le serveur Web Nginx
** La base de données MySQL
** La base de données Memcached
** La base de données Redis
** Le serveur de mails Postfix
** Les annuaires LDAP
** La supervision Nagios
* Sécurisation d'un serveur Linux
** Installation d'un service en mode chroot
** Protection avec iptables
* Erreurs connues
* Médiagraphie
* Auteurs
* Qu'est-ce qu'un système d'exploitation ?
* Unix et Linux
* Partitionnement du disque
* Installation
** Installer Debian via le réseau
* Utilisateur Unix, l'interface console
** Le login
** Variables d'environnement
** Commandes de base
** L'aide en ligne man
** L'éditeur de texte vi
** Les shells
** La complétion
** Les jokers
** Les répertoires importants
** Redirection des entrées/sorties
** Invoquer un programme en tâche de fond
** Propriétaires et droits d'accès
** Processus
** Locale
* Administration du système
** Configuration du réseau
** Les utilisateurs et groupes
** Le processus d'initialisation
** Les systèmes de fichiers
** Le système virtuel /proc
** Les périphériques /dev
** L'ordonnanceur de travaux cron
** Le backup : tar et gzip
** ghost avec partimage
** sauvegarde de fichiers avec rsync
** Les fichiers journaux syslog
** Installation de nouveaux logiciels
** Le noyau Linux et les modules
** Autres commandes utiles
** Installation RAID1 logiciel + LVM + XFS
** Scripts de surveillance
** Réseaux sans fil
* Administration des services réseaux
** L'outil d'administration Webmin
** telnet
** cURL
** wget
** Le serveur de noms BIND
** Le serveur de configuration réseau DHCP
** Le serveur de shell distant SSH
** Le partage de fichiers Samba
** Le partage de fichiers NFS
** Le serveur d'impression CUPS
** Le serveur de fichiers FTP
** Le serveur Web Apache
** Le serveur Web Nginx
** La base de données MySQL
** La base de données Memcached
** La base de données Redis
** Le serveur de mails Postfix
** Les annuaires LDAP
** La supervision Nagios
* Sécurisation d'un serveur Linux
** Installation d'un service en mode chroot
** Protection avec iptables
* Erreurs connues
* Médiagraphie
* Auteurs
[ Modifier le sommaire ]

## Historique

À la création d'Internet, chaque ordinateur du réseau contenait un fichier /etc/hosts qui listait le nom de toutes les machines du réseau et leurs adresses IP. À chaque fois que l'on rajoutait une machine sur Internet, il fallait mettre à jour ce fichier.
Le nombre de machines connecté à Internet s'étant rapidement accru, cette solution de fichier /etc/hosts communs est devenu ingérable, et il a fallu inventer un procédé capable de palier ce problème.
La solution qui s'est imposée fut la création d'une base de données distribuée, et ainsi est né le principe de serveur DNS.
Un serveur DNS permet de faire la correspondance entre un nom canonique (ex : www.google.fr) et son adresse IP.
Le premier serveur DNS fut créé par l'université de Berkeley et s'appelle BIND (Berkeley Internet Name Domain). BIND est le serveur DNS le plus utilisé et le plus populaire, environ 79 % d'Internet fonctionne avec ce logiciel.

## Configuration du client DNS

Sur un serveur Unix, la liste des serveurs DNS est définie dans le fichier /etc/resolv.conf.

## Principe de fonctionnement du DNS

Schéma : l'arbre à l'envers
Au sommet de l'arbre on trouve des serveurs root qui aiguille vers les top level domain (com, net, org, fr, etc.) Il existe une branche spéciale ARPA avec un sous domaine in-addr qui sert à gérer le reverse DNS.

## La commande host

La commande host permet d'obtenir l'adresse IP d'un ordinateur :
La commande host permet également de consulter le DNS inverse, c'est à dire quel nom canonique est associé à une adresse IP donnée :

## La commande dig

La commande dig permet d'interroger un serveur DNS.
Voici quelques exemples :
En interrogeant le sommet de l'arbre ., on obtient la liste des serveurs racines du DNS, appelés les root-servers :
En interrogeant la branche com, on obtient la liste des serveurs DNS gérant les noms de domaines en .com :
Si on interroge la branche fr, on obtient la liste des serveurs DNS gérant les noms de domaines en .fr. On constate que les extensions nationales sont gérés par des organismes nationaux (dans le cas de la France, le NIC France) :
En indiquant un nom de domaine, dig permet de connaitre différentes informations, comme par exemple :
La liste des serveurs DNS gérant le nom de domaine :
La liste des serveurs de mails :

## Les Ressources Records (RR)

Les informations stockées dans un serveur DNS sont classifiées à l'aide des Ressources Records (RR).
Il existe de nombreux Ressources Records, voici les plus courants :
* NS (Name Server) indique les serveurs DNS gérant le nom de domaine. Exemple : dig google.com NS donne les name server de google.com
* A (Adresse IPv4) indique l'adresse IPv4 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com A donne les adresses IPv4 de www.google.com
* AAAA (Adresse IPv6) indique l'adresse IPv6 associée à un FQDN (Full Qualified Domain Name). Exemple : dig www.google.com AAAA donne les adresses IPv6 de www.google.com
* MX (Mail eXchanger) indique le(s) serveur(s) de mail à contacter pour délivrer les emails du domaine. Exemple : dig google.fr MX donne les serveurs de mails acceptant des emails destinés à <un nom>@google.fr.
* CNAME (Canonical NAME) permet de créer des Alias (des noms étant des raccourcis vers d'autres noms). Exemple : host www.google.fr nous indique que www.google.fr est alias vers www.google.com.
* PTR (PoinTeuR) est utilisé par le reverse DNS pour effectuer la résolution d'une adresse IP vers un nom (FQDN). Exemple : host 72.14.207.99 nous indique que l'adresse IP 72.14.207.99 est associé au nom eh-in-f99.google.com

## Installation de BIND

Pour installer le serveur BIND sous Debian, on utilise la commande suivante :
À partir de Debian Lenny, le package contenant le serveur BIND s'appelle bind9

## Configuration de BIND

Les fichiers de configuration de BIND sont situés dans le répertoire /etc/bind.
Le fichier principal de configuration de BIND est /etc/bind/named.conf. Debian a choisit de découper ce fichier en 3 fichiers afin de faciliter les mises à jour.
À noter que dans ces fichiers, les lignes en commentaire commencent par // et non le # habituel des .conf, que l'on retrouve dans la syntaxe Apache.

### /etc/bind/named.conf.options

Dans ce fichier, il est possible de préciser dans la section forwarders l'adresse IP du DNS à qui l'on souhaite renvoyer les demandes de résolutions de noms. Par exemple, ceci est utile lorsque notre serveur DNS ne peut pas accéder directement à Internet.
Par défaut BIND écoute sur le port 53 en UDP. On peut également changer ce port dans ce fichier, mais ceci est délicat car il faudra accorder la configuration des clients en conséquence. À noter que le dossier /etc/services contient le numéro par défaut des ports de tous les services.

### /etc/bind/named.conf.local

On va définir dans ce fichier nos zones locales.

### Le fichier définissant la zone

On crée ensuite le fichier de zone /etc/bind/db.mondomaine.fr
À noter que dans les fichiers de zone, les lignes en commentaire commencent par ; et non le # habituel.
Points importants de ce fichier :
Le caractère @ (arobas) remplace le nom de la zone.
Lorsque l'on définit un nom canonique, on a deux possibilités :
* soit on donne le nom en entier (ex: pc210.mondomaine.fr.) . Dans ce cas-là, il ne faut pas oublier le point final, sinon le système rajoute automatiquement le nom de la zone (mondomaine.fr).
* soit on ne donne que le nom "court" (ex: alex). Dans ce cas-là, il ne met pas le point final afin que le système rajoute le nom de la zone.

### Test de fonctionnement

Une fois que l'on a modifié ces fichiers, on relance le serveur DNS :
On modifie ensuite le fichier /etc/resolv.conf pour lui indiquer d'utiliser le DNS que l'on vient de configurer :
Pour tester, on essaye de pinguer un nom définit dans le DNS :
Si tout se passe bien, le DNS doit effectuer la résolution.
On peut aussi utiliser les commandes host et dig pour vérifier :

### Le fichier définissant la zone inverse

Maintenant que l'on a configuré le DNS de la zone mondomaine.fr, on va créer la zone inverse qui va permettre d'associer un nom à une adresse IP.
On rajoute tout d'abord la zone inverse dans le fichier named.conf.local :
Le nom de la zone est composé de l'adresse réseau (à l'envers) associé à in-addr.arpa.
On crée ensuite le fichier /etc/bind/db.192.168.30 :
Le ressource record PTR permet de définir le nom associé à l'adresse IP.
Pour vérifier, on relance le DNS et on lui demande quelle nom est associé à une adresse IP donnée :

## Gestion des zones

Pour modifier les redirections DNS d'un domaine, il faut modifier sa zone :
Après modification des zones DNS, il s'avère nécessaire de demander sa propagation en cliquant tout en haut à droite sur Apply Configuration. Cela équivaut à la commande RNDC pour "Remote Name Daemon Control" :
Et éventuellement vérifier qu'il n'y a pas eu d'erreur :
Cela permet par exemple de s'apercevoir que le numéro de série de la version de la zone doit être changé à chaque modification :
Ce que L'interface graphique Webmin, plus ergonomique pour mettre à jour les zones DNS, incrémente automatiquement.

## Problèmes connus
### SERVFAIL

Le serveur DNS mentionné (localhost dans l'exemple) ne connait pas le domaine, mais il peut parfois le résoudre avec host.
Si le localhost est censé être autoritaire et que la zone y semble bien définie, ajouter un point à la fin de chaque URL, pour éviter qu'il les interprète en ajoutant le domaine après. En effet :
* example.com. IN NS ns.example2.com pourra être interprété à tort :
* example.com. IN NS ns.example2.com.example.com., mais pas :
* example.com. IN NS ns.example2.com.

### NXDOMAIN

Le domaine est inconnu des DNS, en général il suffit d'attendre la propagation 24 h.
Mais parfois, il manque juste un rndc reload ou un /etc/init.d/bind9 restart.

### found SPF/TXT record but no SPF/SPF record found

Ces enregistrements vont par deux : IN TXT et IN SPF.

### Le domaine ne se propage pas, telnet localhost 53 fonctionne en local mais pas de l'extérieur

Les symptômes sont les mêmes que si le port 53 était bloqué par le pare-feu, mais en fait il faut ajouter les IP publiques dans "/etc/bind/named.conf.options" :
Puis redémarrer le service :

### query (cache) '...' denied

Retirer les IP locales de :

## Références

* ↑ (en) Bryan J. Hong, Building a Server with FreeBSD 7: A Modular Approach, No Starch Press, 2008 (lire en ligne)
* ↑ http://www.root-servers.org/ www.root-servers.org

## Voir aussi

* Système de noms de domaine
* Sécurité des systèmes informatiques/Sécurité informatique/DNS avec BIND 9