Installation d’un serveur DNS avec bind sur FreeBSD 10.1


Où l’on voit pourquoi et comment installer un serveur DNS Le DNS (Domain Nane Server) est un service chargé de traduire les adresses IP (198.51.100.22) en adresse compréhensible par les humains (www.example.com).

Il existe plusieurs logiciels pour gérer ce service (unbound, nsd, PowerDNS…). Je vais utiliser celui que ne connaît le moins mal, BIND. BIND est sans doute l’un des plus répandus et signifie Berkeley Internet Name Daemon.

  toutes les subtilités du DNS ne seront pas traitées dans cet article. Simplement la mise en place d’un serveur maître caché qui envoie la zone sur laquelle il fait autorité vers un autre serveur DNS (en fait 2). Notre serveur n’est pas exposé directement sur Internet.

  la terminologie ancienne serveur primaire/secondaire est maintenant remplacée par maître/esclave pour clarifier le fait qu’il s’agit juste d’une hiérarchie interne de configuration entre les serveurs, et non d’une priorité pour répondre aux requêtes concernant la zone. Vu de l’extérieur, les serveurs sont interrogés au même titre.

Installation

Une fois de plus, c’est pkg que nous allons utiliser pour installer le logiciel.

1
# pkg install bind910-9.10.2_2

À la fin de l’installation, un avertissement nous signale que bind nécessite la configuration de rndc et en particulier la génération d’une clef secrète. Fort heureusement, le fichier de démarrage /usr/local/etc/rc.d/named le fait pour nous. Nous pouvons aussi utiliser la commande décrite (rdnc-confgen -a).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
*            _  _____ _____ _____ _   _ _____ ___ ___  _   _         *
*           / \|_   _|_   _| ____| \ | |_   _|_ _/ _ \| \ | |        *
*          / _ \ | |   | | |  _| |  \| | | |  | | | | |  \| |        *
*         / ___ \| |   | | | |___| |\  | | |  | | |_| | |\  |        *
*        /_/   \_\_|   |_| |_____|_| \_| |_| |___\___/|_| \_|        *
*                                                                    *
*   BIND requires configuration of rndc, including a "secret" key.   *
*    The easiest, and most secure way to configure rndc is to run    *
*   'rndc-confgen -a' to generate the proper conf file, with a new   *
*            random key, and appropriate file permissions.           *
*                                                                    *
*     The /usr/local/etc/rc.d/named script will do that for you.     *
*                                                                    *

J’ai choisi l’option de le faire moi même, ne serait-ce que pour voir ce qui se passe :

1
2
3
4
5
6
7
8
# rndc-confgen -a
wrote key file "/usr/local/etc/namedb/rndc.key"

# more rndc.key
key "rndc-key" {
        algorithm hmac-md5;
        secret "uXVu46pVZySPKXPdd5LS+Q==";
};

Configuration

Nous avons plusieurs choses à configurer pour faire tourner notre DNS. La (ou les) zone sur lesquels nous faisons autorité, et le service bind lui-même. Commençons par la zone. À titre d’exemple, je vais utiliser justement la zone example.com qui est réservée pour la documentation et une adresse IP (198.51.100.22) elle aussi destinée à la documentation. Vous n’aurez qu’à changer ces deux paramètres pour votre propre zone.

Configuration de la zone example.com

Le fichier que nous allons créer va porter le nom de notre zone, cela permet de mieux le repérer si nous en avons plusieurs. Appelons le db.example.com. Il sera dans le répertoire /usr/local/etc/namedb/working.

L’enregistrement SOA

La première partie du fichier est ce que l’on appelle l’enregistrement SOA (pour StartOfAuthority).

1
2
3
4
5
6
7
8
$ORIGIN example.com.
$TTL 300
example.com.             IN SOA tapir.example.com. root.example.com. (
        2015042201      ; Serial
        3600            ; Refresh
        600             ; Retry
        86400           ; Expire
        3600)           ; TTL

Ce qui signifie :

  • $ORIGIN → déclare le suffixe appliqué aux noms relatifs (les noms qui ne se terminent pas par un point) lors de la lecture du fichier. En général c’est le nom de la zone elle-même ;
  • $TLL 300 → TimeToLive, la durée de vie par défaut des données pour l’ensemble des enregistrements de la zone, sauf spécification contraire ;
  • example.com. → la zone concernée par notre fichier ;
  • IN → il s’agit d’une la classe de l’enregistrement, ici un enregistrement INternet ;
  • SOA → comme nous l’avons déjà vu, Start Of Authority ;
  • tapir.example.com. → le nom de la machine ;
  • root.example.com → l’adresse email du responsable de la zone, avec son @ remplacé par un point ;
  • 2015042201 ; Serial → le numéro de série du fichier. Il faut le changer manuellement à chaque modification car il sert à prévenir les serveurs eslaves que le fichier de zone a été modifié. En général, on utilise la date en ISO, les deux derniers chiffres indiquant un incrément de changement dans la même journée ;
  • 3600 ; Refresh → indique le laps de temps après lequel les serveurs esclaves vont tenter de rafraîchir la zone auprès des serveurs principaux, se basant sur le Serial. Il s’agit d’un nombre de secondes ;
  • 600 ; Retry → indique le temps après lequel les serveurs DNS esclaves vont tenter de recontacter les serveurs maîtres en cas d’échec au moment du Refresh. Cette valeur est aussi exprimée en seconde ;
  • 86400 ; Expire → indique le temps après lequel un serveur esclave doit « oublier » (ne plus faire autorité pour) la zone s’il n’arrive pas à contacter le serveur maître ;
  • 3600 ; TTL → indique la durée de vie des données du cache négatif, c’est à dire les informations indiquant la non-existence d’un nom.

