Actualització Dinàmica del DNS

Cicle formatiu: CFGM Sistemes Microinformàtics i Xarxes (SMX) / CFGS Administració de sistemes informàtics en xarxa (ASIX)

Mòdul: 0227 — Serveis de xarxa / 0375 - Serveis de xarxa i Internet

Sistema operatiu: Ubuntu Server 26.04 LTS


1. Introducció

Què és el DDNS?

DNS Dinàmic (DDNS) és el mecanisme que permet actualitzar automàticament els registres DNS quan un client DHCP obté (o allibera) una adreça IP. D’aquesta manera, la resolució de noms sempre reflecteix l’estat real de les assignacions DHCP, sense intervenció manual de l’administrador.

Sense DDNS:

Amb DDNS:

kea-dhcp-ddns i el servidor D2

El paquet kea-dhcp-ddns proporciona el servei kea-dhcp-ddns, conegut informalment com a D2. Aquest servei actua com a intermediari entre els servidors DHCP de Kea (kea-dhcp4 i kea-dhcp6) i el servidor DNS, implementant el protocol DDNS definit a l’RFC 2136.

El flux de treball és el següent:

Flux de treball

Els servidors DHCP generen peticions d’actualització anomenades NameChangeRequests (NCR) quan es produeix un esdeveniment de concessió (nova assignació, renovació o alliberament), i les envien al D2, que les processa i actualitza el DNS corresponent.

Estàndards implementats

RFC Descripció
RFC 2136 DNS dinàmic (actualitzacions)
RFC 2845 TSIG (autenticació de transaccions)
RFC 4033–4035 DNSSEC
RFC 4703 Resolució de conflictes DHCID
RFC 4361 Client ID en entorns dual-stack

2. Instal·lació

💡
Nota

Prerequisits: Kea DHCP instal·lat i funcionant (serveis kea-dhcp4 o kea-dhcp6). Es recomana tenir BIND9 configurat com a servidor DNS autoritzat a la xarxa.

2.1. Paquets ISC oficials

ISC publica paquets oficials actualitzats per a Debian i Ubuntu a través de dipòsits propis. Aquests paquets inclouen sempre les últimes correccions de seguretat i suport per a funcionalitats com DNSTAP, que no sempre estan disponibles als paquets de distribució.

# Afegeix els dipòsits ISC stable per a Ubuntu
sudo add-apt-repository ppa:isc/bind
💡
Nota

En el moment de fer aquest manual maig-juny de 2026 encara no estan disponibles els paquets de la versió 9.20.23 de BIND per a Ubuntu 26.04. Per aquest motiu s’utilitza la versió 9.20.18 inclosa als dipòsits d’Ubuntu.

2.2. Actualitza el sistema

sudo apt update

2.3. Instal·la

Instal·la del paquet complet de Kea (inclou D2)

sudo apt install kea

O bé, instal·la únicament el servei D2

sudo apt install kea-dhcp-ddns-server

La instal·lació del paquet kea inclou automàticament:

2.4. Verifica la instal·lació

Comprova la versió instal·lada

sudo kea-dhcp-ddns -v
3.0.3

Comprova l’estat del servei

