Post

Cloudflare DDNS y NetworkManager OpenVPN

Cloudflare DDNS y NetworkManager OpenVPN

Cloudflare DDNS y NetworkManager OpenVPN

Este post cubre un patron para consultar registros DNS en Cloudflare, comparar la IP publica actual y actualizar perfiles OpenVPN gestionados por NetworkManager.

Modificar un perfil con nmcli connection modify toca la configuracion guardada por NetworkManager. Antes de aplicarlo, revisa el valor actual con nmcli connection show "$NM_CONNECTION" y guarda una copia o export del perfil. Si la VPN ya usa un FQDN estable, probablemente no necesites cambiar el remote.

Variables

1
2
3
4
CLOUDFLARE_API_TOKEN="<CLOUDFLARE_API_TOKEN>"
ZONE_ID="<ZONE_ID>"
FQDN="vpn.example.net"
NM_CONNECTION="<VPN_CONNECTION>"

IP publica actual

1
ip_actual="$(curl -fsS https://api.ipify.org)"

IP publicada en Cloudflare

1
2
3
4
5
ip_dns="$(curl -fsS \
  -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
  -H "Content-Type: application/json" \
  "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=A&name=$FQDN" \
  | jq -r '.result[0].content')"

Actualizar perfil OpenVPN

1
2
nmcli connection modify "$NM_CONNECTION" +vpn.data "remote=$ip_dns"
nmcli connection reload

Patron para varios perfiles

1
2
3
4
for conexion in "<VPN_1>" "<VPN_2>" "<VPN_3>"; do
  nmcli connection modify "$conexion" +vpn.data "remote=$ip_dns"
done
nmcli connection reload

Modo dry-run

1
2
printf 'IP publica: %s\nIP DNS: %s\n' "$ip_actual" "$ip_dns"
printf 'Actualizaria %s con remote=%s\n' "$NM_CONNECTION" "$ip_dns"

Recomendaciones

  • Usar tokens Cloudflare limitados a la zona DNS necesaria.
  • No usar X-Auth-Key global si se puede usar Authorization: Bearer.
  • Guardar tokens en variables de entorno o fichero .env con permisos 600.
  • Añadir logs y salida diferenciada para cambios/no cambios.

Script relacionado

libra_scripts amplia este patron con un orquestador que detecta cambios de IP publica, actualiza varios registros A en Cloudflare y regenera el perfil cliente OpenVPN.

Patron multi-registro

1
2
3
4
5
6
7
for record in cloud docs meet vpn; do
  fqdn="${record}.example.net"
  curl -fsS -X PUT "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records/<RECORD_ID>" \
    -H "Authorization: Bearer <CLOUDFLARE_API_TOKEN>" \
    -H 'Content-Type: application/json' \
    --data "{\"type\":\"A\",\"name\":\"${fqdn}\",\"content\":\"${ip_actual}\",\"ttl\":1,\"proxied\":true}"
done
This post is licensed under CC BY 4.0 by the author.