obsidian-dix/DIX-Notes/DDNS RASTREO CON CLOUDFLARE.md

209 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Para crear un script que rastree nuestra ip pública con ayuda de cloudflare vamos a necesitar los siguientes datos:
```bash
ZONE_ID=""
RECORD_ID=""
API_TOKEN=""
EMAIL=""
DOMAIN=""
```
Para obtener el `ZONE_ID`, te recomiendo crear un registro de un subdominio en tu perfil de cloudflare, ejemplo registro:
Tipo: A
Nombre: mi-ip
Contenido: 187.123.32.45
> En **contenido** va la ip pública.
Una vez creado tu subdomino, debemos crear API Token, vamos a **Perfil > Tokens de API > Crear Token > Editar zona DNS > (sección Recursos de Zona) opción 1: Incluir, Opción 2: Zona específica, Opción 3: selecciona tu dominio > Ir a resumen**, eso te dará tu ==`API_TOKEN` ==,
Una Vez tengas el `API Token` vamos a obtener el `ZONE_ID`, en tu consola ejecuta el comando:
```bash
curl -X GET "https://api.cloudflare.com/client/v4/zones?name=TU-DOMINIO-NO-SUBDOMINIO.com" \
-H "Authorization: Bearer TU-API-TOKEN" \
-H "Content-Type: application/json"
```
Ejecuta ese comando en tu consola linux, la salida será algo como:
```bash
{"result":[
{"id":"TU-ZONE-ID","name":"TU-DOMINIO-NO-SUBDOMINIO.com","status":"active","paused":false, ... (más cosas)
```
Del primer bloque verás un diccionario con una clave `id`, el valor es tu ==`ZONE_ID`==, para obtener el `RECORD_ID` es un poco similar al paso anterior, el comando a ejecutar es:
```bash
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/TU-ZONE-ID/dns_records?type=A&name=TU-SUBDOMINIO.COM" \
-H "Authorization: Bearer TU-API-TOKEN" \
-H "Content-Type: application/json"
```
Obtendrás una respuesta como esta:
```bash
{"result":[{"id":"TU-RECORD-ID","name":"TU-SUBDOMINIO.COM","type":"A", ... (más cosas)
```
Del primer bloque verás un diccionario, con una clave `id`, el valor es tu ==`RECORD_ID`==, en el valor de ==`EMAIL`==, coloca el email con el que inicias sesión en tu cuenta de cloudflare, y en ==`DOMAIN`== coloca el nombre de tu subdominio, una vez que ya tenemos esos datos podemos continuar con el script completo:
```bash
#!/bin/bash
# Configuración
ZONE_ID="abcdef1234567890abcdef1234567890"
RECORD_ID="c3f9a7e6b24d48b2a6f481c2a9d2f9c1"
API_TOKEN="e4b-2f6c9a81d4b87f0a927ec5b3c6a59f0e7a45b"
EMAIL="tu.email@mail.com"
DOMAIN="subdominio.dominio.com"
# Obtener IP actual
IP=$(curl -s https://api.ipify.org)
# Obtener IP actual del DNS
DNS_IP=$(dig +short $DOMAIN @1.1.1.1)
# Comparar
if [ "$IP" != "$DNS_IP" ]; then
  echo "La IP cambió: $DNS_IP$IP. Actualizando en Cloudflare..."
  curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
     -H "Authorization: Bearer $API_TOKEN" \
     -H "Content-Type: application/json" \
     --data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"$IP\",\"ttl\":120,\"proxied\":true}" | jq
else
  echo "La IP no ha cambiado: $IP"
fi
```
==Versión Mejorada==
```bash
#!/bin/bash
# Configuración
ZONE_ID="e70540b388ab9d20bfe27d9a31cd474b"
RECORD_ID="5d05a48c9d76c7767302442fffa096bd"
API_TOKEN="9BD-GB7PtGd5pgXTEBxnv3k1eJlJYJoIWx9HgLLs"
DOMAIN="ip.xala.dev"
# Obtener IP pública actual
IP=$(curl -s https://api.ipify.org)
# Obtener IP configurada en Cloudflare (usando la API)
DNS_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" | jq -r '.result.content')
# Comparar
if [ "$IP" != "$DNS_IP" ]; then
echo "La IP cambió: $DNS_IP$IP. Actualizando en Cloudflare..."
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"$IP\",\"ttl\":120,\"proxied\":true}" | jq
else
echo "La IP no ha cambiado: $IP"
fi
```
==LA MEJOR VERSIÓN==
```bash
#!/bin/bash
# echo "[$(date '+%Y-%m-%d %H:%M:%S')] Ejecutando actualización de IP..."
# Configuración
ZONE_ID="e70540b388ab9d20bfe27d9a31cd474b"
RECORD_ID="5d05a48c9d76c7767302442fffa096bd"
API_TOKEN="9BD-GB7PtGd5pgXTEBxnv3k1eJlJYJoIWx9HgLLs"
DOMAIN="ip.xala.dev"
# Obtener IP pública actual
IP=$(curl -s https://api.ipify.org)
# Obtener IP registrada en Cloudflare
DNS_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" | jq -r '.result.content')
# Comparar
if [ "$IP" != "$DNS_IP" ]; then
echo "La IP cambió: $DNS_IP$IP. Actualizando en Cloudflare..."
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"$IP\",\"ttl\":120,\"proxied\":true}" | jq
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] La IP no ha cambiado: $IP"
fi
# echo "[$(date '+%Y-%m-%d %H:%M:%S')] Fin de ejecución."
```
**integra ntfy, que llegue un mensaje cuando cambie la ip**
==MEJORADO, CON PROXIED FALSE==
```bash
#!/bin/bash
# Configuración
ZONE_ID="e70540b388ab9d20bfe27d9a31cd474b"
RECORD_ID="5d05a48c9d76c7767302442fffa096bd"
API_TOKEN="9BD-GB7PtGd5pgXTEBxnv3k1eJlJYJoIWx9HgLLs"
DOMAIN="ip.xala.dev"
# Obtener IP pública actual
IP=$(curl -s https://api.ipify.org)
# Obtener IP registrada actualmente en Cloudflare
DNS_RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json")
DNS_IP=$(echo "$DNS_RECORD" | jq -r '.result.content')
# validaciones
if [ -z "$IP" ]; then
# Notificación vía ntfy
# curl -d "🌎 [$(date '+%Y-%m-%d %H:%M:%S')] IP actualizada: $DNS_IP → $IP" ntfy.xala.dev/alerts
curl -d "🚨 [$(date '+%Y-%m-%d %H:%M:%S')] No se pudo obtener la IP pública." ntfy.xala.dev/alerts
exit 1
fi
if [ "$IP" != "$DNS_IP" ]; then
curl -d "🌐 La IP ha cambiado: $DNS_IP$IP. Actualizando en Cloudflare..." ntfy.xala.dev/alerts
UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
--data "{
\"type\": \"A\",
\"name\": \"$DOMAIN\",
\"content\": \"$IP\",
\"ttl\": 1,
\"proxied\": false
}")
SUCCESS=$(echo "$UPDATE_RESPONSE" | jq -r '.success')
if [ "$SUCCESS" == "true" ]; then
curl -d "🌎 [$(date '+%Y-%m-%d %H:%M:%S')] IP actualizada: $DNS_IP$IP" ntfy.xala.dev/alerts
else
curl -d "🚨 [$(date '+%Y-%m-%d %H:%M:%S')] Falló la actualización en Cloudflare." ntfy.xala.dev/alerts
fi
else
echo " [$(date '+%Y-%m-%d %H:%M:%S')] La IP no ha cambiado: $IP"
fi
```