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
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:
192.168.1.50 al host pc01.pc01 no és resoluble per
nom.Amb DDNS:
192.168.1.50 al host pc01.pc01.thos.local → 192.168.1.50.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:
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.
| 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 |
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/bindEn 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.
sudo apt updateInstal·la del paquet complet de Kea (inclou D2)
sudo apt install keaO bé, instal·la únicament el servei D2
sudo apt install kea-dhcp-ddns-serverLa instal·lació del paquet kea inclou
automàticament:
kea-dhcp4-server — servidor DHCP per a IPv4kea-dhcp6-server — servidor DHCP per a IPv6kea-ctrl-agent — API REST de controlkea-dhcp-ddns-server — servei D2 (DDNS)Comprova la versió instal·lada
sudo kea-dhcp-ddns -v3.0.3Comprova 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.confMostra els logs
sudo journalctl -u kea-dhcp-ddns-server -f
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é:
CHG_ADD) o eliminació
(CHG_REMOVE)D2 manté dos catàlegs de dominis DNS als quals pot enviar actualitzacions:
A / AAAA (nom → IP)PTR (IP → nom)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.
El fitxer principal de configuració de D2 és:
/etc/kea/kea-dhcp-ddns.confLa 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"
}
]
}
}| 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 |
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.
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
}
]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-keyLa 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 |
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"
}
]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" }
]
}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,
}
}| 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ó |
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; };
};
Crea un fitxer amb la configuració de la clau:
sudo nano /etc/bind/kea-ddns-key.confkey "kea-ddns-key" {
algorithm hmac-sha256;
secret "qFjHMdvgF/u2s7KgPKyywoyIfODsUGuEdH28VvROSBA=";
};
Modifica el propietari del fitxer:
sudo chown root:bind /etc/bind/kea-ddns-key.confRestringeix els permisos:
sudo chmod 640 /etc/bind/kea-ddns-key.confInclou el fitxer de la clau TSIG a la configuració de BIND9:
sudo nano /etc/bind/named.conf.localAfegeix al principi del fitxer:
include "/etc/bind/kea-ddns-key.conf";
Verifica la sintaxi:
sudo named-checkconfCarrega la nova configuració:
sudo systemctl reload bind9BIND9 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{
"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
}
]
}
}Iniciar el servei
sudo systemctl start kea-dhcp-ddns-serverAturar el servei
sudo systemctl stop kea-dhcp-ddns-serverReiniciar
sudo systemctl restart kea-dhcp-ddns-serverHabilitar a l’arrencada
sudo systemctl enable kea-dhcp-ddns-serverRecarregar la configuració sense reiniciar
sudo systemctl reload kea-dhcp-ddns-serverComprovar la sintaxi del fitxer de configuració
sudo kea-dhcp-ddns -t /etc/kea/kea-dhcp-ddns.confResposta 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 successfulD2 admet les ordres següents a través del control socket:
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 |
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:
A per a pc01.thos.local, també afegeix un registre DHCID que identifica el client.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.
Desactivar la resolució de conflictes pot provocar col·lisions de noms DNS en xarxes amb molts clients. Únicament es recomana en escenaris molt controlats.
Des de Kea 2.0, D2 exposa estadístiques de funcionament consultables via l’API de control.
| Estadística | Descripció |
|---|---|
ncr-received |
Total de NCR rebudes |
ncr-invalid |
NCR invàlides rebudes |
ncr-error |
Errors processant NCR |
| 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.).
Activa el mode debug temporalment
sudo journalctl -u kea-dhcp-ddns-server -fO reinicia amb el mode verbose
sudo kea-dhcp-ddns -c /etc/kea/kea-dhcp-ddns.conf -d# 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
> quitVerifica que el registre s’ha creat
Consulta directa amb dig
dig @192.168.1.1 prova.thos.local. AResposta 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: 89Comprova que s’ha creat el journal
ls -la /var/lib/bind/zones/db.thos.local.jnlResposta esperada:
-rw-r--r-- 1 bind bind 730 Jul 1 09:42 /var/lib/bind/zones/db.thos.local.jnlContingut human-readable del journal:
sudo named-journalprint /var/lib/bind/zones/db.thos.local.jnlResposta 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.99De 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).
| 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 |
Logs en temps real
sudo journalctl -u kea-dhcp-ddns-server -fLogs des del fitxer (si s’ha configurat)
sudo tail -f /var/log/kea/kea-ddns.logComprovar actualitzacions exitoses
sudo grep "DHCP_DDNS_ADD_SUCCEEDED" /var/log/kea/kea-ddns.logComprovar errors
sudo grep "ERROR\|WARN" /var/log/kea/kea-ddns.logComprovar registre directe (A)
dig @192.168.1.1 pc01.thos.local AComprovar registre invers (PTR)
dig @192.168.1.1 -x 192.168.1.50Comprovar registre DHCID
dig @192.168.1.1 pc01.thos.local DHCIDSi 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.optionsDins 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-checkconfAplica la nova configuració
sudo rndc reload
Ú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.confRotació de claus: Es recomana rotar les claus TSIG periòdicament (cada 6–12 mesos) per reduir l’impacte d’una possible compromissió.
| 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 |
| Port | Protocol | Descripció |
|---|---|---|
53001 |
UDP | D2 escolta les NCR dels servidors DHCP |
53 |
UDP/TCP | D2 envia actualitzacions al servidor DNS |