Llevo un tiempo dándole vueltas a la posibilidad de averiguar si nuestro proveedor de internet nos cambia la IP pública y de qué manera poder saber cuando se hace ese cambio. Esto es interesante para no depender de un servicio DDNS como DynDNS, No-IP etc. He visitado numerosas web y he recopilado información de todas ellas para poder hacer este tutorial.
Para esto utilizaré mi Raspberry Pi 4 que está siempre conectada a Internet. Como sistema operativo he usado Linux MX-23.2 Raspberry Pi OS Libretto.
Los trabajos a realizar son los siguientes:
- Crear un script, que revise si la IP cambia de valor.
- Instalar y configurar un programa que envíe emails con nuestra cuenta.
- Ejecutar una tarea para que esto se realice cada cierto tiempo.
1- Crear el Script
Buscando por Internet he visto varios script interesantes. He elegido uno que encontré en la web de Victorhck, que hace esta tarea, y que modificaré para arreglar un pequeño problema que tiene. ¿y cual es ese pequeño problema que tiene? Pues resulta que, algunas veces, el servicio que nos tiene que dar la ip pública (dyndns.org) falla y no da IP, con lo que al comparar la IP anterior con la IP sin valor, recibiremos un email en blanco.
Con esta modificación, si el resultado es una IP nula, volverá a consultar hasta obtener una IP válida. De esta forma, solo recibiremos un email cuando realmente cambie la IP. También he cambiado la dirección de consulta de IP por la de curl ifconfig.me , ya que me parece mucho mas estable y fiable.
#!/bin/bash
#https://linuxete.duckdns.org
#https://chapuboot.blogspot.com
#victorhckinthefreeworld.com
#define archivo donde almacena la ip pública actual
EXT_IP_FILE="/home/usuario/ipactual"
timestamp=$( date +%T )
curDate=$( date +"%d-%m-%y" )
CURRENT_IP=""
while [ -z $CURRENT_IP ]; do
#Conseguir la IP pública
CURRENT_IP=$(curl ifconfig.me 2> /dev/null)
#CURRENT_IP=$(curl -silent -L http://checkip.amazonaws.com|tail -n 1)
#Si existe el archivo se saca la IP que había
if [ -f $EXT_IP_FILE ]; then
KNOWN_IP=$(cat $EXT_IP_FILE)
else
#Si no existe el archivo se crea y se guarda la IP pública actual
KNOWN_IP= touch ipactual
KNOWN_IP=$(cat $EXT_IP_FILE)
fi
done
#Comprueba si la IP actual ha cambiado de la IP que se había guardado
if [ "$CURRENT_IP" != "$KNOWN_IP" ]; then
echo $CURRENT_IP > $EXT_IP_FILE
#Si es distinta la IP se envía un correo con la IP actual
mail -s "IP Actual $(< $EXT_IP_FILE)" email_a_destinar@loquesea.com < $EXT_IP_FILE
#Se guardan las IPs en un archivo de log
echo $curDate $timestamp "* NUEVA IP: " $(< $EXT_IP_FILE) >> log.txt
fi
Esto lo copiamos y lo pegamos en un archivo de texto al que llamaremos TestIP.sh y lo guardamos en nuestra carpeta personal. Cambiaremos los datos de la línea 4 donde pondremos nuestro usuario del sistema y la línea 26 donde pondremos la dirección de email al que vamos a enviar la información.
Ya tan solo de daremos permisos de ejecución al script y lo tendríamos funcionando.
chmod +x TestIP.sh
2- Instalar ssmtp y configurar la cuenta de correo.
SSMTP es un programa que entrega correo electrónico desde un ordenador local a un servidor de correo, su uso principal es reenviar el correo electrónico automatizado (como las alertas del sistema) desde un equipo a una dirección de correo electrónico externa.
Para instalar ssmtp basta con escribir el siguiente comando en una terminal
sudo apt install ssmtp -y
Para poder usar el comando mail de la línea 23 del script también instalaremos mailutils
sudo apt install mailutils -y
También instalaremos curl
sudo apt install curl
Para configurar el programa editamos su archivo ssmtp.conf
sudo nano /etc/ssmtp/ssmtp.conf
Rellenamos la línea root con tu dirección de correo
root=tu_correo@gmail.com
Rellenamos la línea mailhub con el smtp de gmail
mailhub=smtp.gmail.com:587
Descomentamos la línea FromLineOverride
FromLineOverride=YES
Añadimos a continuación las siguientes líneas
AuthUser=tu_correo@gmail.com
AuthPass=tucontraseñasinespacios
UseSTARTTLS=YES
Yo voy a usar una cuenta Gmail, que tiene activada la verificación en dos pasos, la cual ya no tiene la opción de «acceso a aplicaciones poco seguras» (necesaria para aplicaciones de terceros), Por esta razón deberemos crear una contraseña única en el apartado «Contraseñas de Aplicaciones»
Para obtenerla deberás ir a la Configuración de tu cuenta, Seguridad
Se generará una contraseña de 15 dígitos que será la que usarás para configurar el apartado de AuthPass.
**Ojo, la contraseña se usa sin los espacios, aunque te la muestra con espacios entre dígitos, hay que pegarla sin los espacios **
¡¡Vamos a probarlo!!
Para saber si funciona tecleamos el siguiente comando en consola.
echo "Testing…1…2…3" | ssmtp mi_email@gmail.com
No deberá arrojar ningún error y si vamos a nuestra bandeja de entrada, veremos que tenemos un nuevo email.
Para saber que está funcionando el script, en una terminal escribimos el siguiente comando.
./TestIP.sh
La primera vez que lo ejecutemos, aparentemente no hará nada, pero, si revisas tu carpeta personal, habrá creado dos archivos, uno llamado ipactual y el otro log.txt y en la bandeja de entrada de tu correo tendrás un nuevo email indicando tu IP Pública.
Si ejecutamos más veces el script, no ocurrirá nada, ya que nuestra IP no ha cambiado. Si tenemos una VPN y la activamos, reiniciamos o apagamos el router, al ejecutar el Script es posible que envíe un email con la nueva IP.
3- Automatizar la tarea.
Vamos a hacer que el script TestIP.sh se ejecute cada hora a través de Cron.
Crearemos un archivo Crontab, así que desde la terminal ejecutamos el siguiente comando:
crontab -e
Dentro pegaremos la siguiente instrucción, sustituyendo «usuario» por el nombre de usuario de tu cuenta.
0 */1 * * * /home/usuario/TestIP.sh
Esto quiere decir que, cada hora, el script se ejecutará y hará las comprobaciones pertinentes.
Eso es todo, a partir de ahora sabrás cuando cambia tu dirección IP porque estarás informado a través de tu correo electrónico.