sudo systemctl status kea-dhcp-ddns-server
● kea-dhcp-ddns-server.service - Kea DDNS Service
     Loaded: loaded (/usr/lib/systemd/system/kea-dhcp-ddns-server.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-06-30 12:52:04 UTC; 1h 38min ago
 Invocation: 1632bd5a3ae7497c9dce73cac3b7f13f
       Docs: man:kea-dhcp-ddns(8)
   Main PID: 1286 (kea-dhcp-ddns)
      Tasks: 5 (limit: 1718)
     Memory: 3.4M (peak: 3.9M)
        CPU: 236ms
     CGroup: /system.slice/kea-dhcp-ddns-server.service
             └─1286 /usr/sbin/kea-dhcp-ddns -c /etc/kea/kea-dhcp-ddns.conf

Mostra els logs

sudo journalctl -u kea-dhcp-ddns-server -f

3. Arquitectura i funcionament intern

Components principals de D2

Arquitectura i funcionament de D2

NameChangeRequests (NCR)

Cada vegada que kea-dhcp4 o kea-dhcp6 produeix un esdeveniment de concessió, construeix una NCR i l’envia al D2 per UDP (port 53001 per defecte). Cada NCR conté:

Catàleg de dominis DDNS

D2 manté dos catàlegs de dominis DNS als quals pot enviar actualitzacions:

D2 selecciona el domini més específic que coincideix amb el FQDN o l’adreça IP de la NCR. Per exemple, si el FQDN és pc01.aula01.thos.local. i hi ha definits aula01.thos.local. i thos.local., D2 triarà el primer perquè és més específic.

4. Configuració

4.1. Fitxer de configuració

El fitxer principal de configuració de D2 és:

/etc/kea/kea-dhcp-ddns.conf

La seva estructura JSON bàsica és:

{
    "DhcpDdns": {
        "ip-address": "127.0.0.1",
        "port": 53001,
        "dns-server-timeout": 500,
        "ncr-protocol": "UDP",
        "ncr-format": "JSON",
        "tsig-keys": [ ],
        "forward-ddns": {
            "ddns-domains": [ ]
        },
        "reverse-ddns": {
            "ddns-domains": [ ]
        },
        "loggers": [
            {
                "name": "kea-dhcp-ddns",
                "output-options": [
                    {
                        "output": "/var/log/kea/kea-ddns.log"
                    }
                ],
                "severity": "INFO"
            }
        ]
    }
}

4.2. Paràmetres globals

Paràmetre Valor per defecte Descripció
ip-address 127.0.0.1 Adreça IP on D2 escolta les NCR
port 53001 Port on D2 escolta les NCR
dns-server-timeout 500 Temps màxim d’espera (ms) per resposta del servidor DNS
ncr-protocol UDP Protocol de comunicació amb els servidors DHCP
ncr-format JSON Format dels paquets NCR
🔴
Precaució

S’ha d’usar únicament 127.0.0.1 (loopback) per a ip-address en entorns de producció. Si s’exposa D2 a la xarxa, un atacant podria enviar NCR falses i manipular els registres DNS.

4.3. Control socket

Per poder gestionar D2 des de l’API de control de Kea:

"DhcpDdns": {
    "control-sockets": [
        {
            "socket-type": "unix",
            "socket-name": "/run/kea/kea-ddns-ctrl-socket"
        }
    ]
}

Des de Kea 2.7.2 també es pot usar HTTP/HTTPS:

"control-sockets": [
    {
        "socket-type": "http",
        "socket-address": "127.0.0.1",
        "socket-port": 8001
    }
]

4.4. Claus TSIG

TSIG (Transaction SIGnature, RFC 2845) és el mecanisme d’autenticació de les actualitzacions DNS. Permet que D2 signi digitalment les peticions d’actualització que envia al servidor DNS, i que el DNS verifiqui que provenen d’una font autoritzada.

Primer, cal generar la clau al servidor DNS (BIND9):

tsig-keygen -a hmac-sha256 kea-ddns-key

La sortida serà similar a:

key "kea-ddns-key" {
    algorithm hmac-sha256;
    secret "qFjHMdvgF/u2s7KgPKyywoyIfODsUGuEdH28VvROSBA=";
};

A continuació, defineix la clau al fitxer de D2:

sudo nano /etc/kea/kea-dhcp-ddns.conf
  "tsig-keys": [
      {
         "name": "kea-ddns-key",
         "algorithm": "HMAC-SHA256",
         "secret": "qFjHMdvgF/u2s7KgPKyywoyIfODsUGuEdH28VvROSBA="
      }
  ],

Paràmetres de cada clau TSIG:

Paràmetre Descripció
name Nom únic de la clau (ha de coincidir amb el nom al DNS)
algorithm Algorisme: HMAC-MD5, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, HMAC-SHA512
secret Secret compartit en Base64
digest-bits (Opcional) Bits del resum; 0 = màxim per l’algorisme

4.5. Forward DDNS (registres directes)

La secció forward-ddns defineix els dominis per als quals D2 actualitzarà registres A i AAAA:

"forward-ddns": {
    "ddns-domains": [
        {
            "name": "thos.local.",
            "key-name": "kea-ddns-key",
            "dns-servers": [
                {
                    "ip-address": "192.168.1.1",
                    "port": 53
                }
            ]
        }
    ]
},

Paràmetres d’un domini DDNS:

Paràmetre Descripció
name Nom del domini DNS (ha d’acabar en punt)
key-name Nom de la clau TSIG a usar (opcional si no s’usa autenticació)
dns-servers Llista de servidors DNS autoritzats per al domini

Cada servidor DNS pot tenir la seva pròpia clau TSIG:

"dns-servers": [
    {
        "ip-address": "192.168.1.1",
        "port": 53,
        "key-name": "clau-servidor-primari"
    }
]

4.6. Reverse DDNS (registres inversos)

La secció reverse-ddns defineix els dominis per als quals D2 actualitzarà registres PTR:

"reverse-ddns": {
    "ddns-domains": [
        {
            "name": "1.168.192.in-addr.arpa.",
            "key-name": "kea-ddns-key",
            "dns-servers": [
                {
                    "ip-address": "192.168.1.1",
                    "port": 53
                }
            ]
        }
    ]
}

Per a IPv6 s’usa el domini ip6.arpa.:

{
    "name": "0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.",
    "key-name": "kea-ddns-key",
    "dns-servers": [
        { "ip-address": "2001:db8::1" }
    ]
}

5. Configuració del servidor DHCP (kea-dhcp4)

Perquè el servidor DHCP4 enviï actualitzacions al D2, cal afegir la secció dhcp-ddns al fitxer /etc/kea/kea-dhcp4.conf:

sudo nano /etc/kea/kea-dhcp4.conf
{
    "Dhcp4": {
        "dhcp-ddns": {
            "enable-updates": true,
            "server-ip": "127.0.0.1",
            "server-port": 53001,
            "ncr-protocol": "UDP",
            "ncr-format": "JSON"
        },
        "ddns-send-updates": true,
        "ddns-qualifying-suffix": "thos.local",
        "ddns-override-client-update": true,
        "ddns-override-no-update": false,
        "ddns-replace-client-name": "when-not-present",
        "ddns-update-on-renew": true,
        "ddns-use-conflict-resolution": true,
    }
}

Opcions DDNS del servidor DHCP

Opció Valor per defecte Descripció
ddns-send-updates true Activa l’enviament d’actualitzacions DNS
ddns-qualifying-suffix "" Sufix de domini a afegir als noms curts dels clients
ddns-override-client-update false Si és true, D2 actualitza el DNS encara que el client demani fer-ho ell mateix
ddns-override-no-update false Si és true, D2 actualitza el DNS encara que el client hagi demanat que no es faci
ddns-replace-client-name never Quan substituir el nom del client: never, always, when-not-present, when-present
ddns-update-on-renew false Si és true, actualitza el DNS en cada renovació de concessió
ddns-use-conflict-resolution true Activa la resolució de conflictes (RFC 4703)
ddns-ttl-percent (no definit) TTL dels registres DNS com a percentatge del temps de concessió

6. Configuració de BIND9 per acceptar actualitzacions

Prepara les zones

Al fitxer de configuració de BIND9 (/etc/bind/named.conf.local), cal permetre les actualitzacions dinàmiques a les zones corresponents:

sudo nano /etc/bind/named.conf.local
// Zona directa
zone "thos.local" {
    type master;
    file "/var/lib/bind/zones/db.thos.local";
    allow-update { key kea-ddns-key; };
};

// Zona inversa
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/var/lib/bind/zones/db.192.168.1";
    allow-update { key kea-ddns-key; };
};

