Servidor DNS Dinámico con BIND

nsupdate es un comando que nos permite actualizar las entradas de un servidor DNS.

En este artículo configuraremos BIND para que permita ser actualizado por los clientes a través de nsupdate.

Tenemos que tener instalado el paquete dnsutils:

apt-get install dnsutils

Generando la clave

Para que los clientes puedan actualizar el DNS generaremos una clave de autentificación.

Entramos en el directorio de configuración de BIND y generamos la clave con el comando "dnssec-keygen":

cd /etc/bind
dnssec-keygen -a HMAC-MD5 -b 512 -n HOST server
  • -a HMAC-MD5: algoritmo utilizado.
  • -b 512: tamaño en bits de la clave.
  • -n HOST: el tipo de dueño de la clave (case-sensitive).
  • server: el nombre de la clave.

 

Esto habrá generado 2 ficheros: "Kserver.+157+56776.private" y "Kserver.+157+56776.key". La clave que nos interesa es la siguiente:

grep '^Key' Kamazon.+157+56776.private
FGbUIzPEbJgyEkDxEYccrxVTLQ==


Configurando BIND

Editamos el fichero de configuración de BIND y añadimos la clave:

vi /etc/bind/named.conf
key "server" {
algorithm HMAC-MD5;
secret "FGbUIzPEbJgyEkDxEYccrxVTLQ==";
};

 

En la zona que queramos actualizar dinámicamente añadimos la cláusula "allow-update":

zone "acme.com" {
type master;
file "/var/cache/bind/acme.com.db";
allow-update { key server; };
};

donde "key server" es la clave que los clientes tendrán que utilizar para actualizar esta zona.

Reiniciamos el servicio para aplicar los cambios:

 /etc/init.d/bind9 restart


Configurando el cliente

Lo que queremos es actualizar en el DNS el hostname y la IP asignada a la interfaz eth0 de nuestros servidores. Para conseguir esto crearemos el script "nsupdate.sh":

vi /usr/local/bin/nsupdate.sh
#!/bin/bash

# Variables
KEYNAME="server"
HASH="FGbUIzPEbJgyEkDxEYccrxVTLQ=="
INTERFACE="eth0"
SERVER="ns.acme.com"
ZONE="acme.com"
HOST=`hostname -f`

# Discovering IP
IP=`ifconfig $INTERFACE | grep inet | cut -d ":" -f 2 | tr -d a-z,A-Z,- |sed 's/\s//g';`

# Update command
NSUPDATE="/usr/bin/nsupdate -y $KEYNAME:$HASH"

# DNS data
EXEC="server $SERVER\n
zone $ZONE\n
update delete $HOST A\n
update add $HOST 1440 A $IP\n
show\n
send"

# Updating DNS
echo -e $EXEC | $NSUPDATE

donde:

  • KEYNAME: el nombre de la clave.
  • HASH: la clave que hemos generado.
  • SERVER: el servidor DNS que actualizaremos.
  • ZONE: la zona que actualizaremos.

 

Para actualizar la entrada en el servdor DNS simplemente ejecutamos el script:

./nsupdate.sh