Buenos días,

Hoy traigo una iniciativa inteligente para ahorrar costes a la hora de contratar una IP fija, muchos de los ISL’s ni si quiera disponen del servicio para facilitarla. Lo cual, puede ser un inconveniente si tenemos un servidos en casa con varios servicios corriendo, ya que al reiniciarse el router se cambiara la ip por otra y tendremos que modificar el DNS a mano.

Para este proyecto trabajare con el proveedor de dominios Ionos, donde aprenderemos a gestionar las API para consultar y modificar los registros. Como entorno de desarrollo utilizare Ubuntu Server, donde instalaremos Python3 y las librerías necesarias.

Instalación de los paquetes necesarios

Empezaremos por instalar Python en nuestro sistema:

sudo apt update && apt upgrade -y
sudo apt install python3

Para poder descargarnos las librerías necesarias necesitaremos instalar también PIP:

sudo apt install python3-pip

Una vez instalado todo comprobamos que la instalación se hizo correctamente:

python3 --version
pip3 --version

Para no afectar a nuestro sistema, python te da la facilidad de crear un entorno donde poder entrar e instalar todo lo necesario sin riesgo alguno, se crea de la siguiente manera:

python -m venv nombre_entorno

Y, para iniciar el entorno, debemos de poner este comando:

source nombre_entorno/bin/activate

Una vez dentro del entorno, pasamos a instalar las dependencias necesarias para nuestro código, en este caso son requests, json, time, os:

pip install requests json time os

Con esto ya tendríamos lo necesario.

import requests
import json
import time
import os

# Configuración
API_KEY = "tu_prefijo+clave_api"
ZONE_ID = "Tu_id_zona"
BASE_URL = "https://api.hosting.ionos.com/dns/v1/zones"
IP_FILE = "registro_ip_nombredominio.txt"
CHECK_INTERVAL = 300  # Intervalo de tiempo para verificar la IP (en segundos)

def get_public_ip():
    """Obtiene la IP pública actual."""
    response = requests.get("https://api.ipify.org?format=json")
    response.raise_for_status()
    return response.json()["ip"]

def get_dns_records(zone_id, api_key):
    """Consulta los registros de la zona DNS."""
    url = f"{BASE_URL}/{zone_id}"
    headers = {"X-API-Key": api_key}
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    return response.json()["records"]

def update_dns_record(zone_id, record_id, api_key, new_ip, domain_name):
    """Actualiza un registro A con la nueva IP."""
    url = f"{BASE_URL}/{zone_id}/records/{record_id}"
    headers = {
        "X-API-Key": api_key,
        "Content-Type": "application/json",
    }
    data = {
        "name": domain_name,
        "type": "A",
        "content": new_ip,
        "ttl": 3600,
        "prio": 0,
        "disabled": False
    }
    response = requests.put(url, headers=headers, data=json.dumps(data))
    response.raise_for_status()
    return response.json()

def load_last_ip():
    """Carga la última IP registrada desde un archivo."""
    if os.path.exists(IP_FILE):
        with open(IP_FILE, "r") as file:
            return file.read().strip()
    return None

def save_current_ip(ip):
    """Guarda la IP actual en un archivo."""
    with open(IP_FILE, "w") as file:
        file.write(ip)

def main():
    while True:
        try:
            # Obtén la IP pública actual
            new_ip = get_public_ip()
            print(f"IP pública actual: {new_ip}")

            # Carga la última IP registrada
            last_ip = load_last_ip()
            print(f"Última IP registrada: {last_ip}")

            if new_ip != last_ip:
                print("Cambio de IP detectado. Actualizando registros DNS...")

                # Consulta los registros DNS
                records = get_dns_records(ZONE_ID, API_KEY)
                a_records = [record for record in records if record["type"] == "A"]

                # Actualiza los registros A con la nueva IP
                for record in a_records:
                    record_id = record["id"]
                    domain_name = record["name"]
                    print(f"Actualizando registro {domain_name} (ID: {record_id}) con la IP {new_ip}...")
                    result = update_dns_record(ZONE_ID, record_id, API_KEY, new_ip, domain_name)
                    print(f"Registro actualizado: {result}")

                # Guarda la nueva IP en el archivo
                save_current_ip(new_ip)
                print("Registros DNS actualizados y nueva IP guardada.")
            else:
                print("No hay cambios en la IP. Verificando nuevamente en el próximo intervalo.")

        except requests.exceptions.RequestException as e:
            print(f"Error al realizar la solicitud: {e}")
        except Exception as e:
            print(f"Error inesperado: {e}")

        # Espera antes de la próxima verificación
        time.sleep(CHECK_INTERVAL)

if __name__ == "__main__":
    main()

Creación de API en ionos

Deja una respuesta

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