Les adresses IP du réseau Internet sont les numéros de téléphone du réseau téléphonique. Le fichier /etc/hosts du PC est le carnet d’adresses du téléphone portable. Mais Internet dispose aussi d’un carnet d’adresses global et distribué: le DNS.
Voici un example de mise en place du DNS dans un réseau local.
La documentation n’est pas si simple à trouver; les man pages sont curieusement vides. Un bon exemple se trouve sur cette page [1]. Et quelques explications se trouvent ici [2] et d’autres là [3].
Présentation du réseau local
Dans notre réseau local, on dispose d’une box Internet, d’un serveur Raspberry Pi et de mon PC. S’ajoutent de temps en temps d’autres terminaux comme des téléphones mobiles.
Le serveur DHCP est localisé dans la box, le serveur de nom sera localisé dans le Raspberry Pi. Dans celui-ci, il suffit d’avoir le logiciel bind d’installé.
Configuration globale
Le serveur est donc situé dans le Raspberry Pi sous la forme d’un service named.service, qui est exécuté par l’utilisateur système named.
Bind se configure d’abord via le fichier /etc/named.conf, et chaque zone se configure dans un fichier à part. Voici le contenu, bloc par bloc, de ce premier fichier:
options {
directory "/var/named"; // Répertoire de travail (où chercher les fichiers de zone).
pid-file "/run/named/named.pid";
listen-on { 192.168.0.15; 127.0.0.1; }; // Limite les interfaces IPv4 d'écoute.
// listen-on-v6 { any; }; // Idem pour les adresses IPv6, desactivé ici.
allow-query { 192.168.0.0/24; 127.0.0.1; }; // Limite les adresses IPv4 autorisées à faire des requêtes.
allow-transfer { none; }; // Désactive le transfert d’information de zone.
allow-update { none; }; // Désactive la mise-à-jour d’information de zone.
allow-recursion { 192.168.0.0/24; 127.0.0.1; }; // Autorise le transfert de requêtes pour ces interfaces.
forwarders { 8.8.8.8; 8.8.4.4; }; // Serveurs de nom pour le transfert de requêtes.
};
Dans le bloc options, on a limité l’accès du serveur DNS aux machines locales. On a aussi désactivé la fonctionnalité de transfert d’information de zone car on n’utilise qu’un serveur; on ne compte pas non plus révéler notre réseau au monde extérieur.
Toutes les requêtes passeront par notre serveur, mais les requêtes pour des noms hors de notre domaine seront transmises à un autre serveur, ici les serveurs de Google.
Passons à la partie log:
logging {
channel bind_log {
stderr; // Stderr est capté par systemd-journald
print-category yes;
print-severity yes;
severity notice;
};
category default { bind_log; }; // Toutes les autres catégories
category update { bind_log; }; // Ne doit jamais arriver
category update-security { bind_log; };
category security { bind_log; };
channel query_log {
file "/var/log/named/queries.log" size 5M;
print-severity yes;
print-time yes;
severity info;
};
category queries { query_log; }; // Enregistrement des rquêtes DNS…
};
Vous pouvez vous passer de tout ce bloc si vous ne souhaitez pas enregistrer les actions du serveur. Dans le cas contraire, n’oubliez pas, ci besoin, de créer le dossier /var/log/named et de l’attribuer à l’utilisateur named.
Configuration de localdomain
On va définir le domaine de premier niveau localdomain, correspondant à la plage d’adresses IP 192.168.0.0/24. Il faut d’abord ajouter la zone dans le fichier /etc/named.conf
zone "localdomain" IN {
type master;
file "localdomain.zone";
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "reverse-192.168.0.zone";
};
On définit en fait deux zones, la deuxième servant au reverse DNS. Les noms de fichiers sont relatifs au répertoire de travail défini dans la section options. Le type master des zones signifie que ces zones sont définies ici, et pas en provenance d’un autre serveur.
Dans le fichier /var/named/localdomain.zone on trouve
;
; localdomain
;
$TTL 7200
@ IN SOA server.localdomain. postmaster.localdomain. (
1970010101 ; Serial
8H ; Refresh
30M ; Retry
1W ; Expire
1D ) ; Minimum
; Name servers
IN NS server
; Static hosts
box IN A 192.168.0.1
server IN A 192.168.0.2
pc IN A 192.168.0.3
Je vous laisse regarder les sources pour les détails pour l’enregistrement SOA (Start Of Authority). On trouve souvent dans les exemples un enregistrement de type MX pour les mails, mais on en n’a pas besoin ici.
Le plus important et que le Serial doit être incrémenté à chaque fois que le fichier est modifié et que le service named est redémarré. Le format suggéré est YYYYMMDD##, ce qui laisse 99 modifications par jour !
Il faut aussi que les adresses IP soit réservées au niveau de la box.
;
; Reverse DNS file for "192.168.0.0/24"
;
$TTL 7200
@ IN SOA server.localdomain. postmaster.localdomain. (
1970010101 ; Serial
8H ; Refresh
30M ; Retry
1W ; Expire
1D ) ; Minimum
; Name servers
IN NS server.localdomain.
; Static hosts
1 IN PTR box.localdomain.
2 IN PTR server.localdomain.
3 IN PTR pc.localdomain.
Le fichier est similaire pour les requêtes inverses. Les enregistrements sont toutefois de type PTR.
Mise en route
Pour commencer à utiliser le serveur de noms, il faut dire à son système d’utiliser le serveur 192.168.0.2. On a plusieurs approches:
- Soit directement dans /etc/resolv.conf, fichier qui sera probablement réécrit par un gestionnaire de réseau.
- Soit dans son gestionnaire de réseau, pour une configuration plus pérenne.
- Soit directement dans le serveur DHCP de la box. Attention à ne pas paralyser le réseau !
On pourra aussi renseigner le champ search localdomain pour trouver box, server, et pc sans avoir besoin d’ajouter .localdomain à leur noms.
Astuce: Recherches dans Firefox
Si vous tentez de consulter server.localdomain ou box.localdomain dans Firefox, celui-ci va faire une recherche avec le moteur de recherche par défaut. Pour éviter cela on peut, comme l’indique [4], ajouter localdomain à la liste blanche de Firefox dans about:config:
browser.fixup.domainwhitelist.localdomain boolean true
Bonus: Configuration de jpilot.fr
Les serveurs de mon domaine jpilot.fr sont stockées localement. On va donc gérer le domaine localement pour donner directement les adresses locales au lieu des adresses publiques. C’est possible, mais pas forcément désirable si l’on veut vérifier la résolution de noms sur Internet.
;
; jpilot.fr
;
$TTL 7200
@ IN SOA jpilot.fr. postmaster.jpilot.fr. (
2021091202 ; Serial
8H ; Refresh
30M ; Retry
1W ; Expire - 1 week
1D ) ; Minimum
; Name servers
IN NS @
; Static hosts
@ IN A 192.168.0.1
blog IN CNAME @
Dans ce fichier, @ représente le domaine jpilot.fr directement. Le sous-domaine blog.jpilot.fr qui est hébergé sur server est redirigé avec un CNAME.
TODO:
- hint sur ‘.’
- HTTP over DNS
Références
| [1] | https://www.brennan.id.au/08-Domain_Name_System_BIND.html#yourdomain |
| [2] | http://www.cybermike.net/reference/dns_info/named.conf.html |
| [3] | https://web.mit.edu/darwin/src/modules/bind/bind/doc/html/options.html |
| [4] | https://www.ghacks.net/2014/11/27/fix-firefox-searching-for-local-hostnames-immediately/ |