23.6. Serveurs de noms (DNS)

Contribution de Chern Lee.

23.6.1. Généralités

FreeBSD utilise, par défaut, BIND (Berkeley Internet Name Domain), qui est l'implémentation la plus courante du protocole DNS. Le DNS est le protocole qui effectue la correspondance entre noms et adresses IP, et inversement. Par exemple une requête pour www.FreeBSD.org aura pour réponse l'adresse IP du serveur Web du projet FreeBSD, et une requête pour ftp.FreeBSD.org renverra l'adresse IP de la machine FTP correspondante. De même, l'opposé est possible. Une requête pour une adresse IP retourne son nom de machine. Il n'est pas nécessaire de faire tourner un serveur DNS pour effectuer des requêtes DNS sur un système.

Le DNS est coordonné sur l'Internet à travers un système complexe de serveurs de noms racines faisant autorité, et d'autres serveurs de noms de plus petites tailles qui hébergent, directement ou font office de ``cache'', l'information pour des domaines individuels.

Ce document fait référence à BIND 8.x, comme c'est la version stable utilsée dand FreeBSD. BIND 9.x peut être installée à l'aide du logiciel porté net/bind9.

Les RFC1034 et RFC1035 régissent le protocole DNS.

Actuellement, BIND est maintenu par l'Internet Software Consortium http://www.isc.org/.

23.6.2. Terminologie

Pour comprendre ce document, certains termes relatifs au DNS doivent être maîtrisés.

Terme Definition
``Forward`` DNS Correspondance noms de machine vers adresses IP.
Origine Fait référence au domaine couvert par un fichier de zone particulier.
named, BIND, serveur de noms Noms courants pour le serveur de noms BIND de FreeBSD
Resolveur Un processus système par l'intermédiaire duquel une machine contacte un serveur de noms pour obtenir des informations sur une zone.
DNS inverse C'est l'inverse du DNS ``classique'' (``Forward`` DNS). C'est la correspondance adresses IP vers noms de machine.
Zone racine Début de la hiérarchie de la zone Internet. Toutes les zones sont rattachées à la zone racine, de la même manière qu'un système de fichier est rattaché au répertoire racine.
Zone Un domaine individuel, un sous-domaine, ou une partie des noms administrés par un même serveur faisant autorité.

Exemples de zones:

Comme on peut le remarquer, la partie la plus significative d'un nom de machine est à sa gauche. Par exemple, example.org. est plus spécifique que org., comme org. est à son tour plus spécifique que la zone racine. La constitution de chaque partie d'un nom de machine est proche de celle d'un système de fichiers: le répertoire /dev se trouve sous la racine, et ainsi de suite.

23.6.3. Les raisons de faire tourner un serveur de noms

Les serveurs de noms se présentent généralement sous deux formes: un serveur de noms faisant autorité, et un serveur de noms cache.

Un serveur de noms faisant autorité est nécessaire quand:

Un serveur de noms cache est nécessaire quand:

Quand on émet des requêtes pour www.FreeBSD.org, le résolveur interroge généralement le serveur de noms du fournisseur d'accès, et récupère la réponse. Avec un serveur DNS cache local, la requête doit être effectuée qu'une seule fois vers le monde extérieur par le serveur DNS cache. Chaque interrogation suivante n'aura pas à être transmise en dehors du réseau local, puisque l'information est désormais disponible localement dans le cache.

23.6.4. Comment cela fonctionne-t-il?

Sous FreeBSD le ``daemon'' BIND est appelé named pour des raisons évidentes.

Fichier Description
named le ``daemon'' BIND
ndc le programme de contrôle du ``daemon''
/etc/namedb répertoire où se trouvent les informations sur les zones de BIND
/etc/namedb/named.conf le fichier de configuration du ``daemon''

Les fichiers de zone sont généralement stockés dans le répertoire /etc/namedb, et contiennent les informations concernant les zones DNS gérées par le serveur de noms.

23.6.5. Lancer BIND

Puisque BIND est installé par défaut, sa configuration est relativement simple.

Pour s'assurer que le ``daemon'' named est lancé au démarrage, ajoutez la ligne suivante dans /etc/rc.conf:

named_enable="YES"

Pour démarrer le ``daemon'' manuellement (après l'avoir configuré):

# ndc start

23.6.6. Fichiers de configuration

23.6.6.1. Utilisation de make-localhost

Assurez-vous d'effectuer:

# cd /etc/namedb
# sh make-localhost

pour générer correctement le fichier de zone DNS inverse /etc/namedb/localhost.rev.

23.6.6.2. /etc/namedb/named.conf

// $FreeBSD$
//
// Reportez-vous à la page de manuel named(8) pour plus de
// détails.  Si vous devez configurer un serveur primaire
// assurez-vous d'avoir compris les détails épineux du
// fonctionnement du DNS.  Même avec de simples erreurs, vous
// pouvez rompre la connexion entre les parties affectées, ou
// causer un important trafic Internet inutile.

options {
        directory "/etc/namedb";

// En plus de la clause "forwarders", vous pouvez forcer votre serveur
// de noms à ne jamais être à l'origine de
// requêtes, mais plutôt faire suivre les demandes en
// activant la ligne suivante:
//
//      forward only;

// Si vous avez accès à un serveur de noms au niveau de
// votre fournisseur d'accès, ajoutez ici son adresse IP, et
// activez la ligne ci-dessous.  Cela vous permettra de
// bénéficier de son cache, réduisant ainsi le
// trafic Internet.
/*
        forwarders {
                127.0.0.1;
        };
*/

Comme les commentaires le précisent, pour bénéficier d'un cache en amont de votre connexion, le paramètre forwarders peut être activé. Dans des circonstances normales, un serveur de noms interrogera de façon récursive certains serveurs de noms jusqu'à obtenir la réponse à sa requête. Avec ce paramètre activé, votre serveur interrogera le serveur de noms en amont (ou le serveur de noms fourni) en premier, en bénéficiant alors de son cache. Si le serveur en question gère beaucoup de trafic, et est un serveur rapide, activer cette option peut en valoir la peine.

Avertissement : 127.0.0.1 ne fonctionnera pas ici. Remplacez cette adresse IP par un serveur de noms en amont de votre connexion.

        /*
         * S'il y a un coupe-feu entre vous et les serveurs de noms
         * avec lesquels vous voulez communiquer, vous aurez
         * peut-être besoin de décommenter la directive
         * query-source ci-dessous.  Les versions
         * précédentes de BIND lançaient des
         * requêtes à partir du port 53, mais depuis la
         * version 8.1, BIND utilise
         * par défaut un port quelconque non
         * réservé.
         */
        // query-source address * port 53;

        /*
         * Si exécution dans un "sandbox", vous pourrez avoir
         * à indiquer un emplacement différent pour le
         * fichier de sortie de la base de données.
         */
        // dump-file "s/named_dump.db";
};

// Note: ce qui suit sera supporté dans une future version.
/*
host { any; } {
        topology {
                127.0.0.0/8;
        };
};
*/

// Configurer des serveurs secondaires est plus simple et le principe
// général est présenté plus bas.
//
// Si vous activez un serveur de noms local, n'oubliez pas d'entrer
// 127.0.0.1 dans votre fichier /etc/resolv.conf de sorte que ce
// serveur soit interrogé le premier.  Assurez-vous
// également de l'activer dans /etc/rc.conf.

zone "." {
        type hint;
        file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "localhost.rev";
};

zone
"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
        type master;
        file "localhost.rev";
};

