DNS dynamique / Debian 12

Mémento 7.3 - Maj du DNS via DHCP

Migration du DNS statique installé sur la VM srvlan en DNS dynamique via le service Kea DHCP.

1 - Préambule

Toutes les VM doivent être démarrées sauf srvdmz qui n'est pas concernée par cet article.

1.1 - Rôle du service DNS dynamique via DHCP

Le rôle consiste à modifier en temps réel les fichiers de zones DNS via le service DHCP, ceci en utilisant les démons named de Bind et kea-dhcp-ddns de Kea.

2 - Configuration du DNS dynamique

2.1 - Configuration actuelle

Vous avez, lors de la configuration DHCP (mémento 7.2), supprimé volontairement les enregistrements des VM debian12-vm1/2 et conteneurs Podman ctn1/2 dans les fichiers de zone DNS directe et inverse.

La résolution DNS interne est donc cassée :

[srvlan@srvlan:~$] ping debian12-vm1

Retour :

ping: debian12-vm1: Échec temporaire dans la résolution ...

Idem avec l'hôte ctn2 :

[srvlan@srvlan:~$] ping ctn2.intra.loupipfire.fr 

Retour :

ping: ctn2.intra.loupipfire.fr: Nom ou service inconnu

Seule la résolution DNS externe fonctionne :

[srvlan@srvlan:~$] ping lemonde.fr

Retour :

PING lemonde.fr (151.101.2.137) 56(84) bytes of d...
64 bytes from 151.101.2.137 (151.101.2.137): icmp...
64 bytes from 151.101.2.137 (151.101.2.137): icmp...
--- lemonde.fr ping statistics ---
2 packets transmitted, 2 received, 0% packet loss...
rtt min/avg/max/mdev = 15.730/16.145/16.560/0.415 ms

2.2 - Création d'une clé secrète TSIG

TSIG (Transaction Signature) est un mécanisme permettant de sécuriser la communication avec un serveur DNS, ceci à base d'une clé secrète partagée.

Il peut être utilisé pour authentifier les échanges effectués lors d'une MAJ dynamique des fichiers de zones DNS via DHCP.

TSIG requiert une bonne synchronisation du temps pour fonctionner correctement.

C'est actuellement VirtualBox qui gère par défaut cette synchronisation du temps pour l'ensemble du réseau virtuel.

Créez la clé secrète partagée comme suit :

[srvlan@srvlan:~$] cd /etc/bind
[srvlan@srvlan:~$] su root