Nous avons fait le plus compliqué (pour les fichiers de zones). Nous allons maintenant voir comment y ajouter des machines.

Les enregistrements des machines

Nous allons commencer par indiquer quels sont les serveurs DNS faisant autorité pour notre zone. Dans mon cas, mon DNS est caché derrière deux autres serveurs, ns1.secondaire.com et ns2.secondaire.com.

1
2
3
@   IN      NS  ns1.secondaire.com.
@   IN      NS  ns2.secondaire.com.
@   IN      A   198.51.100.22

J’indique ensuite mon propre serveur. Le @ en début de ligne indique que j’utilise $ORIGIN. Viennent ensuite les machines proprement dites :

1
2
webmail.tapir.example.com.    IN      A       198.51.100.22
webmail.example.com.          CNAME           webmail.tapir.example.com.

La première associe un nom de serveur, pleinement qualifié (FQDN, Fully Qualified Domain Name)1 à une adresse IP via un enregistrement de classe INternet et de type A. La seconde ligne définit un second nom (webmail.example.com) pour un enregistrement déjà existant, « le nom canonique », via un enregistrement de type CNAME. C’est un alias du premier nom.

1
2
3
# named-checkzone example.com db.example.com 
zone example.com/IN: loaded serial 2015042201
OK

Les fichiers de configuration de BIND

Nous allons minimiser l’impact de notre configuration sur les fichiers de configuration de base. Notre configuration sera faite dans le fichier /usr/local/etc/namedb/named.conf.local et nous ferons en sorte que ce fichier soit inclus dans la configuration générale. Ce fichier est en fait très simple. Nous allons simplement définir pour chacune des zones que nous gérons si notre serveur est maître (master) ou esclave (slave) et où se trouve le fichier de description, celui que nous avons créé précédemment.

1
2
3
4
5
6
zone "example.com" {
        type master;
        file "/usr/local/etc/namedb/working/db.example.com";
        allow-transfer {192.0.2.3;192.0.2.5;};
        also-notify {192.0.2.3;};
};

On indique que l’on autorise le transfert vers les deux serveurs DNS esclaves, ceux qui répondront aux requêtes des internautes. Nous notifions aussi l’un d’entre eux lors des modifications de zone. Dans le fichier /usr/local/etc/namedb/named.conf nous ajoutons, à la fin, la ligne :

1
include "/usr/local/etc/namedb/named.conf.local";

Et nous pouvons maintenant vérifier notre configuration avec la commande named-checkconf :

1
2
3
4
5
6
7
8
# named-checkconf -z named.conf
zone localhost/IN: loaded serial 42
zone 127.in-addr.arpa/IN: loaded serial 42
zone 255.in-addr.arpa/IN: loaded serial 42
zone 0.ip6.arpa/IN: loaded serial 42
zone 0.in-addr.arpa/IN: loaded serial 42
zone 10.in-addr.arpa/IN: loaded serial 42
zone example.com/IN: loaded serial 2015042201

Avant de lancer bind, nous allons ajouter un fichier de configuration pour gérer les traces. Ce fichier se nommera named.conf.log et se trouvera dans /usr/local/etc/namedb. Nous allons y définir des canaux (channel) en dépendant des différentes activités de notre serveur DNS et ensuite affecter les canaux aux différentes catégories. La première d’entre elles étant default :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
logging {
	channel update_debug {
		file "/var/log/named/update_debug.log" versions 3 size 100k;
		severity debug;
		print-severity yes;
		print-time yes;
	};

	channel securit_info {
		file "/var/log/named/security_info.log" versions 1 size 100k;
		severity info;
		print-severity yes;
		print-time yes;
	};

	channel bind_log {
		file "/var/log/named/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; };
};

Les fichiers de traces sont rangés dans un répertoire spécifique de /var/log. Il faut créer ce répertoire et en changer le propriétaire. Il faut penser à ajouter l’inclusion de ce fichier dans le named.conf et vérifier à nouveau la configuration avec named-checkconf.


  1. un nom de machine pleinement qualifié ou Full Qualified Domain Name est le nom de la machine suivi du nom de domaine. tamanoir est le nom de la machine, example.com est le nom de domaine et tamanoir.example.com est le nom pleinement qualifié. Contrairement à ce que l’on peut lire, un nom pleinement qualifié ne doit pas obligatoirement comporter trois et seulement trois éléments : machine.martine.cherche.arboricole.inria.fr est parfaitement valable et constitue un nom pleinement qualifié. ↩︎

powered by FreeBSD