// NB: N'utilisez pas les adresses IP ci-dessous, elles sont factices,
// et ne servent que pour des besoins de
// démonstration/documentation!
//
// Exemple d'entrées de configuration de serveur secondaire.
// Il peut être pratique de devenir serveur secondaire pour la
// zone à laquelle appartient votre domaine.  Demandez à
// votre administrateur réseau l'adresse IP du serveur primaire
// responsable de la zone.
//
// N'oubliez jamais d'inclure la résolution de la zone inverse
// (IN-ADDR.ARPA)!
// (Ce sont les premiers octets de l'adresse IP, en ordre inverse,
// auxquels ont a ajouté ".IN-ADDR.ARPA".)
//
// Avant de commencer à configurer une zone primaire, il faut
// être sûr que vous avez parfaitement compris comment le
// DNS et BIND fonctionnent.  Il apparait parfois des pièges
// peu évidents à saisir.  En comparaison, configurer un
// serveur secondaire est plus simple.
//
// NB: N'activez pas aveuglément les exemples ci-dessous. :-)
// Utilisez des noms et des adresses réelles.
//
// NOTE!!! FreeBSD exécute BIND dans un "sandbox" (voir l'option
// named_flags dans rc.conf).  Le répertoire contenant les
// zones secondaires doit être accessible à BIND en
// écriture.  La séquence suivante est
// suggérée:
//
//      mkdir /etc/namedb/s
//      chown bind:bind /etc/namedb/s
//      chmod 750 /etc/namedb/s

Pour plus d'informations sur l'exécution de BIND dans un ``sandbox'' (bac à sable), consultez la section Exécution de named dans un sandbox.

/*
zone "example.com" {
        type slave;
        file "s/example.com.bak";
        masters {
                192.168.1.1;
        };
};

zone "0.168.192.in-addr.arpa" {
        type slave;
        file "s/0.168.192.in-addr.arpa.bak";
        masters {
                192.168.1.1;
        };
};
*/

Dans named.conf, ce sont des exemples d'entrées d'un serveur esclave.

Pour chaque nouvelle zone gérée, une nouvelle entrée de zone doit être ajoutée au fichier named.conf.

Par exemple, l'entrée de zone la plus simple possible pour example.org serait:

zone "example.org" {
    type master;
    file "example.org";
};

Ce sera un serveur maître pour la zone, comme indiqué par l'option type, concervant ses informations de zone dans le fichier /etc/namedb/example.org comme précisé par l'option file.

zone "example.org" {
    type slave;
    file "example.org";
};

Dans le cas d'un esclave, les informations concernant la zone seront transférées à partir du serveur maître pour la zone en question, et sauvegardées dans le fichier indiqué. Si ou lorsque le serveur maître tombe ou est inaccessible, le serveur esclave disposera des informations de la zone transférée et sera capable de les diffuser.

23.6.6.3. Fichiers de zone

Un exemple de fichier de zone maître pour example.org (défini dans /etc/namedb/example.org) suit:

$TTL 3600

example.org. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh
                        3600            ; Retry
                        604800          ; Expire
                        86400 )         ; Minimum TTL

; Serveurs DNS
@       IN NS           ns1.example.org.
@       IN NS           ns2.example.org.

; Noms de machine
localhost       IN A    127.0.0.1
ns1             IN A    3.2.1.2
ns2             IN A    3.2.1.3
mail            IN A    3.2.1.10
@               IN A    3.2.1.30

; Alias
www             IN CNAME        @

; Enregistrement MX
@               IN MX   10      mail.example.org.

Notez que chaque nom de machine se terminant par un ``.'' est un nom de machine complet, alors que tout ce qui se termine pas par un ``.'' est référencé par rapport à une origine. Par exemple, www sera traduit en www.origine. Dans notre fichier de zone fictif, notre origine est example.org., donc www sera traduit en www.example.org.

Le format d'un fichier de zone est le suivant:

nom-enregistrement      IN type-enregistrement   valeur

Les enregistrements DNS les plus couramment utilisés:

SOA

début des données de zone

NS

serveur de noms faisant autorité

A

adresse d'une machine

CNAME

alias d'un nom de machine

MX

serveur de messagerie recevant le courrier pour le domaine

PTR

un pointeur sur un nom de domaine (utilisé dans le DNS inverse)

example.org. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh after 3 hours
                        3600            ; Retry after 1 hour
                        604800          ; Expire after 1 week
                        86400 )         ; Minimum TTL of 1 day
example.org.

le nom de domaine, également l'origine pour ce fichier de zone.

ns1.example.org.

le serveur de noms primaire/faisant autorité pour cette zone.