[root@srvlan:~#] sudo tsig-keygen -a HMAC-SHA256 tsig-kea-bind > tsig-kea-bind.key

[root@srvlan:~#] chown root:bind tsig-kea-bind.key
[root@srvlan:~#] chmod 640 tsig-kea-bind.key
[root@srvlan:~#] exit

La Cde tsig-keygen est fournie avec le paquet bind9.

Vérifiez ensuite le contenu du fichier tsig-kea-bind.key :

[srvlan@srvlan:~$] sudo cat tsig-kea-bind.key

Retour :

key "tsig-kea-bind" {
     algorithm hmac-sha256;
     secret "z1iGvZ6fqgHtwlQVsltfMqvtBB24rxk2VpZ...";
};

L'élément secret contient la valeur de la clé TSIG.

2.3 - Configuration côté serveur DNS

Pour éviter de rencontrer par la suite des problèmes de permission d'écriture, déplacez les fichiers actuels de zone DNS vers le dossier /var/lib/bind/ comme suit :

[srvlan@srvlan:~$] cd /var/lib/bind
[srvlan@srvlan:~$] sudo mv /etc/bind/*.directe /var/lib/bind/
[srvlan@srvlan:~$] sudo mv /etc/bind/*.inverse /var/lib/bind/

Sous Debian, ce dossier est destiné aux fichiers de zone et journaux mis à jour dynamiquement.

Cette configuration tient compte du profil de sécurité apparmor associé à l'application bind et paramétré dans le fichier /etc/apparmor.d/usr.sbin.named.

Editez ensuite le fichier named.conf.local :

[srvlan@srvlan:~$] sudo nano /etc/bind/named.conf.local

Modifiez la ligne "# MAJ dynamique ..." et ajoutez ce qui suit juste avant les lignes de configuration de la zone de recherche directe :

# MAJ dynamique des fichiers de zones -> update-policy

# Déclaration de la clé TSIG qui sera utilisée pour
# la mise à jour dynamique du DNS
include "/etc/bind/tsig-kea-bind.key"; 

puis modifiez la zone de recherche directe comme suit :

file "/var/lib/bind/db.intra.loupipfire.fr.directe";
update-policy {
    grant tsig-kea-bind wildcard *.intra.loupipfire.fr A DHCID;
        };

et la zone de recherche inverse comme ci-dessous :

file "/var/lib/bind/db.intra.loupipfire.fr.inverse";
update-policy {
    grant tsig-kea-bind wildcard *.3.168.192.in-addr.arpa PTR DHCID;
        };

Pour finir, vérifiez la syntaxe du fichier modifié :

[srvlan@srvlan:~$] sudo named-checkconf

Si OK, pas de retour.

Le paramètre update-policy permettra d'accepter les demandes de MAJ DNS si authentifiées avec la clé TSIG tsig-kea-bind.key.

2.4 - Configuration côté serveur DHCP

Le service DHCP doit utiliser la même valeur de clé TSIG que le service DNS.

Pour commencer, installez le paquet suivant :

[srvlan@srvlan:~$] sudo apt install kea-dhcp-ddns-server

Celui-ci inclut le démon /usr/sbin/kea-dhcp-ddns qui effectuera la MAJ dynamique du serveur DNS, ceci chaque fois que Kea DHCP assignera une adresse IP à une VM ou à un conteneur.

Vérifiez ensuite le statut du service installé :

[srvlan@srvlan:~$] sudo systemctl status kea-dhcp-ddns-server

Retour normal :

kea-dhcp-ddns-server.service - Kea DDNS Service
     Loaded: loaded (...kea-dhcp-ddns-server... enabled...)
     Active: active (running) since Tue 2024-03-26 ... ago
       Docs: man:kea-dhcp-ddns(8)
   Main PID: 36442 (kea-dhcp-ddns)
      Tasks: 5 (limit: 1077)
     Memory: 3.4M
        CPU: 26ms
     CGroup: /system.slice/kea-dhcp-ddns-server.service
             └─36442 /usr/sbin/kea-dhcp-ddns -c ...conf
... systemd[1]: Started kea-dhcp-ddns-server...
... kea-dhcp-ddns... [kea-dhcp-ddns.dctl...] ... DhcpDdns starting...
... kea-dhcp-ddns... INFO  COMMAND... Starting to accept ... to /run/kea/kea-ddns-ctrl-socket
... kea-dhcp-ddns... INFO  DCTL... completed ... on 127.0.0.1, port 53001, using UDP
... kea-dhcp-ddns... INFO  DHCP... Kea DHCP-DDNS server version 2.2.0 started

Puis créez un fichier qui contiendra la clé TSIG déclarée ci-dessus sur le serveur DNS :

[srvlan@srvlan:~$] cd /etc/kea
[srvlan@srvlan:~$] sudo nano tsig-keys.json

et entrez le contenu suivant au format JSON :

"tsig-keys": [
    {
       "name": "tsig-kea-bind",
       "algorithm": "hmac-sha256",
       "secret": "z1iGvZ6fqgHtwlQVsltfMqvtBB24rxk2VpZ..."
    }
],

Gérez les permissions du fichier tsig-keys.json :

[srvlan@srvlan:~$] sudo chown _kea:root tsig-keys.json
[srvlan@srvlan:~$] sudo chmod 640 tsig-keys.json 

Puis créez le fichier qui contiendra la configuration pour la MAJ dynamique du service DNS :

[srvlan@srvlan:~$] sudo mv kea-dhcp-ddns.conf kea-dhcp-ddns.conf_save

[srvlan@srvlan:~$] sudo nano kea-dhcp-ddns.conf

et entrez le contenu suivant :

{
    "DhcpDdns":
    {
      "ip-address": "127.0.0.1",
      "port": 53001,
      "control-socket": {
          "socket-type": "unix",
          "socket-name": "/run/kea/kea-ddns-ctrl-socket"
      },
      
      <?include "/etc/kea/tsig-keys.json"?>
    
      "forward-ddns" : {
          "ddns-domains" : [
              {
                   "name": "intra.loupipfire.fr.",
                   "key-name": "tsig-kea-bind",
                   "dns-servers": [
                       { "ip-address": "192.168.3.1" }
                   ]
              }
          ]
      },
      
      "reverse-ddns" : {
          "ddns-domains" : [
              {
                   "name": "3.168.192.in-addr.arpa.",
                   "key-name": "tsig-kea-bind",
                   "dns-servers": [
                       { "ip-address": "192.168.3.1" }
                   ]
              }
          ]
      },
    
      "loggers": [
        {
            "name": "kea-dhcp-ddns",
            "output_options": [
          {
           "output": "/var/log/kea/kea-ddns.log",
           "pattern": "%D{%Y-%m-%d %H:%M:%S.%q} %-5p %m\n"
          }
            ],
            "severity": "INFO",
            "debuglevel": 0
        }
      ]
    }
}

Gérez les permissions du fichier kea-dhcp-ddns.conf :

[srvlan@srvlan:~$] sudo chown _kea:root kea-dhcp-ddns.conf

et vérifiez la bonne syntaxe de celui-ci :

[srvlan@srvlan:~$] sudo kea-dhcp-ddns -t kea-dhcp-ddns.conf

Retour normal :

2024-03-26 16:12:45.442 INFO  [kea-dhcp-ddns.dctl/...]
DCTL_CONFIG_CHECK_COMPLETE server has completed configuration check:
listening on 127.0.0.1, port 53001, using UDP,
result: success(0), text=Configuration check successful

Editez enfin le fichier de configuration principal du serveur Kea DHCP :

[srvlan@srvlan:~$] sudo nano kea-dhcp4.conf

Supprimez les 2 lignes suivantes :

// Pas de MAJ dynamique du serveur DNS Bind9.
"ddns-send-updates" : false,

et ajoutez celles-ci sous la section loggers :

"loggers": [
        ... 
    ],
// Configuration du DNS dynamique
"dhcp-ddns": {
        "enable-updates": true
     },
     
     "ddns-qualifying-suffix": "intra.loupipfire.fr",
     "ddns-override-client-update": true,
     "ddns-update-on-renew": true
// Ci-dessous, accolades existantes
}
}

Ne pas oublier d'ajouter une virgule derrière le crochet de fin de section loggers.

Vérifiez enfin la bonne syntaxe du fichier :

[srvlan@srvlan:~$] sudo kea-dhcp4 -t kea-dhcp4.conf

et relancez dans l'ordre les services DNS et DHCP :

[srvlan@srvlan:~$] sudo systemctl restart bind9
[srvlan@srvlan:~$] sudo systemctl status bind9

[srvlan@srvlan:~$] sudo systemctl restart kea-dhcp4-server
[srvlan@srvlan:~$] sudo systemctl status kea-dhcp4-server

[srvlan@srvlan:~$] sudo systemctl restart kea-dhcp-ddns-server
[srvlan@srvlan:~$] sudo systemctl status kea-dhcp-ddns-server

3 - Contrôle de bon fonctionnement

3.1 - Clients debian12-vm1 et 2

Au préalable, ouvrez 2 terminaux sur le bureau de srvlan.

Connectez-vous ensuite sur ceux-ci en tant qu'utilisateur root (Cde su root).

Entrez sur le terminal 1 cette demande de traçage :

[root@srvlan:~#] tail -f /var/log/kea/kea-dhcp4.packets.log

et sur le terminal 2 celle ci-dessous :

[root@srvlan:~#] journalctl -u named -f

Redémarrez maintenant la VM debian12-vm1.

Vérifiez ensuite sur le terminal 1 pour le DHCP Kea :
- La demande de configuration réseau (DHCPREQUEST).
- L'envoi de la configuration (DHCPACK).

# Début de séquence DHCP

08:58:39... DHCP4_BUFFER_RECEIVED ... from 0.0.0.0:68 to ... over interface enp0s8

08:58:39... DHCP4_SUBNET_SELECTED [hwtype=1 ...], cid=[01:08:00:27:c6:12:a3], ... ID 1 ...

08:58:39... DHCP4_SUBNET_DATA [hwtype=1 ...], cid=[...12:a3], ... 192.168.3.0/24

08:58:39... DHCP4_PACKET_RECEIVED [hwtype=1 ...], cid=[...12:a3], ... DHCPREQUEST ... enp0s8

08:58:39... DHCP4_QUERY_DATA [hwtype=1 ...], cid=[...12:a3], ... msg_type=DHCPREQUEST ...

options:
  type=012, len=012: "debian12-vm1" (string)
  type=050, len=004: 192.168.3.31 (ipv4-address)
  type=053, len=001: 3 (uint8)
  type=055, len=017: 1(uint8) 2(uint8) ...
  type=057, len=002: 576 (uint16)
  type=061, len=007: 01:08:00:27:c6:12:a3
08:58:39... DHCP4_SUBNET_SELECTED [hwtype=1 ...], cid=[01:08:00:27:c6:12:a3], ... ID 1 ...

08:58:39... DHCP4_SUBNET_DATA [hwtype=1 ...], cid=[...12:a3], ... 192.168.3.0/24

08:58:39... DHCP4_PACKET_SEND ... DHCPACK ... from 192.168.3.1:67 to ...3.31:68 ... enp0s8

08:58:39... DHCP4_RESPONSE_DATA ... DHCPACK ... local...192.168.3.1... remote...3.31...

options:
  type=001, len=004: 4294967040 (uint32)
  type=003, len=004: 192.168.3.1
  type=006, len=004: 192.168.3.1
  type=012, len=032: "debian12-vm1.intra.loupipfire.fr" (string)
  type=051, len=004: 28800 (uint32) #Durée du bail soit 8h
  type=053, len=001: 5 (uint8)
  type=054, len=004: 192.168.3.1
  type=058, len=004: 14400 (uint32)
  type=059, len=004: 27720 (uint32)
  type=061, len=007: 01:08:00:27:c6:12:a3
  type=119, len=021: "intra.loupipfire.fr." (fqdn)

# Fin de séquence DHCP

Puis sur le terminal 2 pour le DNS Bind :
- L'utilisation de la clé tsig-kea-bind.
- L'existence de 3 adding an RR de type A, DHCID et PTR.

# Début de séquence DNS

08:58:39... srvlan named: client @0x7...cb68 192.168.3.1#3.../key tsig-kea-bind: updating zone 'intra.loupipfire.fr/IN': adding an RR at 'debian12-vm1.intra.loupipfire.fr' A 192.168.3.31

08:58:39... srvlan named: client @0x7...cb68 192.168.3.1#3.../key tsig-kea-bind: updating zone 'intra.loupipfire.fr/IN': adding an RR at 'debian12-vm1.intra.loupipfire.fr' DHCID AAEBCN...

08:58:39... srvlan named: client @0x7...ef68 192.168.3.1#4.../key tsig-kea-bind: updating zone '3.168.192.in-addr.arpa/IN': deleting rrset at '31.3.168.192.in-addr.arpa' PTR

08:58:39... srvlan named: client @0x7...ef68 192.168.3.1#4.../key tsig-kea-bind: updating zone '3.168.192.in-addr.arpa/IN': deleting rrset at '31.3.168.192.in-addr.arpa' DHCID

08:58:39... srvlan named: client @0x7...ef68 192.168.3.1#4.../key tsig-kea-bind: updating zone '3.168.192.in-addr.arpa/IN': adding an RR at '31.3.168.192.in-addr.arpa' PTR debian12-vm1.intra.loupipfire.fr.

08:58:39... srvlan named: client @0x7...ef68 192.168.3.1#4.../key tsig-kea-bind: updating zone '3.168.192.in-addr.arpa/IN': adding an RR at '31.3.168.192.in-addr.arpa' DHCID AAEBCN...

# Fin de séquence DNS

Accédez ensuite au dossier /var/lib/bind/, attendez quelques minutes et vérifiez dans le fichier DNS db.intra.loupipfire.fr.directe l'ajout automatique :
- d'enregistrements A et DHCID pour debian12-vm1.

$ORIGIN .
$TTL 86400	; 1 day
intra.loupipfire.fr  IN SOA  srvlan.intra.loup... (
	71         ; serial
	604800     ; refresh (1 week)
	84600      ; retry (23 hours 30 minutes)
	2419200    ; expire (4 weeks)
	604800     ; minimum (1 week)
	)
		     NS	srvlan.intra.loupipfire.fr.
$ORIGIN intra.loupipfire.fr.
$TTL 9600	; 2 hours 40 minutes
ctn1			A	192.168.3.20
			DHCID	( AAABAtCkfY...
				LAI= ) ; 0 1 32
ctn2			A	192.168.3.30
			DHCID	( AAAB5AqOAZ...
				TMM= ) ; 0 1 32
debian12-vm1		A	192.168.3.31
			DHCID	( AAEBCNtBcY...
				YmM= ) ; 1 1 32
debian12-vm2		A	192.168.3.32
			DHCID	( AAEBCNtKaY...
				yDU= ) ; 1 1 32
$TTL 86400	; 1 day
ovs			A	192.168.3.15
srvlan			A	192.168.3.1

Vérifiez dans le fichier DNS db.intra.loupipfire.fr.inverse l'ajout pour debian12-vm1 :
- d'un enregistrement PTR.

$ORIGIN .
$TTL 86400	; 1 day
3.168.192.in-addr.arpa IN SOA srvlan.intra.loup... (
		66         ; serial
		604800     ; refresh (1 week)
		86400      ; retry (1 day)
		2419200    ; expire (4 weeks)
		604800     ; minimum (1 week)
		)
			NS	srvlan.intra.loupipfire.fr.
$ORIGIN 3.168.192.in-addr.arpa.
1		PTR	srvlan.intra.loupipfire.fr.
15		PTR	ovs.intra.loupipfire.fr.
$TTL 9600	; 2 hours 40 minutes
20		PTR	ctn1.intra.loupipfire.fr.
		DHCID	( AAABAtCkfY...
			LAI= ) ; 0 1 32
30		PTR	ctn2.intra.loupipfire.fr.
		DHCID	( AAAB5AqOAZ...
			TMM= ) ; 0 1 32
31		PTR	debian12-vm1.intra.loupipfire.fr.
		DHCID	( AAEBCNtBcY...
			YmM= ) ; 1 1 32
32		PTR	debian12-vm2.intra.loupipfire.fr.
		DHCID	( AAEBCNtKaY...
			yDU= ) ; 1 1 32

Le bail attribué a été mis en cache dans le fichier /var/lib/kea/kea-leases4.csv.2 de la VM srvlan.

Effectuez à présent des pings entre srvlan et debian12-vm1 pour vérifier que la résolution DNS interne fonctionne de nouveau correctement.

La résolution sur debian12-vm2 doit également fonctionner après un redémarrage de la VM.

3.2 - Clients ctn1 et 2

Editez le fichier de configuration du serveur DHCP :

[srvlan@srvlan:~$] sudo nano /etc/kea/kea-dhcp4.conf

et modifiez cette section afin que soit proposé le nom d'hôte ctn2 lors de la réception d'un DHCPREQUEST provenant de l'adresse MAC a2:20:b3:eb:30:67 :

// IP et noms d'hôtes réservés.
	"reservations": [
                {
                    "hw-address": "e2:f0:31:2a:b6:05",
                    "ip-address": "192.168.3.20",
                    "hostname": "ctn1"               
                },
                {
                    "hw-address": "a2:20:b3:eb:30:67",
                    "hostname": "ctn2"
                }
            ]

Redémarrez ensuite le serveur DHCP :

[srvlan@srvlan:~$] sudo systemctl restart kea-dhcp4-server

et modifiez le script networknamespace.sh situé sur la VM ovs comme suit :

[switch@ovs:~$] sudo nano /root/networknamespace.sh
## Activation des extrémités vctn1/2 et lo côté nsct...
...
...
...
ip netns exec nsctn2 ip link set vctn2 address a2:20:b3:eb:30:67 up

## Ajout adresses IP extrémités vctn1/2 côté nsctn1/nsctn2
...
#ip netns exec nsctn2 ip addr add 192.168.3.8/24 dev vctn2

## Déclaration des interfaces vctn1/2 comme clients DHCP.
...
ip netns exec nsctn2 dhclient -4 vctn2  # Ligne ajoutée

Redémarrez la VM ovs et contrôlez la bonne résolution DNS interne pour le nom d'hôte ctn2 :

[switch@ovs:~$] nslookup ctn2

Retour normal :

Capture - Conteneur ctn2 : Résolution DNS = OK
Conteneur ctn2 : Résolution DNS = OK

Pour le renouvellement du bail, il faut constater que la demande de celui-ci depuis les espaces de noms réseau nsctn1 et nsctn2 ne se fait pas automatiquement.

Vous ferez la demande à l'aide d'une tâche Cron qui exécutera un script dédié à cette fonction.

Commencez par créer le script :

[switch@ovs:~$] sudo nano /root/networknamespace-ddns.sh

et entrez le contenu suivant :

#!/bin/bash
# Reset configurations IP/DNS de nsctn1/2
ip netns exec nsctn1 /usr/sbin/dhclient -4 -r vctn1
ip netns exec nsctn2 /usr/sbin/dhclient -4 -r vctn2

# Renouvellement configuration IP/DNS de nsctn1/2
ip netns exec nsctn1 /usr/sbin/dhclient -4 vctn1
ip netns exec nsctn2 /usr/sbin/dhclient -4 vctn2

exit 0

Rendez le script exécutable :

[switch@ovs:~$] sudo chmod +x /root/networknamespace-ddns.sh

Créez maintenant une tâche Cron pour l'utilisateur root :

[switch@ovs:~$] su root

[root@ovs:~#] crontab -e

en entrant ce contenu à la fin du fichier ouvert :

# Exécuter le script networknamespace-ddns.sh toutes les 7H
0 */7 * * * /bin/bash /root/networknamespace-ddns.sh

La demande de renouvellement du bail sera ainsi exécutée automatiquement toutes les 7H, ceci avant l'échéance initiale de 8H.

4 - Aide au dépannage

La méthode ci-dessous réglera un éventuel problème de MAJ automatique d'un enregistrement DNS constaté dans les logs du fichier /var/log/kea/kea-ddns.log.

Désactivez temporairement la MAJ du DNS :

[srvlan@srvlan:~$] sudo rndc freeze

Ouvrez, sur srvlan, les fichiers DNS de zone directe et inverse et supprimez l'enregistrement DNS critique.

Réactivez ensuite la MAJ du DNS :

[srvlan@srvlan:~$] sudo rndc thaw

Puis redémarrez le client DHCP à l'origine de l'enregistrement, tout devrait rentrer dans l'ordre.

5 - Bilan

Les échanges entre les serveurs DNS Bind9 et DHCP Kea, tous deux situés sur le même hôte, sont gérés automatiquement et sécurisés par clé TSIG.

La configuration TSIG peut évidemment être appliquée sur des serveurs distants l'un de l'autre.

Image - Rédacteur satisfait


Voilà une bonne chose de faite.
Le mémento 8.1 vous attend pour la
mise en place d'un serveur Web PHP
MySQL sur la VM srvdmz.

Laisser un commentaire