Sign inSign up

bombero62/dnsupdate

By bombero62

•Updated 11 months ago

Actualiza dominios de DuckDNS, dynu y con-ip.com evitando cloudflare

Image
0

10K+

bombero62/dnsupdate repository overview

⁠dnsupdate (by @bombero62)

Contenedor Docker que actualiza dominios en DuckDNS, Dynu y Con-IP.com,
solo cuando la IP pública cambia y no pertenece a rangos bloqueados (Cloudflare o personalizados).

⁠🧩 Características

  • Detecta automáticamente la IP pública (IPv4 o IPv6).
  • Evita actualizar si la IP pertenece a Cloudflare (por ejemplo, WARP o 1.1.1.1).
  • Permite bloquear rangos adicionales definidos por el usuario.
  • Persistencia del último estado en /data/state.json.
  • Soporte simultáneo para:
    • DuckDNS
    • Dynu (autenticación con usuario/contraseña o hash SHA-256)
    • Con-IP.com

⁠⚙️ Variables de entorno

VariableRequeridaValor por defectoDescripción
DUCKDNS_TOKEN❌—Token de tu cuenta DuckDNS
DUCKDNS_DOMAINS❌—Lista de subdominios separados por coma (con o sin .duckdns.org)
DUCKDNS_BASE_URL❌https://www.duckdns.org/updateEndpoint de actualización de DuckDNS
DYNU_HOSTNAME❌—Host Dynu a actualizar (ej: tudominio.dynu.net)
DYNU_USER❌—Usuario o correo de tu cuenta Dynu
DYNU_PASS❌—Contraseña en texto plano o SHA-256 (el script la hashea automáticamente si hace falta)
DYNU_BASE_URL❌https://api.dynu.com/nic/updateEndpoint de actualización Dynu
CONIP_URL❌—URL completa para actualizar tu dominio en con-ip.com ({ip} se reemplaza por la IP actual)
INTERVAL_SECONDS❌300Intervalo (segundos) entre chequeos de cambio de IP (mínimo 300 s)
BLOCK_CLOUDFLARE❌trueSi está activado, bloquea IPs de Cloudflare
CF_IPV4_URL❌https://www.cloudflare.com/ips-v4Lista oficial de rangos IPv4 de Cloudflare
CF_IPV6_URL❌https://www.cloudflare.com/ips-v6Lista oficial de rangos IPv6 de Cloudflare
EXTRA_BLOCK_CIDRS_V4❌—Rango(s) IPv4 adicionales a bloquear (coma-separados)
EXTRA_BLOCK_CIDRS_V6❌—Rango(s) IPv6 adicionales a bloquear (coma-separados)
IP4_URL❌https://api.ipify.org?format=jsonEndpoint para obtener la IP pública IPv4
IP6_URL❌https://api64.ipify.org?format=jsonEndpoint para obtener la IP pública IPv6

⁠🚀 Uso rápido

# Construir
docker build -t bombero62/dnsupdate:latest .

# Ejecutar el contenedor
docker run -d --name dnsupdate --restart unless-stopped \
  -e DUCKDNS_TOKEN=TU_TOKEN \
  -e DUCKDNS_DOMAINS=casa,servidor \
  -e DYNU_HOSTNAME=tudominio.dynu.net \
  -e DYNU_USER=tuusuario \
  -e DYNU_PASS=tucontraseña \
  -e CONIP_URL=https://con-ip.com/update.php?token=XYZ&ip={ip} \
  -v $(pwd)/data:/data \
  bombero62/dnsupdate:latest

# Ver logs
docker logs -f dnsupdate

⁠🧱 docker-compose

Ejemplo de docker-compose.yml:

services:
  dnsupdate:
    image: bombero62/dnsupdate:latest
    container_name: dnsupdate
    restart: unless-stopped
    environment:
      - DUCKDNS_TOKEN=TU_TOKEN
      - DUCKDNS_DOMAINS=casa,servidor
      - DYNU_HOSTNAME=tudominio.dynu.net
      - DYNU_USER=tuusuario
      - DYNU_PASS=tucontraseña
      - CONIP_URL=https://con-ip.com/update.php?token=XYZ&ip={ip}
      - INTERVAL_SECONDS=600
      - BLOCK_CLOUDFLARE=true
    volumes:
      - ./data:/data

Luego:

docker compose up -d

⁠📋 Notas

  • El contenedor solo actualiza cuando la IP pública cambia respecto a la última guardada.
    No realiza actualizaciones “por tiempo” si la IP es la misma.
  • Si la IP pertenece a Cloudflare o a un rango bloqueado, no se actualiza y reintenta más tarde.
  • La última IP válida y su timestamp se guardan en /data/state.json.
  • Todos los eventos se registran en /data/update.log.

⁠🧰 Publicar en Docker Hub

docker login -u bombero62
docker build -t bombero62/dnsupdate:latest .
docker tag bombero62/dnsupdate:latest bombero62/dnsupdate:v1.1.0
docker push bombero62/dnsupdate:latest
docker push bombero62/dnsupdate:v1.1.0

⁠🇬🇧 English translation

⁠dnsupdate (by @bombero62)

Docker container that updates domains on DuckDNS, Dynu, and Con-IP.com,
only when the public IP changes and does not belong to blocked ranges (Cloudflare or custom).

⁠🧩 Features

  • Automatically detects the public IP (IPv4 or IPv6).
  • Avoids updating if the IP belongs to Cloudflare (for example, WARP or 1.1.1.1).
  • Allows blocking additional ranges defined by the user.
  • Persists the last state in /data/state.json.
  • Simultaneous support for:
    • DuckDNS
    • Dynu (authentication with user/password or SHA-256 hash)
    • Con-IP.com

⁠⚙️ Environment variables

VariableRequiredDefault valueDescription
DUCKDNS_TOKEN❌—Your DuckDNS account token
DUCKDNS_DOMAINS❌—Comma-separated list of subdomains (with or without .duckdns.org)
DUCKDNS_BASE_URL❌https://www.duckdns.org/updateDuckDNS update endpoint
DYNU_HOSTNAME❌—Dynu host to update (e.g. yourdomain.dynu.net)
DYNU_USER❌—Dynu account username or email
DYNU_PASS❌—Plain-text password or SHA-256 hash (the script will hash it if needed)
DYNU_BASE_URL❌https://api.dynu.com/nic/updateDynu update endpoint
CONIP_URL❌—Full URL to update your domain at con-ip.com ({ip} is replaced by the current IP)
INTERVAL_SECONDS❌300Interval (in seconds) between IP change checks (minimum 300 s)
BLOCK_CLOUDFLARE❌trueWhen enabled, blocks IPs from Cloudflare
CF_IPV4_URL❌https://www.cloudflare.com/ips-v4Official list of Cloudflare IPv4 ranges
CF_IPV6_URL❌https://www.cloudflare.com/ips-v6Official list of Cloudflare IPv6 ranges
EXTRA_BLOCK_CIDRS_V4❌—Additional IPv4 range(s) to block (comma-separated)
EXTRA_BLOCK_CIDRS_V6❌—Additional IPv6 range(s) to block (comma-separated)
IP4_URL❌https://api.ipify.org?format=jsonEndpoint to obtain the public IPv4
IP6_URL❌https://api64.ipify.org?format=jsonEndpoint to obtain the public IPv6

⁠🚀 Quick start

# Build
docker build -t bombero62/dnsupdate:latest .

# Run the container
docker run -d --name dnsupdate --restart unless-stopped \
  -e DUCKDNS_TOKEN=YOUR_TOKEN \
  -e DUCKDNS_DOMAINS=home,server \
  -e DYNU_HOSTNAME=yourdomain.dynu.net \
  -e DYNU_USER=youruser \
  -e DYNU_PASS=yourpassword \
  -e CONIP_URL=https://con-ip.com/update.php?token=XYZ&ip={ip} \
  -v $(pwd)/data:/data \
  bombero62/dnsupdate:latest

# View logs
docker logs -f dnsupdate

⁠🧱 docker-compose

Example docker-compose.yml:

services:
  dnsupdate:
    image: bombero62/dnsupdate:latest
    container_name: dnsupdate
    restart: unless-stopped
    environment:
      - DUCKDNS_TOKEN=YOUR_TOKEN
      - DUCKDNS_DOMAINS=home,server
      - DYNU_HOSTNAME=yourdomain.dynu.net
      - DYNU_USER=youruser
      - DYNU_PASS=yourpassword
      - CONIP_URL=https://con-ip.com/update.php?token=XYZ&ip={ip}
      - INTERVAL_SECONDS=600
      - BLOCK_CLOUDFLARE=true
    volumes:
      - ./data:/data

Then:

docker compose up -d

⁠📋 Notes

  • The container only updates when the public IP changes compared to the last stored one.
    It does not perform time-based updates if the IP is the same.
  • If the IP belongs to Cloudflare or any blocked range, no update is performed and it will retry later.
  • The last valid IP and its timestamp are stored in /data/state.json.
  • All events are logged to /data/update.log.

⁠🧰 Publish to Docker Hub

docker login -u bombero62
docker build -t bombero62/dnsupdate:latest .
docker tag bombero62/dnsupdate:latest bombero62/dnsupdate:v1.1.0
docker push bombero62/dnsupdate:latest
docker push bombero62/dnsupdate:v1.1.0

Tag summary

Content type

Image

Digest

sha256:30a720ca3…

Size

24.1 MB

Last updated

11 months ago

docker pull bombero62/dnsupdate