Mise en place d’un serveur DNS dynamique

Tutorial sur la mise en oeuvre d’un serveur DNS (BIND) Dynamique sous linux.

BIND (Berkeley Internet Name Domain) est surement un des serveurs les plus utilisés pour le bon fonctionnement d’Internet. C’est ce logiciel qui gère la plupart des noms de domaine sur Internet, il permet entre autre de gérer la correspondance entre adresses IP et nom de domaine.

Je ne reviendrais pas dans cet article sur le fonctionnement de DNS ni sur l’installation ni sur la configuration du systeme, je partirais donc du principe que vous avez déjà installé un serveur DNS, qu’au moins un nom de domaine est configuré, et que jusqu’ici tout fonctionne correctement.

Pourquoi un DNS dynamique ?

Si vous avez configuré un serveur DNS vous avez du remarqué que si l’adresse IP d’une machine change, il faudra aller modififier le fichier des enregistrements du domaine pour que la nouvelle adresse IP soit prise en compte. Souvent l’exemple donné est une machine qui reçoit une adresse IP via DHCP, et qui change à chaque redémarrage, par défaut DNS ne le sait pas, il faut donc faire la mise à jour à la main !

Vous me direz, pourquoi ne pas utilisé un service de type DynDNS ? Ben simplement parce que je souhaite utiliser mon propre nom de domaine, et que ce dernier est hébergé sur un serveur Dédié …

Mettre en place un DNS dynamique permettra donc de s’affranchir de la mise à jour de DNS, elle se fera toute seule !
La mise à jour automatique via DHCP est possible, mais n’est pour le moment pas l’objet de ce guide. Voyons la configuration de test ainsi que les objectifs à atteindre

Configuration et Objectifs
Configuration :
  • Serveur DNS : NS.domaine.com
  • Zone : domaine.net
  • Logiciels : BIND … et … c’est tout ;)
Objectifs :

J’ai une machine (monpc) connecté à Internet via mon FAI avec une adresse IP dynamique (a peu prés comme tout le mode quoi …), j’aimerais mettre en place certains services sur cette machine et y acceder de n’importe où. Je pourrais utiliser un service de type DynDNS, mais j’ai envie d’utiliser mon propre nom de domaine, qui, comme je l’ai déjà dit, est hébergé sur un serveur Dédié.

L’objectif est donc d’arriver à mettre à jour un hôte de ma zone : domaine.net. De façon a pouvoir acceder à ma machine en utilisant l’URL suivante : monpc.mondomaine.net.

Je voudrais aussi que la transaction soit assez sécurisée (un peu plus qu’avec un login/password quoi !)

Je voudrais aussi que certains de mes amis puissent utiliser le système pour leurs machines

Enfin ma machine connectée à Internet tourne sous la distribution IPCOP, et donc je souhaiterais automatisée la mise a jour de ma zone à chaque changement d’IP

Etape 1 : Génération de la clé

Comme je l’ai précisé plus haut, je souhaiterais que la mise à jour de mla zone se fasse de manière sécurisée. Nous allons donc utilisée une clé de cryptage générée à l’aide de la commande dnssec-keygen fournie avec BIND, la clé générée sera au format TSIG on parle d’ailleur de clé TSIG.
Je me place donc dans le répertoire de mon choix et je génére la clé … Comme les zones gérées par mon serveur sont stockées dans le répertoire /var/named/zones/, j’ai créé le dossier /var/named/keys/ dans lequel je sotckerais mes clés générées.
Voyons donc la génération des clés :

Création d’une clé de cryptage

[root@monsrv ~]# cd /var/named/keys/ // Je me place dans le bon repertoire
[root@monsrv keys]# /usr/sbin/dnssec-keygen -a HMAC-MD5 -b 512 -n HOST macle1 // Je génére ma clé
Kmacle1.+157+30505 // La réponse : le nom de ma clé
[root@monsrv keys]# chown named.named ./Kmacle1.+157+30505.* // Je rend l’utilisateur named propriétaire de ma clé

Explications :

Vous l’aurez compris, c’est la deuxième ligne qui est la plus intéressante, en effet, c’est cette ligne qui permet de créer la clé …
Une info, quand meme, chez moi l’utilitaire dnssec-keygen se trouve dans le répetoire /usr/sbin/, il pourra se trouver ailleurs sur votre machine en fonction de votre installation de BIND, uiliser find ou locate pour le trouver …
Revenons sur la deuxième ligne de notre exemple, on comprendra aisément que -a HMAC-MD5 détermine le protocole de cryptage utilisé, le parametre -b 512 détermine la longueur de la clé, le parametre -n HOST détermine le type d’enregistrement, il peut avoir les valeurs : ZONE | HOST | ENTITY | USER, et enfin macle1 est le nom de ma clé.

Pour en savoir plus sur les paramètres de dnssec-keygen, utilsé l’argument -?

Si on regarde le contenu de notre répertoire /var/named/keys/ on verra 2 fichiers qui ont le même nom, et qui finissent par .private et .key soit : Kmacle1.+157+30505.private et Kmacle1.+157+30505.key

Voyons à quoi ressemble la clé générée :

Contenu du fichier .key

vi Kmacle1.+157+30505.key

macle1. IN KEY 512 3 157 Zwc51Lxzt6ggjmrVRZuoBqKg/Y3S8ulAsrCNMRY+2dgQdwWwCaElBHnGYHoWdewF59w58YfEP/xUbgKDYPSUNg==
~
~
~
"./keys/Kmacle1.+157+30505.key" 1L, 115C

La clé macle1 est donc : Zwc51Lxzt6ggjmrVRZuoBqKg/Y3S8ulAsrCNMRY+2dgQdwWwCaElBHnGYHoWdewF59w58YfEP/xUbgKDYPSUNg==

Maintenant voyons comment configurer notre zone DNS

Etape 2 : Configuration de la zone
Création d’un fichier de clés

Maintenant que la clé est définie, nous allons créer un fichier qui contiendra toutes les clés définies, et ce pour faciliter l’administration de votre serveur et donc ne pas surcharger le fichier de configuratiion de BIND (/etc/named.conf chez moi …).

On va donc créer un fichier : /var/named/theokeys.conf, bien sur le nom du fichier importe peu …

/var/named/theokeys.conf

vi /var/named/theokeys.conf

key macle1 {
    algorithm HMAC-MD5;
    secret "Zwc51Lxzt6ggjmrVRZuoBqKg/Y3S8ulAsrCNMRY+2dgQdwWwCaElBHnGYHoWdewF59w58YfEP/xUbgKDYPSUNg==";

};
~
~
~
"/var/named/theokeys.conf" 14L, 438C

On remarquera, que le nom de la clé "macle1" est celui chosi lors de la génération, de la même maniere, l’algorithme de cryptage HDMA-MD5, est l’algorithme choisi, et enfin la valeur de secret est la clé propement dite !

Modification du fichier de configuration

Donc on a créer un fichier de clé, maintenant il va falloir configurer named, pour qu’il le prenne en compte, et il faudra ensuite définir les "droits des clés", c’est-à-dire ce que le proprietaire de la clé à le droit de mettre à jour dans notre configuration

Dans un premier temps on va insérer le fichier de clés à la configuration de named

/etc/named.conf

vi /etc/named.conf

options {
        directory "/var/named";
};
//
// a caching only nameserver config
//
controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
        type hint;
        file "named.ca";
};

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

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.local";
        allow-update { none; };
};

include "/etc/rndc.key";

/*
* Cles pour Dynamique DNS
*/
include "/var/named/theokeys.conf"; // Inclusion du fichier de clés

// Configuration des zones
zone "domaine.net" {
        type master;
        file "/var/named/domaine.net.hosts";
};

Si on redemarre named notre fichier de clés sera donc pris en compte, par contre pour le moment nous n’avons défini aucun droit pour notre clé

Dans mon exemple, je souhaiterais que l’hôte : mimi.domaine.net puisse être mis à jour à l’aide de la clé macle1, on va donc rajouter une ligne à configuration de la zone domaine.net

Modification de la zone domaine.net


zone "domaine.net" {
        type master;
        file "/var/named/domaine.net.hosts";
        update-policy {
                grant macle1. name mimi.domaine.net. A TXT;
        };
};

Dans cet exemple, j’ai donné l’autorisation à la clé macle1 de modifié l’enregistrement DNS de mimi.domaine.net, et ce uniquement pour les type d’enregistrement A et TXT
J’aurais aussi pu autoriser la clé macle1 a modifier la zone dans son intégralité en insérant (à la place de la section update-policy) la valeur suivante :

Exemple 2 : macle1 allow-update


zone "domaine.net" {
        type master;
        file "/var/named/domaine.net.hosts";
        allow-update {
                key macle1;
        };
};

Mais pour des raisons de sécurité et d’intégrité de ma zone, je préfere utilisé l’instruction update-policy.

La syntaxe des lignes de cette instruction est la suivante :

Exemple 2 : syntaxe de update-policy


        update-policy {
                grant <key> <type> <zone> <record-types>;
        };

Explications :

  • <key> : Doit correspondre à une clé du fichier /var/named/theokeys.conf
  • <type> : Correspond au type de l’autorisation, peut prendre name ou subdomain
  • <zone> : Indique la zone ou le sous-domaine à mettre à jour
  • <record-type> : Précise le type d’enregistrement qui peuvent être mis à jour

Maintenant que la mise à jour dynamique est mise en place voyons comment cela fonctionne coté client !

Etape 3 : Mise à jour des enregistrements (nsupdate)
Récupération des clés

Comme nous avons créer des clés pour autoriser les mises à jour, il faut que les clients les récupèrent pour pouvoir mettre à jour leurs enregistrements, je ne détaillerais pas ce point, car c’est assez facile, personnellement j’ai crée un fichier .tar.gz contenant les fichiers .key et .private de ma clé et que j’ai ensuite placé dans un répertoire accessible via FTP, j’ai récupéré ce fichier via FTP, puis je l’ai supprimé pour des raisons de sécurité.

