Ya hace tiempo tuve la necesidad de poder tener un servicio de DNS en el que pudiese cambiar las entradas a mi gusto y lo mas importante poder actualizar los registros de forma automática ( DNS dinámicas), para poder montar un servidor en casa y no tener que pagar Ip fija al proveedor. Gracias a mi gran amigo Er_Maqui me enseño el servicio gratuito de HE.net.
Entre sus servicios orientados a IPv6 que nos permiten crear un túnel IPv6 para poder usarlo bajo una red IPv4, también se puede sacar un certificado de conocimientos de IPv6, entre otros
Pero el que nos interesa es el servicio de DNS que nos ofrece : https://dns.he.net/
Después de darnos de alta ( esta cuenta nos sirve para todos los servicios) entramos en FreeDNS. Lo mas importante es que nos muestra los nombres de dominio que debemos de substituir en el proveedor de nombres de dominio en el apartado de nombres de servidores DNS.
Tendremos que sustituir los nombre que nos venga por los 5 que nos dan . (muy importante por que tiene que ser los 5)
ns1.he.net ns2.he.net ns3.he.net ns4.he.net ns5.he.net
Una vez cambiado los datos, tener en cuenta que el cambio puede tardar hasta 48 Horas.
Lo siguiente es crear nuestro zona DNS en HE y pulsamos en Add a new domain
Nos abre un cuadro de dialogo y añadimos el dominio que tenemos comprado, Yo para hacer el ejemplo he usado pruebas70.com
Una vez creado, ya nos sale nuestro dominio. y pulsamos en el lápiz para editar la zona
Luego seleccionamos New A para crear la redirección del dominio al hosting, que en este caso esta ubicado en mi casa.
Una vez abierto lo único que hay que poner es seleccionar el cuadradito para indicarle que es dinámico. no hay que rellenar mas por que estamos poniendo la entrada principal.
Una vez creado pulsamos el icono de las flechitas para cambiar las claves de actualización.
En la ventana que nos abre ponemos generate a key y guardamos la contraseña.
Con esto ya tenemos los datos mínimos para poder configurar las dns con ipdinamica.
Hora ya solo necesitamos el script.
Este primer ejemplo es para actualizar un solo dominio:
#!/bin/bash ip=$(curl -s http://whatismijnip.nl |cut -d " " -f 5) url="pruebas70.com" #primer dominio pass="qbu98xi3Ny06diBj" #contraseña del registro A en he.net ipex=$(host -t A $url |cut -d " " -f 4) if [ "$ipex" != "$ip" ] then valor=$(curl -s https://dyn.dns.he.net/nic/update -d "hostname=$url" -d "password=$pass" -d "myip=$ip") mensaje="ddns he.net -> $url -- $valor" /home/USER/telegram-alert.sh "El dominio: $url a actualizado su IP a $ip $valor" fi printf '%s\n' "$mensaje" printf '%s\n' "$mensaje" | logger
Segundo ejemplo para 2 dominios:
#! /bin/bash ip=$(curl -s http://whatismijnip.nl |cut -d " " -f 5) data0[0]="pruebas70.com" #primer dominio data0[1]="qbu98xi3Ny06diBj" #contraseña del registro A en he.net data1[0]="server2.pruebas70.com" #Segundo dominio data1[1]="8wu98wi3N206d2B2" #contraseña del registro A en he.net data=(data0[@] data1[@]) for((i=0;i<${#data[@]};i++)) do ipex=$(host -t A ${!data[i]:0:1} |cut -d " " -f 4) if [ "$ipex" != "$ip" ] then valor=$(curl -s https://dyn.dns.he.net/nic/update -d "hostname=${!data[i]:0:1}" -d "password=${!data[i]:1:1}" -d "myip=$ip") mensaje[$i]="ddns he.net -> ${!data[i]:0:1} -- $valor" /home/USER/telegram-alert.sh "El dominio: ${!data[i]:0:1} a actualizado su IP a $ip $valor" else valor="no updated" fi done printf '%s\n' "${mensaje[@]}" printf '%s\n' "${mensaje[@]}" | logger
Explicaciones de los scripts:
ip=$(curl -s http://whatismijnip.nl |cut -d ” ” -f 5) Capturamos la ip externa de nuestra conexión.
data0[0]="pruebas70.com" #primer dominio data0[1]="qbu98xi3Ny06diBj" #contraseña del registro A en he.net data1[0]="server2.pruebas70.com" #Segundo dominio data1[1]="8wu98wi3N206d2B2" #contraseña del registro A en he.net data=(data0[@] data1[@])
En esta parte creamos un array de arrays para poder tener los datos en una sola variable.
for((i=0;i<${#data[@]};i++)) do Bucle for para recorrer el array y usamos a longitud del mismo usando la # –> #data[@]
ipex=$(host -t A ${!data[i]:0:1} |cut -d ” ” -f 4) Cogemos la ip que tiene el servicio DNS, haciendo una consulta con host y llamamos al array ${!data[i]:0:1} con esto obtenemos los nombres de los dominios apuntados.
if [ “$ipex” != “$ip” ] Comprobamos si la ip externa y la de la entrada de la DNS.
valor=$(curl -s https://dyn.dns.he.net/nic/update -d “hostname=${!data[i]:0:1}” -d “password=${!data[i]:1:1}” -d “myip=$ip”) Llamamos a He.net para actualizar la entrada DNS pasamos el nombre del host ${!data[i]:0:1} y luego el password guardado en el array ${!data[i]:1:1} y la Ip externa $ip.
mensaje[$i]=”ddns he.net -> ${!data[i]:0:1} — $valor” Guardamos un mensaje co el nombre del host y el resultado que nos da el servicio.
/home/USER/telegram-alert.sh “El dominio: ${!data[i]:0:1} a actualizado su IP a $ip $valor” Llamamos al script que ya tenemos para enviar mensajes a través de telegram .
printf ‘%s\n’ “${mensaje[@]}” Imprimimos los mensajes que hemos recogido a consola.
printf ‘%s\n’ “${mensaje[@]}” | logger Mandamos al syslog los mensajes.
Este es un ejemplo del mensaje que recibimos por Telegram.
Si el equipo donde estamos poniendo el script esta detrás de un router, necesitamos que compruebe esto cada cierto tiempo. Aquí tenéis un ejemplo de crontab para que se ejecute cada 5 minutos
*/5 * * * * /home/USER/renewip.sh >/dev/null 2>&1