BIND 9

BIND, Berkeley Internet Name Domain, est un serveur de noms (DNS) utile à plusieurs niveaux.

  • Si vous disposez d’une IP fixe, il peut gérer un nom de domaine, réservé par exemple sur EU.org.
  • Il peut servir de cache DNS, ce qui est utile quand vous voulez vider le cache sans attendre la propagation standard d’un nom de domaine (rndc flush en root), ou pour éviter de subir les pannes des serveurs DNS de votre FAI.
  • Il peut enregistrer les adresses des machines qui utilisent un même réseau local, pour avoir quelque chose de plus mnémotechnique, et éviter d’avoir à taper des adresses IP.

Ce tutoriel est tenu à jour régulièrement. Dernière révision : 10 octobre 2014.

Les commandes préfixées d’un # sont à lancer en root. Les commandes préfixées d’un % sont à lancer en simple utilisateur.

Cache DNS et réseau local

Tout d’abord, il faut installer BIND :

# apt-get install bind9

BIND est configuré par défaut pour faire cache DNS.

Le fichier de configuration global

On va lui ajouter de quoi faire la convertion IP → nom de machine pour le réseau local. Les modifications effectuées par l’administrateur doivent aller dans le fichier /etc/bind/named.conf.local. On va rajouter une zone « lan ».

zone "lan" {
    type master;
    file "/etc/bind/local/lan";
};

zone "168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/local/lan.inv";
};

Le fichier de configuration secondaire, spécifique au réseau local

Nous allons ensuite passer à configuration du DNS pour le réseau local, dans le fichier /etc/bind/local/lan. Il faut savoir que les noms de machines doivent se terminer par un point. « machine. » signifie « machine », mais « machine » désigne « machine.mondomaine.fr ».

$TTL    86400

@       IN      SOA    serveur. root.serveur. (
    1
    8H
    2H
    1W
    1D
)
 
@           IN  NS      serveur.
@           IN  A       192.168.0.254
 
poste1          A       192.168.0.1
poste2          A       192.168.0.2
poste3          A       192.168.0.3
poste4          A       192.168.0.4
poste5          A       192.168.0.5
poste6          A       192.168.0.6
poste7          A       192.168.0.7
poste8          A       192.168.0.8

webcache        CNAME   serveur

Cette partie demande quelques explications :

  • TTL signifie « Time To Live », la durée de vie des informations dans le cache des autres serveurs DNS. C’est une durée exprimée en secondes et elle représente ici une journée.
  • Dans la deuxième ligne on retrouve l’hôte ou tourne le serveur de nom et l’email de l’administrateur réseau : « root.localhost. » — il faut remplacer le @ par un « . ».
  • On a ensuite le numéro de série caractérisant la modification que l’on est en train de faire. Dans le cas d’un serveur maître qui répercutera à des esclaves, ce numéro est là pour indiquer à ces derniers qu’ils doivent se mettre à jour. Ici c’est inutile, puisqu’il s’agit d’une zone locale.
  • Les 3 lignes suivantes sont dénommées « Refresh », « Retry » et « Expire ». À l’expiration du délai Refresh, un serveur esclave tentera de contacter son maitre. S’il ne le trouve pas, il fera une nouvelle tentative au bout du délai Retry. Au bout du délai Expire, il considérera que son maître n’est plus disponible.
  • Ensuite nous avons la durée de vie minimum du cache.
  • Nous indiquons après quel hôte est le serveur de noms du domaine (« NS pour Name Server »).
  • On passe ensuite à la définition entre les noms d’hôtes et leurs IP.
  • On peut ajouter des alias entre noms d’hôtes en utilisant CNAME, en plaçant à gauche le nouvel alias et à droite le nom ayant été défini sur une ligne A.

Pour vérifier que vous n’avez pas fait d’erreur, utiliser la commande suivante :

% /usr/sbin/named-checkzone lan /etc/bind/local/lan
zone lan/IN: loaded serial 1
OK

La résolution inverse

Créez le fichier /etc/bind/local/lan.inv.

$TTL    604800

@       IN      SOA     serveur. root.serveur. (
    1
    8H
    2H
    1W
    1D
)

@       IN  NS      serveur.

254       PTR     serveur.lan.
1         PTR     poste1.lan.
2         PTR     poste2.lan.
3         PTR     poste3.lan.
4         PTR     poste4.lan.
5         PTR     poste5.lan.
6         PTR     poste6.lan.
7         PTR     poste7.lan.
8         PTR     poste8.lan.

Vérification

Pour vérifier que vous n’avez pas fait d’erreur, vous pouvez utiliser la commande suivante :

% /usr/sbin/named-checkconf

Si elle ne renvoie rien, c’est que le fichier de configuration global est valide.

Ensuite lancez la commande suivante :

# service bind9 reload

Il vaut mieux utiliser reload que restart, pour éviter de vider le cache de BIND. Vérifiez que tout s’est bien passé en inspectant les logs.

% tail -n 20 /var/log/syslog

Vous devriez voir apparaître à la fin quelque chose comme :

Jan 30 01:11:54 serveur named[13221]: zone localhost/IN: loaded serial 1
Jan 30 01:11:54 serveur named[13221]: running
Jan 30 01:11:54 serveur named[13221]: zone 168.192.in-addr.arpa/IN: sending notifies (serial 1)

Cela signifie que BIND est lancé.

Vous devriez pouvoir faire un ping sur les machines de votre réseau local, ainsi que des hôtes extérieurs sur Internet.

Intégrer le serveur DNS au système

Il ne reste plus qu’à éditer le fichier /etc/resolv.conf, pour utiliser le serveur que l’on vient d’installer :

