Featured image of post Créer des enregistrements dynamiques avec Bind

Créer des enregistrements dynamiques avec Bind

Explorer la mise en place d'enregistrements dynamiques avec Bind pour optimiser sa gestion DNS et la rendre plus flexible et réactive.

Si, comme moi, vous êtes responsable de la gestion de serveurs DNS sous Bind, que ce soit pour des zones internes ou externes, vous avez certainement déjà rencontré le besoin de mettre à jour des enregistrements de manière dynamique (DDNS).

Présentation

Dans cet article, nous allons voir comment concrétiser cette fonctionalité en mettant en place une configuration optimisée basée sur la création d’une clé secrète qui sera utilisée par un client de confiance afin de mettre à jour dynamiquement la ou les zone(s) que vous souhaitez.  En bonus, je vous mettrais à disposition un script permettant d’effectuer ces mises à jour de manière avancée.

Mise en place

Préparation et pré-requis

Nous partons du principe que vous avez déjà un serveur DNS sous Bind fonctionnel. Pour commencer, nous allons installer les utilitaires qui fournissent un ensemble d’outils pour effectuer des opérations liées aux protocoles DNS dont nous aurons besoin par la suite.

1
2
# Pour Debian/Ubuntu
sudo apt install dnsutils

Passons désormais aux choses sérieuses

Création de clés TSIG

Les clés TSIGTSIG sont des mécanismes de sécurité cruciaux dans les mises à jour dynamiques DNS. Elles agissent comme des “clés secrètes” entre le serveur DNS et les clients autorisés, garantissant que seules les mises à jour légitimes sont acceptées. Ces clés renforcent la sécurité du processus en empêchant les accès non autorisés et en assurant l’intégrité des données lors des mises à jour automatiques des enregistrements DNS. Nous allons dans un premier temps créer le répertoire qui accueillera ces clés et nous allons les générer en fonctiion de notre usage.