Inclou la clau TSIG a BIND9

Crea un fitxer amb la configuració de la clau:

sudo nano /etc/bind/kea-ddns-key.conf
key "kea-ddns-key" {
    algorithm hmac-sha256;
    secret "qFjHMdvgF/u2s7KgPKyywoyIfODsUGuEdH28VvROSBA=";
};

Modifica el propietari del fitxer:

sudo chown root:bind /etc/bind/kea-ddns-key.conf

Restringeix els permisos:

sudo chmod 640 /etc/bind/kea-ddns-key.conf

Inclou el fitxer de la clau TSIG a la configuració de BIND9:

sudo nano /etc/bind/named.conf.local

Afegeix al principi del fitxer:

include "/etc/bind/kea-ddns-key.conf";

Verifica la sintaxi:

sudo named-checkconf

Carrega la nova configuració:

sudo systemctl reload bind9

Permisos dels fitxers de zona

BIND9 necessita permís d’escriptura als fitxers de zona per poder aplicar les actualitzacions:

sudo chown bind:bind /var/lib/bind/zones/db.thos.local
sudo chown bind:bind /var/lib/bind/zones/db.192.168.1
sudo chmod 640 /var/lib/bind/zones/db.thos.local
sudo chmod 640 /var/lib/bind/zones/db.192.168.1