search lan
nameserver IP_SERVEUR

Au cas où, assurez-vous que votre /etc/hosts.conf est bien de la forme :

order hosts,bind
multi on

Conflit avec DHCP qui réécrit /etc/resolv.conf

Si vous utilisez le DHCP, et que vos machines ont un client DCHP avec une configuration standard, ce dernier peut écraser le contenu de /etc/resolv.conf à chaque lancement. Pour éviter ce comportement avec dhcp3-client, créer le fichier /etc/dhcp3/dhclient-enter-hooks.d/resolv :

make_resolv_conf() {
        echo "Nothing to do for /etc/resolv.conf"
}

Gestion d’un nom de domaine EU.org

Retour au fichier de configuration global

Éditez à nouveau /etc/bind/named.conf.local pour y rajouter :

acl "ns_secondaire" {
    IP_NS_SECONDAIRE;
};
 
zone "domaine.fr.eu.org" {
    type master;
    file "/etc/bind/masters/domaine.fr.eu.org";
    allow-transfer { "ns_secondaire"; };
    allow-query { any; };
};

Voir plus bas pour la configuration d’un serveur secondaire. Si vous n’avez pas de deuxième serveur disponible, et si personne dans votre entourage ne peut faire NS secondaire, vous pouvez regarder du côté de zoneedit.

Le fichier de zone

Il faut le créer, par exemple /etc/bind/masters/domaine.fr.eu.org.

$TTL 86400      ; 1 day
 
domaine.fr.eu.org.   IN  SOA ns.domaine.fr.eu.org. EMAIL. (
    2006091001  ; serial
    3H          ; refresh
    1H          ; retry
    1W          ; expire
    3H          ; minimum
)
 
@         NS      ns.domaine.fr.eu.org.
@         NS      ns_secondaire.
 
@     IN  MX  10  ns.domaine.fr.eu.org.
 
@         A       IP_NS_PRIMAIRE
ns        A       IP_NS_PRIMAIRE
www       CNAME   ns
webmail   CNAME   ns

Vérification

Utilisez les commandes /usr/sbin/named-checkconf et /usr/sbin/named-checkzone pour vérifier votre configuration. Une fois que tout est bon, dites à BIND de prendre en compte vos modifications.

# service bind9 reload

Pour finir, n’oubliez pas d’ouvrir le port 53 en TCP et en UDP si vous avez un firewall.

Serveur secondaire pour une zone

Voilà un exemple de la configuration d’un serveur en secondaire pour « domaine.fr.eu.org ». Dans /etc/bind/named.conf.local rajoutez :

zone "domaine.fr.eu.org" {
    type slave;
    file "/etc/bind/slaves/domaine.fr.eu.org";
    masters { IP_NS_PRIMAIRE; };
};

Vous devez créer le répertoire /etc/bind/slaves/. Le fichier /etc/bind/slaves/domaine.fr.eu.org sera créé et géré par BIND, c’est l’endroit où sera copiée la zone reçue du serveur primaire.

Ensuite on demande à BIND de recharger sa configuration (sur le secondaire) :

# service bind9 reload

En voulant ajouter une zone sur un secondaire, j’ai déjà été confronté à ce message d’erreur dans les logs :

[Jour] [Heure] [Hostname] named[5993]: client IP#PORT: received notify for zone 'domain.tld': not authoritative

Après avoir lancé les commandes named-checkconf et named-checkzone sur le primaire pour s’assurer qu’il n’y a pas une typo quelque part, j’ai demandé au primaire de renotifier la zone :

# rndc notify domain.tld

Mais le message d’erreur était toujours là, et le fichier n’était pas créé dans /etc/bind/slaves/. En fait, la commande service bind9 reload n’avait pas suffit, j’ai dû faire sur le secondaire :

# service bind9 stop
# service bind9 start

Réservation du nom de domaine

Maintenant que votre serveur DNS est fonctionnel, vous êtes fin prêt à aller sur le formulaire de création sur EU.org. Vous y remplirez les champs :

  • Mandatory email address ;
  • Organization ;
  • Administrative contact ;
  • Pas le « Technical contact »
  • Type of resource record: NS
  • NS primaire (votre serveur) : le nom de domaine que vous voulez réserver suivi de l’adresse IP du serveur ;
  • Au moins un NS secondaire, avec le nom du domaine et l’adresse IP du serveur.

Il ne reste plus qu’à attendre la validation par les administrateurs d’EU.org. Elle est manuelle, ça peut donc prendre un moment.

Protéger l’accès à votre serveur DNS

En l’état, tout le monde peut se servir de votre serveur DNS. Ce dernier n’a aucun intérêt par rapport à celui d’un FAI, mais autant protéger son accès.

Dans /etc/bind/named.conf.local rajoutez :

acl "lan" {
     192.168.0.0/16;
};

Ensuite dans /etc/bind/named.conf.options à la fin du bloc options{} rajoutez :

allow-recursion {
     "lan";
     127.0.0.1/8;
     IP_PUBLIQUE/32;
};

Le problème des lame-server qui envahissent les logs

À cause de la mauvaise configuration de certains serveurs DNS, vous risquez de voir vos logs envahis par des choses du genre :

Sep 10 00:58:02 serveur named[12588]: lame server resolving 'dns3.hull.ac.uk' (in 'hull.ac.UK'?): 149.170.39.92#53
Sep 10 01:17:14 serveur named[29842]: lame server resolving 'www.ledvdclub.com' (in 'ledvdclub.COM'?): 194.150.236.5#53

Pour éviter ça, vous pouvez ajouter ceci dans /etc/bind/named.conf.local :

logging {
    category lame-servers{ null; };
};

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *