Utiliser Debian et dérivées

Debian : Configurer le DDNS avec bind et kea

Table des matières

Introduction



Dans cet article, on va voir comment configurer les services DNS bind et DHCP kea pour la mise à jour dynamique.
L'idée est de renseigner le DNS automatiquement, avec les noms des machines ayant reçue leur configuration via le serveur DHCP.

Dans les prérequis nécessaires, il faut :
- Un serveur DHCP installé avec kea : Installer et configurer le serveur DHCP avec kea
- Un serveur DNS installé avec bind : Installer et configurer un serveur DNS avec bind


Génération de la clé pour le DNS



Kea et Bind prennent tous deux en charge le protocole TSIG (Transaction Signature). Nous allons donc l'utiliser pour créer la clé.

Sur le serveur DNS, on va générer une clé :
Code BASH :
cd /etc/bind
tsig-keygen dhcp1-to-ns1 > dhcp1-to-ns1.key


On corrige les permissions de cette clé :
Code BASH :
chown root:bind dhcp1-to-ns1.key
chmod 640 dhcp1-to-ns1.key


Voici ce que contient ce fichier dans mon exemple :
Code :
key "dhcp1-to-ns1" {
    algorithm hmac-sha256;
    secret "m7DXpFi3M0f9BHKxYoHYtV7f42sPsXclhtoS0ziY7Gg=";
};



Déplacer les zones DNS



On va déplacer les fichiers de zone du DNS de /etc/bind à /var/lib/bind. En effet, apparmor sur Debian va refuser une écriture sur des fichiers dans /etc/bind alors que c'est autorisé dans /var/lib/bind.

On va déplacer les fichiers :
Code BASH :
mv /etc/bind/db.* /var/lib/bind/