7. Exemple complet de configuració

kea-dhcp-ddns.conf

{
    "DhcpDdns": {
        "ip-address": "127.0.0.1",
        "port": 53001,
        "dns-server-timeout": 500,
        "ncr-protocol": "UDP",
        "ncr-format": "JSON",

        "control-sockets": [
            {
                "socket-type": "unix",
                "socket-name": "/run/kea/kea-ddns-ctrl-socket"
            }
        ],

        "tsig-keys": [
            {
                "name": "kea-ddns-key",
                "algorithm": "HMAC-SHA256",
                "secret": "oFdBGvLuL3jkm3A8G1pVFg=="
            }
        ],

        "forward-ddns": {
            "ddns-domains": [
                {
                    "name": "thos.local.",
                    "key-name": "kea-ddns-key",
                    "dns-servers": [
                        {
                            "ip-address": "192.168.1.1",
                            "port": 53
                        }
                    ]
                }
            ]
        },

        "reverse-ddns": {
            "ddns-domains": [
                {
                    "name": "1.168.192.in-addr.arpa.",
                    "key-name": "kea-ddns-key",
                    "dns-servers": [
                        {
                            "ip-address": "192.168.1.1",
                            "port": 53
                        }
                    ]
                }
            ]
        },

        "loggers": [
            {
                "name": "kea-dhcp-ddns",
                "output-options": [
                    {
                        "output": "/var/log/kea/kea-ddns.log",
                        "maxsize": 2048000,
                        "maxver": 4
                    }
                ],
                "severity": "INFO",
                "debuglevel": 0
            }
        ]
    }
}

8. Gestió del servei

Iniciar el servei

sudo systemctl start kea-dhcp-ddns-server

Aturar el servei

sudo systemctl stop kea-dhcp-ddns-server

Reiniciar

sudo systemctl restart kea-dhcp-ddns-server

Habilitar a l’arrencada

sudo systemctl enable kea-dhcp-ddns-server

Recarregar la configuració sense reiniciar

sudo systemctl reload kea-dhcp-ddns-server

Comprovar la sintaxi del fitxer de configuració

sudo kea-dhcp-ddns -t /etc/kea/kea-dhcp-ddns.conf

Resposta esperada:

2026-06-30 15:24:24.153 INFO  [kea-dhcp-ddns.dctl/21110.140139196241856] DCTL_CONFIG_CHECK_COMPLETE server has completed configuration check: listening on 127.0.0.1, port 53001, using UDP, result: success(0), text=Configuration check successful

Ordres de l’API de control

D2 admet les ordres següents a través del control socket:

⚠️
Avís

Cal tenir socat instal·lat: sudo apt install socat

# Veure la configuració actual
echo '{ "command": "config-get" }' | \
    sudo socat UNIX:/run/kea/kea-ddns-ctrl-socket -

# Recarregar la configuració
echo '{ "command": "config-reload" }' | \
    sudo socat UNIX:/run/kea/kea-ddns-ctrl-socket -

# Aturar el servidor de manera ordenada
echo '{ "command": "shutdown", "arguments": { "type": "normal" } }' | \
    sudo socat UNIX:/run/kea/kea-ddns-ctrl-socket -

# Consultar estadístiques
echo '{ "command": "statistic-get-all" }' | \
    sudo socat UNIX:/run/kea/kea-ddns-ctrl-socket -