Ce n’est certainement pas la meilleure solution, mais s’en ai une !

Aprés avoir décompressé le fichier dans un dossier de mon choix sur mon poste client, je me suis penché sur l’utilisation de nsupdate

Utilisation de nsupdate

L’utilitaire nsupdate est fourni avec BIND aussi bien pour Linux que pour Windows je vais donc expliquer comment mettre à jour l’enregistrement mimi.domaine.net à l’aide de cet utilitaire, pour avoir plus d’information sur nsupdate consultez l’aide en ligne ou utilisez man nsupdate

La syntaxe de nsupdate est identique sous Windows ou sous Linux, la seule différence réelle va résider dans les chemins d’accés aux fichiers de clé.

L’utilisation de nsupdate fonctionne à peu prés comme un shell (ou une invite de commande, pour les utilisateurs de Windows), voyons un exemple :

Utilisation de nsupdate

nsupdate -k /chemin/de/la/clé/Kmacle1.+157+30505.key
> _

Je préfére utilsé le paramètre -k , mais c’est un choisx personnel, reportez vous à la documentation de nsupdate pour en savoir plus

Une fois sur le prompt de nsupdate, vous pouvez envoyer des requetes au serveur pour qu’il fasse les mises à jour souhaitées :

Requêtes nsupdate 1

nsupdate -k /chemin/de/la/clé/Kmacle1.+157+30505.key
>server NS.domaine.com // Je me place sur mon serveur DNS
>zone domaine.net // Je précise la zone
> update add mimi.domaine.net 86400 IN A www.xxx.yyy.zzz // Details plus bas
> // Appuyer encore sur [ENTREE] pour que nsupdate excute la commande

Explcations :

La ligne update add mimi.domaine.net 86400 IN A www.xxx.yyy.zzz, vous l’aurez compris est la requête à proprement parlé, en gros là je dis à named Ajoute l’hôte mimi.domaine.net pour une durée de 86400 secondes (soit 1 jour), le type d’enregistrement est A, et l’adresse IP est www.xxx.yyy.zzz.

On notera, que pour que le serveur prenne en compte les requêtes, il faut valider une ligne vide !

Vous remarquerez que c’est assez simple d’utilisation, une chose quand même, si vous aviez déjà ajouté l’hôte, il faudra le
supprimer avant de le rajouter afin de le mettre à jour ! exemple :

Requêtes nsupdate 2

nsupdate -k /chemin/de/la/clé/Kmacle1.+157+30505.key
> server NS.domaine.com // Je me place sur mon serveur DNS
> zone domaine.net // Je précise la zone
> update delete mimi.domaine.net A // On supprime l’enregistrement
> update add mimi.domaine.net 86400 IN A www.xxx.yyy.zzz // On ajoute l’enregistrement
> // Appuyer encore sur [ENTREE] pour que nsupdate excute la commande

Voilà maintenant vous pouvez tester la configuration, avec des utilisaires systèmes comme ping, dig ou encore nslookup, à vous de choisir !

Bon, la mise à jour de notre serveur DNS fonctionne, c’est bien, mais ce serait encore mieux si la mise à jour se faisait de façon automatique à chaque fois que l’adresse IP de ma machine change …

Automatisation de la mise à jour
Sous Linux

J’ai crée un petit script bash permettant de mettre à jour le serveur DNS de façon automatique (à savoir sans interaction avec l’utilisateur). Vous pouvez utiliser ce script pour vos besoins … Et si vous prenez l’envie de l’améliorer, j’espere que vous penserez à me le faire savoir …

Voici le script :

Script : nsupdte.sh

#!/bin/bash
#
# Auteur : Rémi Goyard
# version 1.0
# LICENCE : Faites en ce que vous voulez…

### Parametres à modifier
IPADDR=`cat /chemin/de/local-ipaddress`
KEY="/chemin/de/la/clé/Kmacle1.+157+30505.key"
SERVER="ns.domaine.com"
ZONE="domaine.net"
HOTE2="hote2.domaine.net"
MIMI="mimi.domaine.net"

LOGFILE="/var/log/nsupdate.log"

cat <<eof | nsupdate -k $KEY
server $SERVER
zone $ZONE
update delete $HOTE2
update delete $MIMI
update add $HOTE2 84600 IN A $IPADDR
update add $MIMI 84600 IN A $IPADDR
send
EOF
>>$LOGFILE 2>&1

Bientôt la suite …

Sous Windows

Bientôt …

Liens et autres documents utiles

nsupdate(8) – Linux man page
A DDNS Server Using BIND and Nsupdate
Painless DDNS part 2: configuring the server
Secure dynamic DNS howto
RFC 2136 – Dynamic Updates in the Domain Name System (DNS UPDATE)

Problemes et solutions

A venir ….

Vous aimerez aussi...

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *