/ Raspberry Pi

Actualizar IP dinámica en una Raspberry Pi y CloudFlare

CloudFlare es un proxy gratuito que puede servir para muchas cosas. Aunque también lo podemos usar sólo como gestor de nuestras DNS y así poder usar su API para actualizar la IP de nuestro servidor. Claro, siempre y cuando tengamos una IP dinámica. En caso contrario, todo esto es una perdida de tiempo.

Por cierto, que puedes usar CloudFlare como servidor de DNS y deshabilitar la opción de proxy. No es necesario usar ambas para el proposito de este artículo.

Pasos a seguir:

Obtener ZoneID:

En la página de Cloudflare copiamos nuestra Zone ID:

Nuestro ZoneID

Obtener Auth-Key:

Si observamos la imagen anterior, debajo de nuestro Zone ID, tenemos el enlace a Get your API key.

Clickamos, y buscamos el apartado de Global API Key

Visualizar nuestro Auth Key
Nuestro Auth Key

Obtener RecordID:

Ejecutar en una terminal:

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZoneID/dns_records?name=dominio.ltd" \
-H "X-Auth-Email: e-mail" \
-H "X-Auth-Key: Auth-Key" \
-H "Content-Type: application/json"
  • Donde pone ZoneID hay que insertar el número obtenido en el paso anterior.
  • Auth-Key, insertar el número obtenido en el paso anterior.
  • e-mail, nuestro e-mail de usuario en Cloudflare.
  • Donde pone dominio.ltd hay que insertar el dominio o subdominio del cual queremos hacer la consulta.

Del resultado obtenido, nos apuntamos el número que aparece en el registro id.

Cambiar la ip en caso de ser necesario:

Ejecutaremos el script dindns.sh:

  1. Copiar el script.
  2. Dar permisos de ejecución chmod +x dindns.sh.
  3. Ejecutar el script ./dindns.sh.

A continuación tienes el script (dindns.sh). Aunque también está disponible en Gitlab.

#!/bin/sh

EMAIL=email
KEY=key
ZONE_ID=ZoneID
RECORD_ID=ZoneID
DOMAIN=domain.lt
TYPE=Record Type (example A)

FECHA=`date +"%d/%b/%Y %H:%M"`
NEW_IP=`dig +short myip.opendns.com @resolver1.opendns.com)`
CURRENT_IP=`host $DOMAIN | awk {'print $4'})`

if [ "$NEW_IP" = "$CURRENT_IP" ]
then
    echo "$FECHA > No hay cambios de IP ($CURRENT_IP)."
else
    echo "$FECHA > Cambio de IP Actual ($CURRENT_IP) a nueva IP ($NEW_IP)"
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
      -H "X-Auth-Email: $EMAIL" \
      -H "X-Auth-Key: $KEY" \
      -H "Content-Type: application/json" \
      --data "{\"type\":\"$TYPE\",\"name\":\"$DOMAIN\",\"content\":\"$NEW_IP\"}"
fi

Automatizar el script con crontab

Abrimos nuestro crontab, ejecutando crontab -e, y añadimos al final del todo lo siguiente:

SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/pi/bin
*/5 * * * * /home/pi/bin/dindns.sh >> /home/pi/bin/dindns.log

Cada cinco minutos, el cron ejecutará el script y escribirá la salida en el archivo dindns.log.

Si después de un tiempo hacemos un cat dindns.log. Nos mostrará lo siguiente:

10/may/2016 11:30 > No hay cambios de IP (176.85.226.237).
10/may/2016 11:35 > No hay cambios de IP (176.85.226.237).
10/may/2016 11:40 > No hay cambios de IP (176.85.226.237).
10/may/2016 11:45 > No hay cambios de IP (176.85.226.237).
10/may/2016 11:50 > No hay cambios de IP (176.85.226.237).
10/may/2016 11:55 > No hay cambios de IP (176.85.226.237).
10/may/2016 12:00 > No hay cambios de IP (176.85.226.237).

Pues eso es es todo. Si seguís éstas recomendaciones, tendrás un archivo llamado ~/bin/dindns.log. Aquí podrás revisar cuando se ha realizado un cambio de ip, y la nueva ip asignada.

También, podrías modificar el script, para que te mande un e-mail directamente, cada vez que se produzca un cambio de ip. Pero eso te lo dejo a tí, o tal vez para una futura entrada en el blog. Que en la entrada de hoy, me estoy quedando sinsitio ;D

¡Un saludo navegantes!

Imagen de cabecera: dear_theophilus's | openclipart