Arnaud TOMEÏ > Scripts & extraits de configuration > DNS Dynamique

Mon FAI ne proposant pas d'IP fixe, je met régulierement à jour un enregistrement DNS sur ma zone avec DNS UPDATE afin de pouvoir facilement joindre les machines de mon domicile à partir de l'extérieur.

Configuration Bind

Bind authentifie la machine cliente avec une clef DNSSEC générée par la commande suivante :

# dnssec-keygen -a HMAC-MD5 -b 512 -n USER hostname.domain.tld

Note :

HMAC-MD5 ne devrait plus être utilisé pour les nouvelles clefs, il est à remplacer par HMAC-SHA256 ou HMAC-SHA512.

La configuration de la zone :

key "hostname.domain.tld" {
        algorithm hmac-md5;
        secret "abcdefghijklmonpqrstuvwxyz==";
};

zone "domain.tld" {
        type master;
        file "/etc/bind/db.domain.tld";
        allow-update { key hostname.domain.tld.; };
        [...]
};

Script client

Ce script utilise la commande nsupdate fournie sur Debian par le paquet dnsutils.

#!/bin/sh

CURRENT_IP=`curl ifconfig.me`
DNS_IP=`dig +short hostname.domain.tld @ns.domain.tld | tail -n1 `
DNS_KEY="/home/user/non-world-readable-path/Khostname.domain.+XXX+12345.private"
TMP_FILE="/home/user/non-world-readable-path/info"

if [ "$DNS_IP" = "$CURRENT_IP" ]; then 
    exit 0
else
    cat > $TMP_FILE << EOF
server ns.domain.tld.
update delete hostname.domain.tld. A
update add hostname.domain.tld. 180 A $CURRENT_IP
show
send
EOF

    nsupdate -k $DNS_KEY -v $TMP_FILE
fi

Mise à jour manuelle

La mise à jour dynamique utilise un journal binaire qui est répercuté ponctuellement sur la version texte de la zone, il faut donc la verrouiller lors de modifications manuelles pour éviter les conflits.

# rndc freeze domain.tld
[Modification manuelle de la zone]
# rndc thaw domain.tld
# rndc reload domain.tld