Cloudflare
Jump to navigation
Jump to search
Cloudflare DynDNS Script[edit]
#!/bin/bash
# USO: ./ddns.sh cloud.herrerosolis.com
CF_API_TOKEN="otH3s***********************uCi3oB"
ZONE_NAME="herrerosolis.com"
RECORD_NAME="$1"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
if [ -z "$RECORD_NAME" ]; then
log "❌ Debes indicar el nombre del registro como parámetro."
log " Ejemplo: ./actualiza_dns.sh cloud.herrerosolis.com"
exit 1
fi
# Obtener IP pública
IP=$(curl -s https://ipv4.icanhazip.com)
if [[ ! $IP =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
log "❌ No se pudo obtener una IP pública válida."
exit 1
fi
log "🌐 IP pública detectada: $IP"
# Obtener Zone ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$ZONE_NAME" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" | jq -r '.result[0].id')
if [ -z "$ZONE_ID" ] || [ "$ZONE_ID" = "null" ]; then
log "❌ No se encontró el ZONE_ID para $ZONE_NAME"
exit 1
fi
# Obtener Record ID y actual IP
RECORD_INFO=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json")
RECORD_ID=$(echo "$RECORD_INFO" | jq -r '.result[0].id')
CURRENT_IP=$(echo "$RECORD_INFO" | jq -r '.result[0].content')
if [ -z "$RECORD_ID" ] || [ "$RECORD_ID" = "null" ]; then
log "❌ No se encontró el RECORD_ID para $RECORD_NAME"
exit 1
fi
log "📄 IP actual en Cloudflare: $CURRENT_IP"
if [ "$IP" = "$CURRENT_IP" ]; then
log "✅ La IP ya está actualizada. No se requiere acción."
exit 0
fi
# Actualizar el registro
RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
-H "Authorization: Bearer $CF_API_TOKEN" \
-H "Content-Type: application/json" \
--data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$IP\",\"ttl\":300,\"proxied\":false}")
SUCCESS=$(echo "$RESPONSE" | jq -r '.success')
if [ "$SUCCESS" = "true" ]; then
log "✅ Registro DNS actualizado correctamente: $RECORD_NAME → $IP"
else
log "❌ Error al actualizar el registro DNS:"
log "$RESPONSE"
fi
sudo apt install jq
sudo touch /var/log/ddns.log
sudo chown $USER /var/log/ddns.log
crontab -e
*/5 * * * * /path/to/dyndns.sh www.example.com >> /var/log/ddns.log 2>&1