On modifie le fichier named.conf.local en indiquant les nouveaux chemins (je fais ça avec un petit sed qui va bien :
Code BASH :
sed -e 's@/etc/bind/db@/var/lib/bind/db@g' -i /etc/bind/named.conf.local


Configuration de la clé dans bind



On édite le fichier named.conf.local :
Code BASH :
vim /etc/bind/named.conf.local


On va ajoute une inclusion au fichier de cle en haut du fichier, une section update-policy et commenter le allow-update qui n'a plus de sens.
Je remets mon fichier complet avec les commentaires :
Code :
//
// Do any local configuration here
//
include "/etc/bind/dhcp1-to-ns1.key";
zone "linuxtrickstest.lan" {
    type master;
    file "/var/lib/bind/db.linuxtrickstest.lan";
    // refuser les mises à jour des enregistrements DNS par un tiers non autorisé.
    // allow-update { none; };
    // DDNS
        update-policy {
        grant dhcp1-to-ns1 wildcard *.linuxtrickstest.lan A DHCID;
        };
};
zone "221.168.192.in-addr.arpa" {
    type master;
    file "/var/lib/bind/db.reverse.linuxtrickstest.lan";
    // refuser les mises à jour des enregistrements DNS par un tiers non autorisé.
    // allow-update { none; };
    //DDNS
        update-policy {
        grant dhcp1-to-ns1 wildcard *.221.168.192.in-addr.arpa PTR DHCID;
        };
};


Comme d'habitude, on peut vérifier la syntaxe de notre configuration DNS :
Code BASH :
named-checkconf


On redémarre le service après modification :
Code BASH :
systemctl reload named.service


Intégration de la clé dans kea



Sur le serveur DHCP, on installe le paquet kea-dhcp-ddns-server qui gère la gestion dynamique :
Code BASH :
apt install kea-dhcp-ddns-server


On créé le fichier de configuration avec la clé créée précédemment :
Code BASH :
vim /etc/kea/tsig-keys.json


On y place ce contenu :
Code :
"tsig-keys": [
    {
       "name": "dhcp1-to-ns1",
       "algorithm": "hmac-sha256",
       "secret": "m7DXpFi3M0f9BHKxYoHYtV7f42sPsXclhtoS0ziY7Gg="
    }
],


On fixe les permissions de ce fichier :
Code BASH :
chown _kea:root /etc/kea/tsig-keys.json
chmod 640 /etc/kea/tsig-keys.json


On va modifier la config du serveur DHCP sur la gestion du DDNS.
On va garder la version originale du fichier de configuration :
Code BASH :
mv /etc/kea/kea-dhcp-ddns.conf /etc/kea/kea-dhcp-ddns.conf.ori


On créé le nouveau fichier de config :
Code BASH :
vim /etc/kea/kea-dhcp-ddns.conf


Voici son contenu :
Code TEXT :
{
"DhcpDdns":
{
  "ip-address": "127.0.0.1",
  "port": 53001,
  "control-socket": {
      "socket-type": "unix",
      "socket-name": "/run/kea/kea-ddns-ctrl-socket"
  },
 
  // Fichier de clé
  <?include "/etc/kea/tsig-keys.json"?>
 
  // IP et infos du DNS et de la zone directe à mettre à jour
  "forward-ddns" : {
      "ddns-domains" : [
          {
               "name": "linuxtrickstest.lan.",
               "key-name": "dhcp1-to-ns1",
               "dns-servers": [
                   { "ip-address": "192.168.221.2" }
               ]
          }
      ]
  },
 
  // IP et infos du DNS et de la zone inverse à mettre à jour
  "reverse-ddns" : {
      "ddns-domains" : [
          {
               "name": "221.168.192.in-addr.arpa.",
               "key-name": "dhcp1-to-ns1",
               "dns-servers": [
                   { "ip-address": "192.168.221.2" }
               ]
          }
      ]
  },
 
  // On peut configurer des logs
  "loggers": [
    {
        "name": "kea-dhcp-ddns",
        "output_options": [
            {
                "output": "stdout",
                "pattern": "%-5p %m\n"
            }
        ],
        "severity": "INFO",
        "debuglevel": 0
    }
  ]
}
}


On fixe les permissions :
Code BASH :
chown _kea:root /etc/kea/kea-dhcp-ddns.conf
chmod 640 /etc/kea/kea-dhcp-ddns.conf


Comme d'hab, on peut vérifier la configuration :
Code BASH :
sudo -u _kea kea-dhcp-ddns -t  /etc/kea/kea-dhcp-ddns.conf


Configuration du DHCP pour envoyer les mises à jour



On modifie la configuration de notre serveur DHCP :
Code BASH :
vim  /etc/kea/kea-dhcp4.conf


Dans le pavé "Dhcp4" tout au début, on indique qu'on veut activer le DDNS :
Code TEXT :
  // DDNS
     "dhcp-ddns": {
        "enable-updates": true
     },
     "ddns-qualifying-suffix": "linuxtrickstest.lan",
     "ddns-override-client-update": true,


Comme d'hab, on peut vérifier la configuration :
Code BASH :
sudo -u _kea kea-dhcp4 -t  /etc/kea/kea-dhcp4.conf


On redémarre le service (qui sous debian est déjà activé par défaut) :
Code BASH :
systemctl restart kea-dhcp-ddns-server.service


Tester le fonctionnement



J'ai allumé une machine, nommée client1.

On teste avec nslookup après qu'elle ait reçue sa configuration réseau :
Code BASH :
nslookup client1.linuxtrickstest.lan


Ca donne :
Code TEXT :
Server:        127.0.0.1
Address:    127.0.0.1#53
Name:    client1.linuxtrickstest.lan
Address: 192.168.221.150


Evidemment, on peut tester l'enregistrement inverse :
Code BASH :
nslookup 192.168.221.150


Ce qui donne :
Code TEXT :
150.221.168.192.in-addr.arpa    name = client1.linuxtrickstest.lan.


On peut voir dans les logs la mise à jour dans le DNS du nom de la machine venant de récupérer une IP via notre DHCP kea :
Code BASH :
cat /var/log/named/named.log 


Code TEXT :
16-Jul-2025 22:25:48.054 update: info: client @0x7f130f77bc00 192.168.221.2#60421/key dhcp1-to-ns1: updating zone 'linuxtrickstest.lan/IN': adding an RR at 'client1.linuxtrickstest.lan' A 192.168.221.150
16-Jul-2025 22:25:48.054 update: info: client @0x7f130f77bc00 192.168.221.2#60421/key dhcp1-to-ns1: updating zone 'linuxtrickstest.lan/IN': adding an RR at 'client1.linuxtrickstest.lan' DHCID AAEBmona1FV/derAi4/OQ9guIkW2/vXaykFvsgpBMArNmY4=
16-Jul-2025 22:25:48.062 notify: info: zone linuxtrickstest.lan/IN: sending notifies (serial 2)
16-Jul-2025 22:25:48.062 notify: info: zone linuxtrickstest.lan/IN: sending notify to 192.168.221.3#53
16-Jul-2025 22:25:48.062 update: info: client @0x7f131042a800 192.168.221.2#58639/key dhcp1-to-ns1: updating zone '221.168.192.in-addr.arpa/IN': deleting rrset at '150.221.168.192.in-addr.arpa' PTR
16-Jul-2025 22:25:48.062 update: info: client @0x7f131042a800 192.168.221.2#58639/key dhcp1-to-ns1: updating zone '221.168.192.in-addr.arpa/IN': deleting rrset at '150.221.168.192.in-addr.arpa' DHCID
16-Jul-2025 22:25:48.062 update: info: client @0x7f131042a800 192.168.221.2#58639/key dhcp1-to-ns1: updating zone '221.168.192.in-addr.arpa/IN': adding an RR at '150.221.168.192.in-addr.arpa' PTR client1.linuxtrickstest.lan.
16-Jul-2025 22:25:48.062 update: info: client @0x7f131042a800 192.168.221.2#58639/key dhcp1-to-ns1: updating zone '221.168.192.in-addr.arpa/IN': adding an RR at '150.221.168.192.in-addr.arpa' DHCID AAEBmona1FV/derAi4/OQ9guIkW2/vXaykFvsgpBMArNmY4=
16-Jul-2025 22:25:48.066 xfer-out: info: client @0x7f131314c400 192.168.221.3#36677 (linuxtrickstest.lan): transfer of 'linuxtrickstest.lan/IN': IXFR started (serial 1 -> 2)
16-Jul-2025 22:25:48.066 xfer-out: info: client @0x7f131314c400 192.168.221.3#36677 (linuxtrickstest.lan): transfer of 'linuxtrickstest.lan/IN': IXFR ended: 1 messages, 6 records, 278 bytes, 0.001 secs (278000 bytes/sec) (serial 2)
16-Jul-2025 22:25:48.066 notify: info: zone 221.168.192.in-addr.arpa/IN: sending notifies (serial 2)
16-Jul-2025 22:25:48.066 notify: info: zone 221.168.192.in-addr.arpa/IN: sending notify to 192.168.221.3#53


Mise à jour du DNS avec un DDNS



Quand le DNS est configuré avec le DDNS, si on veut faire une mise à jour manuelle de la zone, on va devoir stopper la mise à jour dynamique.
On le fait via :
Code BASH :
rndc freeze


On met à jour notre zone, sans oublier d'incrémenter le "Serial".

Une fois la zone mise à jour, on réactive les mises à jour dynamques :
Code BASH :
rndc thaw


Note : Il n'est pas nécessaire de recharger le service DNS dans ce cas.
Cette page a été vue 271 fois