Tipus de parada controlada (shutdown):

Tipus Descripció
normal Atura la cua i finalitza les transaccions en curs (valor per defecte)
drain_first Atura la cua, però processa totes les NCR pendents fins que la cua és buida
now Atura el servidor immediatament

9. Resolució de conflictes (RFC 4703)

D2 implementa la resolució de conflictes definida a l’RFC 4703. El mecanisme usa el registre de recurs DHCID (DHCID RR), que mapeja un FQDN amb l’identificador del client DHCP que el posseeix. Això evita que dos clients diferents reclamin el mateix nom DNS simultàniament.

Funcionament:

  1. Quan D2 afegeix un registre A per a pc01.thos.local, també afegeix un registre DHCID que identifica el client.
  2. Si un altre client intenta registrar el mateix FQDN, D2 comprova el DHCID i el rebutja si no coincideix amb el client que posseeix el nom.

La resolució de conflictes s’activa i desactiva des del servidor DHCP amb el paràmetre ddns-use-conflict-resolution. Quan es desactiva, D2 encara crea registres DHCID, però no els fa servir per aplicar el control de propietat.

⚠️
Avís

Desactivar la resolució de conflictes pot provocar col·lisions de noms DNS en xarxes amb molts clients. Únicament es recomana en escenaris molt controlats.

10. Estadístiques

Des de Kea 2.0, D2 exposa estadístiques de funcionament consultables via l’API de control.

Estadístiques de NCR

Estadística Descripció
ncr-received Total de NCR rebudes
ncr-invalid NCR invàlides rebudes
ncr-error Errors processant NCR

Estadístiques d’actualització DNS

Estadística Descripció
update-sent Peticions d’actualització enviades al DNS
update-signed Actualitzacions signades amb TSIG
update-unsigned Actualitzacions sense signatura
update-success Actualitzacions completades amb èxit
update-timeout Actualitzacions fallides per temps d’espera
update-error Actualitzacions fallides per error

Per a cada clau TSIG definida, D2 manté estadístiques específiques (update-sent[nom-clau], etc.).

11. Diagnosi i resolució de problemes

Comprova que D2 rep les NCR

Activa el mode debug temporalment

sudo journalctl -u kea-dhcp-ddns-server -f

O reinicia amb el mode verbose

sudo kea-dhcp-ddns -c /etc/kea/kea-dhcp-ddns.conf -d

Verifica que el DNS accepta les actualitzacions

# Prova manual d'actualització DDNS amb nsupdate
sudo nsupdate -k /etc/bind/kea-ddns-key.conf
> server 192.168.1.1
> zone thos.local.
> update add prova.thos.local. 300 A 192.168.1.99
> send
> quit

Verifica que el registre s’ha creat

Consulta directa amb dig

dig @192.168.1.1 prova.thos.local. A

Resposta esperada:

; <<>> DiG 9.20.18-1ubuntu2.1-Ubuntu <<>> @192.168.1.1 prova.thos.local. A
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49500
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: a9e519268ca88aa5010000006a44e18b8dff0543faf4b13f (good)
;; QUESTION SECTION:
;prova.thos.local.      IN  A

;; ANSWER SECTION:
prova.thos.local.   300 IN  A   192.168.1.99

;; Query time: 1 msec
;; SERVER: 192.168.1.1#53(192.168.1.1) (UDP)
;; WHEN: Wed Jul 01 09:44:43 UTC 2026
;; MSG SIZE  rcvd: 89

Comprova que s’ha creat el journal

ls -la /var/lib/bind/zones/db.thos.local.jnl

Resposta esperada:

-rw-r--r-- 1 bind bind 730 Jul  1 09:42 /var/lib/bind/zones/db.thos.local.jnl

Contingut human-readable del journal:

sudo named-journalprint /var/lib/bind/zones/db.thos.local.jnl

Resposta esperada:

del thos.local.     86400   IN  SOA server.thos.local. admin.thos.local. 2026061601 3600 900 604800 86400
add thos.local.     86400   IN  SOA server.thos.local. admin.thos.local. 2026061602 3600 900 604800 86400
add prova.thos.local.   300 IN  A   192.168.1.99
💡
Nota

