HOWTO Bind
Un article de Gentoo Linux Wiki.
Cet article est une ébauche. Vous pouvez l'aider à s'enrichir en le complétant.
| 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.
