DNS dinámico con FreeBSD
Algunos tenemos direcciones IP dinámicas en nuestras casas u oficinas. Si disponemos de un servidor de DNS al que tengamos acceso por SSH podemos configurar una actualización de DNS dinámica. De esta forma no tenemos que acceder por SSH a nuestras máquinas usando nombres ridículos (véase DynDNS para referencia).
Como en mi empresa se usa FreeBSD en los servidores locales tanto como los de producción, yo lo he montado con este (fabuloso) sistema operativo. Extrapolar las indicaciones para su implementación en Linux no tiene que ser demasiado difícil.
Primero, en el cliente creamos las claves que se usarán para la autenticación con el servidor:
dnssec-keygen -a HMAC-MD5 -b 128 -n HOST NOMBRE_CLAVE
Echad un ojo a la help o al man para cambiar el tamaño de las keys o lo que querais, en mi caso ésto es suficiente. Esto creará dos ficheros (.private y .key) que sirven para la actualización de servidores con Bind 8 y 9 respectivamente. Guardamos las keys en lugar seguro… aquí yo he elegido crear un directorio de scripts para hacer todo esto, cada uno que se lo monte donde le parezca mejor:
mkdir /root/scripts
mkdir /root/scripts/dnskeys
mv FICHERO.key /root/scripts/dnskeys/
mv FICHERO.private /root/scripts/dnskeys/
chmod -R 700 /root/scripts/dnskeys
Comprobad el contenido del fichero ( .key para Bind 9, .private para Bind 8 ) y anotad el texto de la key (xterm -e “vim /tmp/lalala && rm /tmp/lalala && exit”) .
En el servidor hay que modificar el fichero de configuración de named para que permita actualizar la zona afectada tras autenticarse con la key generada. Editamos el fichero de configuración (vim /etc/namedb/named.conf), y antes de la declaración de las zonas escribimos la declaración de la key:
key NOMBRE_CLAVE {
algorithm HMAC-MD5.SIG-ALG.REG.INT;
secret “O-ksi4t310rSRsad7B0Bsv23caQ==”;
};
El secret es el chorizo extraído del fichero de la key. Solo falta especificar la zona en la que se va a realizar la actualización, para dar permiso a los clientes autenticados con la clave recién declarada:
zone “NOMBREDOMINIO.com” {
type master;
allow-update{
key NOMBRE_CLAVE;
};
file”/path/a/la/zona/del/dominio.db“;
};
Ya podemos matar y reiniciar el servidor de nombres:
/etc/rc.d/named restart
(que las BSD no tengan runlevels no significa que tengamos que hacer el pino para relanzar un servicio).
Ahora toca probar desde el cliente la actualización del nombre:
nsupdate -k /root/scripts/dnskeys/FICHERO.key
Esto nos dará un prompt en el que debemos ejecutar las órdenes de la actualización, es decir, eliminar la entrada correspondiente al nombre dinámico e introducirla otra vez:
> update delete HOST.NOMBREDOMINIO.com
> update add HOST.NOMBREDOMINIO.com 60 IN A 80.98.21.127
No tiene mucho secreto. La primera línea es evidente, la segunda creo que también, pero por si a alguien le despista el 60 aclaro que es el TTL de la entrada.
Ahora bien, lo que sí es MUY IMPORTANTE es apretar dos veces la tecla INTRO, puesto que es la manera de ejecutar el commit de la petición de update. Igual de IMPORTANTE es que los dos ordenadores estén sincronizados en tiempo. Podeis sencillamente sincronizarlos con algún servidor NTP externo:
ntpdate hora.rediris.es
Solo falta automatizarlo. Yo he escrito un script para capturar la IP externa de mi red que de momento me funciona bien:
#!/usr/local/bin/bash
HOST=”oficina.sysdivision.com”
CLAVE=”/root/scripts/dnskeys/NOMBRE_CLAVE.key”
IP_EXTERNA=`/usr/local/bin/wget -c http://www.cualesmiip.com/index.php && cat index.html\?lg\=es | grep “IP real” | cut -f 2 -d “>” | cut -f 1 -d ” “`
/bin/rm index.html*# En la siguiente línea los dos “<" tienen que ir juntos,
# pero el editor de WP no me deja xD
/usr/bin/nsupdate -k $CLAVE < < EOF
update delete $HOST
update add $HOST 60 IN A $IPEOF
Para saber la IP que tengo que aplicar a la actualización, consulto cualesmiip.com. EL truco del almendruco funciona por el momento y eso que ya han puesto un banner de esos del casino. A ver si en breve no van a meter spywares, banners porno o algo así, y entonces tenemos que cambiar la táctica.
En el cron, la línea es sencilla:
* * * * * /root/scripts/update.sh 1>/dev/null 2>&1
Y bueno, eso es todo. Espero que le sirva a alguien. Yo es que ya estaba cansado de entrar por SSH a las máquinas del trabajo usando churrito.no-ip.info y cosas así, porque es que encima en los sitios de nombres dinámicos los nombres l33t siempre están ya cogidos.

Viernes, 24 Marzo 2006, a las 10:28 am
Tio, esto debiera ir a la assl, no?¿?
Viernes, 24 Marzo 2006, a las 1:23 pm
Si tio pero no voy a escribirlo dos veces, al menos ahora que no tengo demasiado tiempo. Si quieres puedo enlazarlo, o postearlo haciendo referencia aqui, pero no me pidas que me ponga a editar el html y toda la pesca que me puedo morir…. ñañañaña
Jueves, 30 Marzo 2006, a las 8:22 am
no había visto el comentario!
porqeu no haces un cp & paste ¿?
sino, lo enlazo…
salu2
Martes, 17 Octubre 2006, a las 12:36 pm
[…] Yo he hecho un pequeño script que saca mi dirección IP pública, y lo ejecuto desde el cron una vez por minuto. También he encontrado problemas en la actualización si el cliente y el servidor están descompasados en tiempo… de modo que es bueno pensar en sincronizar las máquinas con ntp contra algún servidor de time (hora.rediris.es, por ejemplo). ECICIÓN: vaya… este post es prácticamente un duplicado del que ya escribí en su día explicando cómo hacerlo en FreeBSD. No me había dado cuenta […]