De moment els canvis viuen només al .jnl (format binari, transaccional). BIND els bolcarà al fitxer de text db.thos.local quan faci l’ixfr-from-differences flush (per defecte cada hora, o en aturar named netament).

Errors habituals

Símptoma Causa probable Solució
D2 no rep NCR enable-updates: false al dhcp4 Activar enable-updates
TSIG error al DNS Clau TSIG incorrecta o desincronitzada Regenerar i sincronitzar la clau
REFUSED del DNS allow-update no inclou la clau o IP Revisar la configuració de BIND9
Registres PTR no s’actualitzen Falta el domini invers a reverse-ddns Afegir el domini in-addr.arpa
DHCP_DDNS_ALREADY_RUNNING Fitxer PID orfe d’un crash anterior Eliminar el fitxer PID manualment

Consultar els logs

Logs en temps real

sudo journalctl -u kea-dhcp-ddns-server -f

Logs des del fitxer (si s’ha configurat)

sudo tail -f /var/log/kea/kea-ddns.log

Comprovar actualitzacions exitoses

sudo grep "DHCP_DDNS_ADD_SUCCEEDED" /var/log/kea/kea-ddns.log

Comprovar errors

sudo grep "ERROR\|WARN" /var/log/kea/kea-ddns.log

Verificar registres DNS actualitzats

Comprovar registre directe (A)

dig @192.168.1.1 pc01.thos.local A

Comprovar registre invers (PTR)

dig @192.168.1.1 -x 192.168.1.50

Comprovar registre DHCID

dig @192.168.1.1 pc01.thos.local DHCID

12. Configuració a Stork

Si utilitzes Stork com a tauler de control gràfic dels serveis has de fer unes modificacions al fitxer /etc/bind/named.conf.options

sudo nano /etc/bind/named.conf.options

Dins d’options habilita la transferència de zones

    allow-transfer { 127.0.0.1; };

Després del tancament d’options, al final del fitxer, afegeix:

statistics-channels {
    inet 127.0.0.1 port 8053 allow { 127.0.0.1; };
};

Verifica la sintaxi del fitxer /etc/bind/named.conf.options

sudo named-checkconf

Aplica la nova configuració

sudo rndc reload

13. Tauler de control d’Stork

DHCP

Zones del DNS

Dimonis dels serveis

Màquines

Versions del programari

Monitoratge d’esdeveniments

Verificadors de configuració

Configuracions

Usuaris

14. Consideracions de seguretat

Ús de TSIG: Sempre s’han d’autenticar les actualitzacions DDNS amb claus TSIG. Sense autenticació, qualsevol màquina de la xarxa podria modificar els registres DNS.

Restricció de l’adreça d’escolta: Mantenir D2 escoltant únicament a 127.0.0.1 excepte en casos molt específics on sigui necessari separar físicament el servei DHCP del servei D2.

Permisos dels fitxers de claus: Les claus TSIG no han de ser llegibles per usuaris no privilegiats:

sudo chmod 640 /etc/bind/kea-ddns-key.conf
sudo chown root:bind /etc/bind/kea-ddns-key.conf

Rotació de claus: Es recomana rotar les claus TSIG periòdicament (cada 6–12 mesos) per reduir l’impacte d’una possible compromissió.

15. Referència ràpida

Fitxers importants

Fitxer Descripció
/etc/kea/kea-dhcp-ddns.conf Configuració del servei D2
/etc/kea/kea-dhcp4.conf Configuració de kea-dhcp4 (secció dhcp-ddns)
/var/log/kea/kea-ddns.log Log de D2 (si es configura)
/run/kea/kea-ddns-ctrl-socket Socket de control UNIX
/run/kea/kea-dhcp-ddns.pid Fitxer PID del procés

Ports per defecte

Port Protocol Descripció
53001 UDP D2 escolta les NCR dels servidors DHCP
53 UDP/TCP D2 envia actualitzacions al servidor DNS

16. Recursos addicionals

Versions d’aquest document

Domini Públic (CC0)