1
2
3
4
5
sudo mkdir /etc/bind/secrets
sudo chown -R root:bind /etc/bind/secrets
sudo chmod -R u=rw,g=rX,o= /etc/bind/secrets
sudo tsig-keygen -a HMAC-SHA256 ddns-rndc-key >> /etc/bind/secrets/ddns-rndc.key
sudo chown root:bind /etc/bind/secrets/*.key

Configuration de la zone

Une fois que nous avons créé les clés, nous allons les intégrer dans la configuration Bind. Cette étape permet au serveur DNS de reconnaître et de valider les mises à jour provenant des clients autorisés. Pour ce faire, il est essentiel d’autoriser les mises à jour pour la zone souhaitée en utilisant la clé spécifique que nous avons générée.

1
echo 'include "/etc/bind/secrets/ddns-rndc.key";' | sudo tee -a /etc/bind/named.conf

Nous pouvons alors modifier la zone en conséquence

1
2
3
4
5
zone "domain.tld" {
    type master;
    file "/etc/bind/zones/domain.tld";
    allow-update { key ddns-rndc-key; };
};

Redémarrez Bind pour activer les modifications :

1
sudo systemctl restart bind9

Test

Grâce à la commande nsupdate, nous allons pouvoir effectuer notre test de mise à jour de notre zone.

1
2
3
4
5
nsupdate -k /etc/bind/secrets/ddns-rndc.key
> server 127.0.0.1
> update delete test.domain.tld A
> update add test.domain.tld 200 A 1.2.3.4
> send

Vous pouvez alors vérifier la bonne prise en compte du test via dig.

1
dig +short test.domain.tld @127.0.0.1

Bonus

Vous trouverez ci-après un script Bash conçu pour simplifier les mises à jour dynamiques des enregistrements DNS, mais avant quelques explications.

Ce script permet, grâce au passage de paramètres, de personnaliser les mises à jour en spécifiant des détails tels que le serveur de noms, le chemin du fichier de clé, le TTL et les enregistrements à mettre à jour.

Le script permet également de retourner automatiquement l’adresse IP externe afin de l’associer à un enregistrement voulu.

Voici comment vous pouvez personnaliser vos mises à jour en fonction de vos besoins :

Mise à Jour Basique :

1
./update_dns.sh -ns ns.example.com -kf path/to/keyfile -records "host1.example.com=192.168.1.1" "host2.example.com=EXTERNALIP"

Cette commande met à jour les enregistrements pour host1.example.com et host2.example.com avec les adresses IP spécifiées. L’adresse IP de host2.example.com est récupérée automatiquement via le service ifconfig.me.

Personnalisation Avancée :

1
./update_dns.sh -ns ns.example.com -kf path/to/keyfile -ttl 300 -records "server.example.com=10.0.0.2"

Utilisez l’option -ttl pour spécifier un TTL différent (300 secondes dans cet exemple) pour les mises à jour. Ceci est particulièrement utile si vous souhaitez ajuster la durée de validité des enregistrements.

Automatisation de l’Adresse IP Externe :

1
./update_dns.sh -ns ns.example.com -kf path/to/keyfile -records "router.example.com=EXTERNALIP"

Dans ce cas, l’utilisation de EXTERNALIP récupérera automatiquement l’adresse IP externe du système via le service ifconfig.me. Cela vous permet de maintenir à jour vos enregistrements même lorsque votre adresse IP externe change.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env bash
# Check dependencies
if ! command -v curl &> /dev/null || ! command -v nsupdate &> /dev/null; then
  echo "curl and nsupdate are required but not installed. Exiting."
  exit 1
fi
# Parse command-line arguments
declare -a RECORDS
while [[ $# -gt 0 ]]; do
  case $1 in
    -ns|--nameserver)
      NAMESERVER=$2
      shift
      shift
      ;;
    -kf|--keyfile)
      KEYFILE=$2
      shift
      shift
      ;;
    -ttl)
      TTL=$2
      shift
      shift
      ;;
    -records)
      shift
      while [[ $# -gt 0 && ! $1 =~ ^- ]]; do
        RECORDS+=($1)
        shift
      done
      ;;
    *)
      echo "Unknown parameter: $1"
      exit 1
      ;;
  esac
done
# Function to update a single record
update_record() {
  local DDNSNAME="$1"
  local IPADDR="$2"
  (
    echo "server $NAMESERVER"
    echo "update delete $DDNSNAME A"
    echo "update add $DDNSNAME $TTL A $IPADDR"
    echo "send"
  ) | nsupdate -k "$KEYFILE"
}
# Prompt for missing values
if [ -z "$NAMESERVER" ]; then
  read -p "Enter the nameserver: " NAMESERVER
fi
if [ -z "$KEYFILE" ]; then
  read -p "Enter the key file path: " KEYFILE
fi
if [ -z "$TTL" ]; then
  read -p "Enter the TTL (default: 200): " TTL
  TTL=${TTL:-200}
fi
# Update records
if [ ${#RECORDS[@]} -gt 0 ]; then
  for record_with_ip in "${RECORDS[@]}"; do
    record_name="${record_with_ip%=*}"
    ip_address="${record_with_ip#*=}"
    # Use EXTERNALIP variable to determine IP address
    if [ "$ip_address" == "EXTERNALIP" ]; then
      ip_address="$(curl -s ifconfig.me)"
    fi
    update_record "$record_name" "$ip_address"
  done
fi
# Check for errors
if [ $? -eq 0 ]; then
  echo "DNS record(s) updated successfully."
else
  echo "Error updating DNS record(s)."
fi

Conclusion

Vous avez désormais les outils nécessaires pour simplifier les mises à jour dynamiques de vos enregistrements DNS sous Bind. En mettant en pratique les astuces partagées dans cet article, vous pourrez dire adieu aux soucis de mises à jour fastidieuses. Et n’oubliez pas, ce script est là pour vous simplifier la tâche, même si vous n’êtes pas un expert en la matière. N’hésitez pas à partager vos expériences et vos questions dans les commentaires ! Bonne bidouille !

Généré avec Hugo
Thème Stack conçu par Jimmy