HOWTO Bind

Un article de Gentoo Linux Wiki.

Cet article est une ébauche. Vous pouvez l'aider à s'enrichir en le complétant.

Cet article fait partie des HOWTOs.
Méthodes d'installation CD Live Noyau et matériel Portables et Notebooks Portage Système Réseaux et Services Serveur X Logiciels fréquemment utilisés Autres


Sommaire

[modifier] Introduction

BIND (Berkeley Internet Name Domain) est le serveur DNS le plus utilisé sur Internet, spécialement sur les systèmes de type Unix. Il est présentement maintenu par Internet Systems Consortium.


[modifier] Installation

Il faut commencer par choisir les USEs flags que l'on veut :

  • berkdb : support de sys-libs/db (Berkeley DB pour MySQL)
  • ipv6 : support IPv6
  • ldap : support LDAP (Lightweight Directory Access Protocol)
  • ssl : support pour les connexions Secure Socket Layer
  • dlz : patch pour stocker les informations de zone dans une base de donnée
  • doc : la documentation
  • idn : patch pour le support des nom de domaine internationalisé (nom de domaine pouvant avoir des caractères non-ASCII)
  • mysql : base mysql (ne peut pas être utilisé en même temps que dlz+threads)
  • odbc : support ODBC (Open DataBase Connectivity)
  • postgres : support pour la base postgresql
  • selinux : support de Security Enhanced Linux (uniquement avec le profil selinux)
  • threads : support des threads
  • resolvconf : Support du framework net-dns/resolvconf-gentoo
  • urandom : Utilise /dev/urandom plutot que /dev/random

Quand vous avez choisis les USE que vous voulez utiliser :

echo "net-dns/bind ipv6 dlz mysql idn" >> /etc/portage/package.use

Ensuite installez Bind (net-dns/bind) :

emerge bind


[modifier] Configuration

[modifier] Options

Dans le fichier named.conf.

Sous la forme :

 options {
   [option];
   ...
};

Options disponibles :

  • allow-query : Pour définir les hôtes autorisés à faire des requêtes sur le serveur
  • allow-recursion : Pour définir les hôtes autorisés à des faire des demandes récursives
  • listen-on : Pour définir l'interface réseau à utiliser (toutes par défaut)
  • forwarders : Pour définir les IPs des serveurs où les requêtes doivent être relayée
  • blackhole : Pour définir les hôtes qui non autorisés
  • directory : Pour définir le répertoire de travail (/var/named par défaut)
  • statistics-file : Pour définir l'emplacement du fichier de statistiques (par défaut /var/named/stats)
  • forward : Options pour la retransmission des requêtes. Les options suivantes sont acceptées :
    • first : les DNS de la directive forwarders sont essayés en premier
    • only : pas de résolution locale si les DNS de la directive forwarders n'ont pas réussi la résolution
  • notify : Pour définir si le service envoie une notification aux serveurs esclaves lors d'une mise à jour :
    • yes : notification
    • bo : pas de notification
    • explicit : notification seulement aux serveurs spécifiés par also-notify dans la déclaration de zone


Exemple :

File: /etc/named.conf
options {
   directory "/etc/namedb";
   forwarders {
      212.27.32.176;
      212.27.32.177;
   };
   allow-query {gentils;};  définit dans les listes ACL
   listen-on { 192.168.0.1; };
};	 

[modifier] Logs

Le fichier de log de Bind peut vite être incompréhensible et énorme, le diviser peut faciliter la recherche en cas de problèmes :

