Script para monitorizar cambio de IP Pública

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:

  1. Crear un script, que revise si la IP cambia de valor.
  2. Instalar y configurar un programa que envíe emails con nuestra cuenta.
  3. 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.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio