DNS pour le réseau local

Published: lun. 13 septembre 2021
Updated: lun. 20 septembre 2021
By Jorispilot

In sysadmin.

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

links

social