admin.example.org.

la personne responsable pour cette zone avec le caractère ``@'' remplacé. ( devient admin.example.org)

5

le numéro de série de ce fichier. Celui-ci doit être incrémenté à chaque modification du fichier de zone. De nos jours, de nombreux administrateurs préfèrent un format du type aaaammjjrr pour le numéro de série. 2001041002 signifierait dernière modification le 10/04/2001, le 02 indiquant que c'est la seconde fois que ce fichier a été révisé ce jour. Le numéro de série est important puisqu'il indique aux serveurs de noms esclaves pour la zone une modification de celle-ci.

@       IN NS           ns1.example.org.

C'est une entrée de type NS. Tous les serveurs de noms qui doivent faire autorité pour la zone devront inclure une de ces entrées. Le caractère @ aurait pu être remplacé par example.org.. Le caractère @ étant équivalent à l'origine.

localhost       IN A    127.0.0.1
ns1             IN A    3.2.1.2
ns2             IN A    3.2.1.3
mail            IN A    3.2.1.10
@               IN A    3.2.1.30

Un enregistrement de type A indique des noms de machine. Comme présenté ci-dessus ns1.example.org sera résolu en 3.2.1.2. Ici encore, le symbôle d'origine, @, signifie que example.org donnera pour résolution d'adresse l'adresse 3.2.1.30.

www             IN CNAME        @

L'enregistrement de type CNAME est généralement utilisé pour créer des alias à une machine. Dans l'exemple, www est un alias de la machine correspondant à l'origine, ou encore example.org (3.2.1.30). Les enregistrements CNAME peuvent être utilisés pour fournir des alias à des noms de machines, ou permettre la rotation (``round robin'') d'un nom de machine entre plusieurs machines.

@               IN MX   10      mail.example.org.

L'enregistrement MX indique quels serveurs de messagerie sont responsables de la gestion du courrier entrant pour la zone. mail.example.org est le nom de machine du serveur de messagerie, et 10 étant la priorité du serveur de messagerie.

On peut avoir plusieurs serveurs de messagerie, avec des priorités de 3, 2, 1. Un serveur de messagerie tentant de transmettre du courrier au domaine example.org essaiera en premier le MX avec la plus haute priorité, puis celui venant en second, etc, jusqu'à ce que le courrier puisse être correctement délivré.

Pour les fichiers de zone in-addr.arpa (DNS inverse), le même format est utilisé, à l'exception du fait que des entrées PTR seront utilisées en place de A ou CNAME.

$TTL 3600

1.2.3.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. (
                        5               ; Serial
                        10800           ; Refresh
                        3600            ; Retry
                        604800          ; Expire
                        3600 )          ; Minimum

@       IN NS   ns1.example.org.
@       IN NS   ns2.example.org.

2       IN PTR  ns1.example.org.
3       IN PTR  ns2.example.org.
10      IN PTR  mail.example.org.
30      IN PTR  example.org.

Ce fichier donne la correspondance entre adresses IP et noms de machines de notre domaine fictif.

23.6.7. Serveur de noms cache

Un serveur de noms cache est un serveur de noms qui ne fait autorité pour aucune zone. Il émet simplement des requêtes, et se souvient du résultat pour une utilisation ultérieure. Pour mettre en place un tel serveur, configurez le serveur de noms comme à l'accoutumé, en prenant bien soin de n'inclure aucune zone.

23.6.8. Exécution named dans un ``sandbox''

Pour plus de sécurité, il peut être préférable d'exécuter named(8) sous un utilisateur sans privilèges, et le configurer pour modifier l'emplacement de la racine du système de fichiers (chroot(8)) vers le répertoire du ``sandbox'' (bac à sable). Ceci rend inaccessible au ``daemon'' named tout ce qui est situé en dehors de l'environnement ``sandbox''. Si named est compromis, cela réduira l'impact des dommages. Par défaut, FreeBSD dispose d'un utilisateur et d'un groupe appelé bind, destiné à cet usage.

Note : De nombreuses personnes recommanderont qu'à la place de configurer named à ``chrooter'', vous devriez exécuter named dans un environnement jail(8). Cette section ne traitera pas ce cas de figure.