File: /etc/named.conf
logging {

  channel default_file { file "/var/log/named/default.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel general_file { file "/var/log/named/general.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel database_file { file "/var/log/named/database.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel security_file { file "/var/log/named/security.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel config_file { file "/var/log/named/config.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel resolver_file { file "/var/log/named/resolver.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel xfer-in_file { file "/var/log/named/xfer-in.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel xfer-out_file { file "/var/log/named/xfer-out.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel notify_file { file "/var/log/named/notify.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel client_file { file "/var/log/named/client.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel unmatched_file { file "/var/log/named/unmatched.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel queries_file { file "/var/log/named/queries.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel network_file { file "/var/log/named/network.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel update_file { file "/var/log/named/update.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel dispatch_file { file "/var/log/named/dispatch.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel dnssec_file { file "/var/log/named/dnssec.log" versions 3 size 5m; severity dynamic; print-time yes; };
  channel lame-servers_file { file "/var/log/named/lame-servers.log" versions 3 size 5m; severity dynamic; print-time yes; };

  category default { default_file; };
  category general { general_file; };
  category database { database_file; };
  category security { security_file; };
  category config { config_file; };
  category resolver { resolver_file; };
  category xfer-in { xfer-in_file; };
  category xfer-out { xfer-out_file; };
  category notify { notify_file; };
  category client { client_file; };
  category unmatched { unmatched_file; };
  category queries { queries_file; };
  category network { network_file; };
  category update { update_file; };
  category dispatch { dispatch_file; };
  category dnssec { dnssec_file; };
  category lame-servers { lame-servers_file; };

};


[modifier] ACL

Pour éviter d'avoir à entrer toujours la même liste d'ip dans les différentes options on peut utiliser les ACLs.

Sous la forme :

acl [nom_acl] {
   [membre 1];
   [membre 2];
   ...
};	 

Les mots clefs suivants peuvent être utilisés :

  • any : toutes les addresses IP
  • localhost : adresses ip locales
  • localnets : adresses du réseau
  • none : aucune IP


Exemple :

File: /etc/named.conf
acl mechants {
   193.238.151.0/24
   192.168.2.0/24;
};

acl gentils {
   204.152.191.0/24
   192.168.3.0/24;
};


[modifier] Zones

[modifier] Déclaration de la zone

Dans le fichier named.conf il faut déclarer les différentes zones.

De la forme :

zone [nom-zone] [type-zone] {
   [option 1];
   [option 2];
   ...
};	

Voici les différentes options :

  • allow-query : Les clients autorisés à faire des requêtes sur cette zone
  • allow-transfer : Les serveurs esclaves autorisés à demander un transfert des informations de cette zone
  • allow-update : Hôtes autorisés à mettre à jour les informations de cette zone
  • file : Fichier de configuration de la zone
  • masters : IPs faisant autorité sur la zone
  • notify : Pour définir si le service envoie une notification aux serveurs esclaves lors d'une mise à jour :
    • yes : notification
    • bo : pas de notification
    • explicit : notification seulement aux serveurs spécifiés par also-notify dans la déclaration de zone
  • type : Pour définir le type de zone :
    • forward : relaie toutes les demandes vers d'autres DNS
    • hint : redirige les demandes vers les serveurs racines
    • master : Serveurs de noms faisant autorité pour cette zone
    • slave : Serveurs de noms esclave pour cette zone

Exemple :

File: /etc/named.conf
# Serveur maître : 
   zone "." {
   type hint;
   file "named.root";
};

zone "mondomaine.com" IN {
   type master;
   file "mondomaine.com.zone";
   allow-update { none; };
};

# Serveur esclave : 
zone "mondomaine.com" {
   type slave;
   file "mondomaine.com.zone";
   masters { 192.168.1.1; };
};	


[modifier] Fichiers de zone

[modifier] Variables

On peut spécifier au début du fichier les valeurs par défaut des enregistrements :

  • $TTL : durée maximun pour garder un enregistrement dans le cache en secondes
  • $ORIGIN : Pour définir le nom de domaine à ajouter pour reconstituer le FQDN
  • $INCLUDE : Pour indiquer le chemin d'accès d'un fichier à utiliser


[modifier] Enregistrements

[modifier] SOA
@ IN SOA dns.mondomaine.com. root.mondomaine.com. ( 
               2000042701 ; serial
               3600 ; refresh
               900 ; retry
               1209600 ; expire
               43200 ; default_ttl
            ) 
  • le @ : manière simplifiée de définir la zone (ici mondomaine.com)
  • le TTL : durée maximun pour garder un enregistrement dans le cache en secondes (inutile si déjà spécifié et identique à $TTL)
  • le type IN : on pourra ne pas le préciser dans la suite du fichier. Il n'y a qu'un seul enregistrement SOA.
  • dns.mondomaine.com. : le nom pleinement qualifié du serveur de nom. Ne pas oublier le "." à la fin des noms absolus.
  • root.mondomaine.com : adresse électronique de l'administrateur du serveur, avec un . à la place de l'@.
  • ensuite, entre parenthéses :
    • le numéro de série : à incrémenter à chaque modification du fichier (permet aux esclaves de savoir qu'il y a du nouveau). Il est recommandé d'avoir un numéro du type yyyymmdd, suivi d'un numéro d'ordre.
    • Refresh, Retry, et Expire : délais, en secondes, pour le comportement des serveurs esclaves : A l'expiration du délai refresh, l'esclave va interroger le maître, s'il ne le trouve pas, il essaiera de nouveau à la fin du délai retry. Et si, au bout du délai expire, il n'a toujours pas réussi, il considérera que le serveur maître a été retiré du service.


[modifier] NS

Permet de définir les serveurs de noms ayant autorité sur le domaine.

Exemple :

@ IN NS ns1.mondomaine.com.
@ IN NS ns2.mondomaine.com.


[modifier] MX

Permet de définir les serveurs de mails.

Exemple :

@ IN MX 10 mail1.mondomaine.com.
@ IN MX 20 mail2.mondomaine.com.

Le nombre après MX définis la priorité, ici on essaye déjà mail1.mondomaine.com


[modifier] A

Permet de définir la correspondance entre le nom et l'adresse IP.

Exemple :

ns1 IN A 234.234.234.5
ns2 IN A 234.234.234.6
mail1 IN A 234.234.234.7
mail2 IN A 234.234.234.8


[modifier] AAAA

Même chose que pour le type A, mais pour de l'IPv6.

Exemple :

ipv6 IN AAAA 2001:130:20e:10:20e:cff:fe90:e863


[modifier] CNAME

Permet de faire correspondre un alias au nom canonique.

Exemple :

serveur IN CNAME mail1.mondomaine.com.
www IN CNAME mondomaine.hebergeur.com.
search IN CNAME www.google.com.


[modifier] SRV

Permet d'indiquer où trouver un service pour divers protocoles. Il s'agit d'une généralisation du MX.

Sous la fome : Type_service (TTL) SRV priorité (poids) port nomduserveur

Listes des types de services : http://www.dns-sd.org/ServiceTypes.html

Exemple :

_sip._udp IN SRV 0 1 5060 sip.mondomaine.com. 


[modifier] TXT

Cet enregistrement est utilisé pour SPF. http://www.openspf.org/

Exemple :

mondomaine.com. IN TXT "v=spf1 ip4:234.234.234.1 ~all"


[modifier] Exemple
File: mondomaine.com.zone
$TTL 864000
@ IN SOA dns.mondomaine.com. root.mondomaine.com. ( 
               2000042701 ; serial
               3600 ; refresh
               900 ; retry
               1209600 ; expire
               43200 ; default_ttl
            ) 

@ IN NS dns.mondomaine.com. ; Nom du serveur Dns
@ IN MX 10 dns.mondomaine.com. ; Champ MX qui définit les noms
serveur IN A 192.168.1.30 ; On attribue le nom serveur à l'ip 192.168.30.1
robert IN A 192.168.1.32 ;De même pour les autres machines
titi IN A 192.168.1.33

www IN CNAME serveur.mondomaine.com. ; Adresse www.mondomaine.com
ssh IN CNAME serveur.mondomaine.com. ; Pour serveur ssh
pop IN CNAME serveur.mondomaine.com. ; Pour serveur pop3
smtp IN CNAME serveur.mondomaine.com. ; Pour le serveur smtp


[modifier] Zone inverse

Permet de fournir un FQDN à partir d'une adresse IP.


[modifier] IPv4

[modifier] Déclaration de la zone

De la même façon que les autres zones :

File: named.conf
zone "1.0.10.in-addr.arpa" IN {
   type master;
   file "mondomaine.com.reverse.zone";
   allow-update { none; };
};	    


[modifier] Fichiers de zone inverse

Les fichiers ont la même forme que ceux précédents.

Exemple :

File: mondomaine.com.reverse.zone
$ORIGIN 1.168.192.in-addr.arpa.
$TTL 86400
@ IN SOA dns.mondomaine.com.  hostmaster.mondomaine.com. (
               2000042701 ; serial
               3600 ; refresh
               900 ; retry
               1209600 ; expire
               43200 ; default_ttl
            ) 

	       IN	NS	    dns.mondomine.com.
	       IN	MX    10    mail1.mondomaine.com.
	       IN	MX    20    mail2.mondomaine.com.
2	       IN       PTR	    toto.mondomaine.com.
3	       IN       PTR	    tata.mondomaine.com.

[modifier] IPv6

Pour construire la zone inverse IPv6 vous pouvez utiliser le site suivant : http://www.fpsn.net/index.cgi?pg=tools&tool=ipv6-inaddr


[modifier] Bind DLZ

[modifier] Présentation

DLZ (Dynamically Loadable Zones) est un patch sous licence de type BSD pour Bind qui permet de simplifier l'administration de Bind et de consommer moins de mémoire en stockant les informations de zone dans une base de données. Les changements sont ainsi immédiat et ne nécessitent pas de relancer Bind.

DLZ est disponible à cette adresse : http://bind-dlz.sourceforge.net


[modifier] Préparation de la base de données

DLZ supporte beaucoup de base de données différentes : PostgreSQL, MySQL, Berkeley DB, ODBC (donc Firebird, DB2, Oracle, Sybase, SAPDB) et LDAP. L'exemple sera ici MySQL.

Voici une table type pouvant être utilisée par DLZ :

CREATE TABLE dns_records (
   zone         text not NULL,
   host         text,
   ttl          int(11) default NULL,
   type         varchar(10),
   mx_priority  varchar(5) default NULL,
   data         text,
   resp_person  text,
   serial       varchar(20) default NULL,
   refresh      varchar(11) default NULL,
   retry        varchar(11) default NULL,
   expire       varchar(11) default NULL,
   minimum      varchar(11) default NULL,
   INDEX        zone_host_index (zone(30), host(30)),
   INDEX        type_index (type(8))
) TYPE=MyISAM;

Les champs correspondent ici à :

  • ttl : Durée en seconde pendant laquelle les enregistrements seront valides
  • type : Type d'enregistrement (soa, ns,a,mx,...)
  • host : Nom d'hôte ou adresse IP
  • mx_priority : Priorité du serveur de messagerie
  • data : Adresse IP / Nom d'hôte / Nom de domaine
  • primary_ns : Serveur de nom primaire, pour l'enregistrement SOA
  • resp_person : L’adresse email de la personne à contacter, pour l'enregistrement SOA
  • serial : Numéro de série, pour l'enregistrement SOA
  • refresh : Délai d'actualisation, pour l'enregistrement SOA
  • retry : Délai avant un nouvel essai, pour l'enregistrement SOA
  • expire : Délai d'expiration, pour l'enregistrement SOA
  • minimum : TTL minimum, pour l'enregistrement SOA


[modifier] Configuration de Bind

Il faut ajouter dans le fichier de configuration de Bind, named.conf, pour la table précédente, les lignes suivantes :

File: /etc/named.conf
dlz "Mysql zone" {
   database "mysql 
   {host=127.0.0.1 dbname=bind_data port=3306 user=bind pass=bind } 
   {select zone from dns_records where zone = '%zone%' limit 1}
   {select  ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') 
   when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) 
   else data end as mydata from dns_records where zone = '%zone%'
   and host = '%record%'}";
};
  • La première ligne : dlz "Mysql zone" {

Cette ligne permet d'indiquer à Bind que l'on souhaite utiliser DLZ, « Mysql zone » permet d'indiquer un nom à cette configuration.

  • La seconde ligne : database "mysql

Cette ligne précise la base de données utilisée. Le mot clef « database » est indispensable. Le premier argument de la ligne de commande qui est passé à DLZ doit être le type de base de données utilisé, ici «mysql ». Cette syntaxe doit impérativement être respectée.

  • La troisième ligne : {host=127.0.0.1 dbname=bind_data port=3306 user=bind pass=bind }

Elle doit être adapté suivant le serveur et la base Mysql utilisée

  • Enfin la première requête permet de savoir si une zone est supporté par la base de données. La seconde requête permet de déterminer les enregistrements d'une zone.


[modifier] Ajout d'enregistrements

Pour ajouter un enregistrement de type SOA dans la base de donnée MySQL utilisé ici, il faut lancer cette requête :

INSERT INTO dns_records (zone, host, ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) VALUES
 ("mondomaine.com","@","10","soa","","ns1.mondomaine.com.","admin.mondomaine.com.","2","28000","2800","64800","10");

De même, pour un enregistrement de type MX :

INSERT INTO dns_records (zone, host, ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) VALUES 
   ("mondomaine.com","@","10","mx","10","mondomaine.com.","","","","","","");

Pour un enregistrement de type A :

INSERT INTO dns_records (zone, host, ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) VALUES 
    ("mondomaine.com","@","10","a","","127.0.0.1","","","","","","");

Pour un enregistrement de type NS :

INSERT INTO dns_records (zone, host, ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum) VALUES 
    ("mondomaine.com","@","10","ns","","ns1.mondomaine.com.","","","","","","");

Et ainsi de suite pour l'ensemble des enregistrements possibles.

Remarques importantes Lors du déploiement de cette solution il faut faire attention à certains points :

  • Il faut éviter d'utiliser le même serveur de base de donnée pour le DNS primaire et secondaire, en effet dans ce cas en cas de problème avec le serveur les deux DNS deviennent inutiles. Pour cela il faut répliquer la base de données en ayant une base indépendante pour chaque serveur DNS..
  • Normalement, sans DLZ, un serveur DNS est définis en tant que serveur de noms maître et les autres en tant que serveurs de noms esclaves. Cette pratique est à éviter avec DLZ, en effet le but de DLZ est que le serveur DNS soit à jour immédiatement, or avec le transfert de zone le serveur maître et les esclaves peuvent êtres désynchroniser pendant une période assez longue ou nécessiter un transfert important de données.


[modifier] TSIG

Pour générer une clef 768 bit RSASHA1 pour la zone mondomaine.com zone:

dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 128 -n HOST primary-secondary.mon.dom

Cette commande doit produire 2 fichiers, par exemple : Kprimary-secondary.mon.dom.+157+12345.key and Kprimary-secondary.mon.dom.+157+12345.private.

cat Kprimary-secondary.mon.dom.+157+12345.key
primary-secondary.mon.dom.
IN KEY 512 3 157 gQOqMJA/LGHwJa8vtD7u6w==

La clef est gQOqMJA/LGHwJa8vtD7u6w==, créer un fichier /etc/bind/shared.keys sur le DNS primaire et secondaire :

File: /etc/bind/shared.keys
key primary-secondary.mon.dom.{
    algorithm hmac-md5;
    secret "gQOqMJA/LGHwJa8vtD7u6w==";
};

Ensuite sur le DNS maitre :

File: named.conf
include "/etc/bind/shared.keys"

server 192.168.1.2 {
   keys { primary-secondary.mon.dom; };
};

zone "mon.dom" {
     type master;
     file db.mon.dom;
     allow-transfer { key primary-secondary.mon.dom. ; };
};

Même chose sur le DNS esclave :

File: named.conf
include /etc/bind/shared.keys
server 192.168.1.1 {
   keys { primary-secondary.mon.dom; };
};

zone "mon.dom" {
     type slave;
     master { 192.168.1.1 };
     file mon.dom.cache;
     allow-transfer { none; };
};


[modifier] DNSSEC

DNSSEC permet de résoudre certains problèmes de sécurité du DNS. Il permet de sécuriser les données envoyées par le DNS.

[modifier] Génération d'une clef

Pour générer une clef 768 bit RSASHA1 pour la zone mondomaine.com zone:

dnssec-keygen -a RSASHA1 -b 768 -n ZONE mondomaine.com.

Cette commande doit produire 2 fichiers, par exemple : Kmondomaine.com.+005+12345.key and Kmondomaine.com.+005+12345.private.
La clef privée (.private) est utilisé pour générer les signatures, et la clef publique (.key) pour vérifier les signatures.

La clef publique doit ête dans le fichier de zone en utilisant la variable $INCLUDE.

[modifier] Signer une zone

Pour signer une zone :

dnssec-signzone -o mondomaine.com mondomaine.com.zone

Ceci donne le fichier mondomaine.com.zone.signed. Ce fichier doit être ajouté comme fichier de zone dans le named.conf.

[modifier] Références