Puisque named ne sera pas en mesure d'avoir accès à des éléments extérieur au ``sandbox'' (comme aux bibliothèques partagées, aux ``sockets'' pour l'enregistrements des journaux, etc.), il y a un certain nombre d'étapes à suivre afin de permettre à named un fonctionnement correct. Dans la liste d'opérations qui suit, on suppose que l'emplacement du ``sandbox'' est /etc/namedb et que vous n'avez pas précédemment modifié le contenu de ce répertoire. Effectuez les étapes suivantes en tant que root:

L'étape suivante est d'éditer le fichier /etc/namedb/etc/named.conf pour que named puisse savoir quelles zones charger et où les trouver sur le disque. Un exemple commenté suit (tout ce qui n'est pas spécifiquement commenté ici n'est pas différent de la configuration d'un serveur DNS ne tournant pas dans un ``sandbox''):

options {
        directory "/";(1)
        named-xfer "/bin/named-xfer";(2)
        version "";     // Ne pas révéler la version de BIND
        query-source address * port 53;
};
// socket de contrôle ndc
controls {
        unix "/var/run/ndc" perm 0600 owner 0 group 0;
};
// Les zones:
zone "localhost" IN {
        type master;
        file "master/named.localhost";(3)
        allow-transfer { localhost; };
        notify no;
};
zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "master/localhost.rev";
        allow-transfer { localhost; };
        notify no;
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" {
    type master;
    file "master/localhost-v6.rev";
    allow-transfer { localhost; };
    notify no;
};
zone "." IN {
        type hint;
        file "master/named.root";
};
zone "private.example.net" in {
        type master;
        file "master/private.example.net.db";
    allow-transfer { 192.168.10.0/24; };
};
zone "10.168.192.in-addr.arpa" in {
        type slave;
        masters { 192.168.10.2; };
        file "slave/192.168.10.db";(4)
};
(1)
L'option directory est définie par /, puisque tous les fichiers dont named a besoin sont dans ce répertoire (ceci est équivalent au fichier /etc/namedb d'un utilisateur ``normal'').
(2)
Indique le chemin d'accès complet du binaire named-xfer (à partir de l'arborescence utilisée pour named). Ceci est nécessaire puisque named est compilé pour chercher named-xfer par défaut dans le répertoire /usr/libexec.
(3)
Indique le nom de fichier (relatif à la valeur de directory plus haut) où named le fichier de zone pour cette zone.
(4)
Indique le nom de fichier (relatif à la valeur de directory plus haut) où named devrait trouver une copie du fichier de zone pour cette zone après l'avoir transféré avec succès à partir du serveur maître. C'est pourquoi nous avons eu besoin de changer le propriétaire du répertoire slave pour bind dans les étapes de configuration précédentes.

Après avoir complétées les étapes précédentes, redémarrez votre serveur ou relancez syslogd(8) et démarrez named(8), en s'assurant de bien utiliser les nouvelles options spécifiées dans les variables syslogd_flags et named_flags. Vous devriez disposez maintenant d'une version de named tournant dans un environnement ``sandbox''!

23.6.9. Sécurité

Bien que BIND soit l'implémentation la plus courante du DNS, le problème de la sécurité subsiste toujours. De possibles problèmes de sécurité exploitables sont parfois découvert.

C'est une bonne idée de lire les avis de sécurité du CERT et de s'inscrire à la liste de diffusion des avis de sécurité pour FreeBSD pour se maintenir au courant des problèmes de sécurité actuels de l'Internet et de FreeBSD.

Astuce : Si un problème surgit, conserver les sources à jour et disposer d'une version compilée de named récente ne seront pas de trop.

23.6.10. Lectures supplémentaires

Les pages de manuel de BIND/named: ndc(8) named(8) named.conf(5).

Ce document, ainsi que d'autres peut être téléchargé sur ftp.FreeBSD.org/pub/FreeBSD/doc/.

Pour toutes questions à propos de FreeBSD, lisez la documentation avant de contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:13