# 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:

- El servidor DHCP assigna `192.168.1.50` al host `pc01`.
- El servidor DNS no en sap res: `pc01` no és resoluble per nom.

Amb DDNS:

- El servidor DHCP assigna `192.168.1.50` al host `pc01`.
- El servei D2 actualitza el DNS: `pc01.thos.local → 192.168.1.50`.
- La resolució directa i inversa funcionen automàticament.

## 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](https://datatracker.ietf.org/doc/html/rfc2136).

El flux de treball és el següent:

![Flux de treball](https://proferamon.com/tic/imatges/ddns/ddns11.png)

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ó

> [!NOTE]
> **Prerequisits:** [Kea DHCP](https://proferamon.com/tic/kea.html) instal·lat i funcionant (serveis `kea-dhcp4` o `kea-dhcp6`). Es recomana tenir [BIND9](https://proferamon.com/tic/dns.html) 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ó.

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

> [!NOTE]
> 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

```bash
sudo apt update
```

## 2.3. Instal·la

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

```bash
sudo apt install kea
```

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

```bash
sudo apt install kea-dhcp-ddns-server
```

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

- `kea-dhcp4-server` — servidor DHCP per a IPv4
- `kea-dhcp6-server` — servidor DHCP per a IPv6
- `kea-ctrl-agent` — API REST de control
- `kea-dhcp-ddns-server` — servei D2 (DDNS)

## 2.4. Verifica la instal·lació

Comprova la versió instal·lada

```bash
sudo kea-dhcp-ddns -v
```

```ini
3.0.3
```

Comprova l'estat del servei

```bash
sudo systemctl status kea-dhcp-ddns-server
```

```ini
● 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

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

# 3. Arquitectura i funcionament intern

## Components principals de D2

![Arquitectura i funcionament de D2](https://proferamon.com/tic/imatges/ddns/ddns10.png)

## 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é:

- Tipus de canvi: addició (`CHG_ADD`) o eliminació (`CHG_REMOVE`)
- FQDN del client
- Adreça IP assignada
- Si cal actualitzar el DNS directe (forward), l'invers (reverse) o tots dos
- Mode de resolució de conflictes

## Catàleg de dominis DDNS

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

- **Forward DDNS domains** — per actualitzar registres `A` / `AAAA` (nom → IP)
- **Reverse DDNS domains** — per actualitzar registres `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.

# 4. Configuració

## 4.1. Fitxer de configuració

El fitxer principal de configuració de D2 és:

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

La seva estructura JSON bàsica és:

```json
{
    "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 |

> [!CAUTION]
> 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:

```json
"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:

```json
"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):

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

La sortida serà similar a:

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

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

```bash
sudo nano /etc/kea/kea-dhcp-ddns.conf
```

```nano
  "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`:

```json
"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:

```json
"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`:

```json
"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.`:

```json
{
    "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`:

```bash
sudo nano /etc/kea/kea-dhcp4.conf
```

```json
{
    "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:

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

```nano
// 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:

```bash
sudo nano /etc/bind/kea-ddns-key.conf
```

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

Modifica el propietari del fitxer:

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

Restringeix els permisos:

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

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

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

Afegeix al principi del fitxer:

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

Verifica la sintaxi:

```bash
sudo named-checkconf
```

Carrega la nova configuració:

```bash
sudo systemctl reload bind9
```

## Permisos dels fitxers de zona

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

```bash
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

```json
{
    "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

```bash
sudo systemctl start kea-dhcp-ddns-server
```

Aturar el servei

```bash
sudo systemctl stop kea-dhcp-ddns-server
```

Reiniciar

```bash
sudo systemctl restart kea-dhcp-ddns-server
```

Habilitar a l'arrencada

```bash
sudo systemctl enable kea-dhcp-ddns-server
```

Recarregar la configuració sense reiniciar

```bash
sudo systemctl reload kea-dhcp-ddns-server
```

Comprovar la sintaxi del fitxer de configuració

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

Resposta esperada:

```ini
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:

> [!WARNING]
> Cal tenir `socat` instal·lat: `sudo apt install socat`

```bash
# 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.

> [!WARNING]
> 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

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

O reinicia amb el mode verbose

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

## Verifica que el DNS accepta les actualitzacions

```bash
# 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
 
```bash
dig @192.168.1.1 prova.thos.local. A
```

Resposta esperada:

```ini
; <<>> 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

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

Resposta esperada:

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

Contingut human-readable del journal:

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

Resposta esperada:

```ini
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
```

> [!NOTE]
> 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

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

Logs des del fitxer (si s'ha configurat)

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

Comprovar actualitzacions exitoses

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

Comprovar errors

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

## Verificar registres DNS actualitzats

Comprovar registre directe (A)

```bash
dig @192.168.1.1 pc01.thos.local A
```

Comprovar registre invers (PTR)

```bash
dig @192.168.1.1 -x 192.168.1.50
```

Comprovar registre DHCID

```bash
dig @192.168.1.1 pc01.thos.local DHCID
```


# 12. Configuració a Stork

Si utilitzes [Stork](https://proferamon.com/tic/kea.html#stork-tauler-de-control-gràfic-per-a-kea) com a tauler de control gràfic dels serveis has de fer unes modificacions al fitxer `/etc/bind/named.conf.options`

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

Dins d'options habilita la transferència de zones

```nano
    allow-transfer { 127.0.0.1; };
```

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

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

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

```bash
sudo named-checkconf
```

Aplica la nova configuració

```bash
sudo rndc reload
```

# 13. Tauler de control d'Stork

![DHCP](https://proferamon.com/tic/imatges/ddns/ddns01.png)

---

![Zones del DNS](https://proferamon.com/tic/imatges/ddns/ddns02.png)

---

![Dimonis dels serveis](https://proferamon.com/tic/imatges/ddns/ddns03.png)

---

![Màquines](https://proferamon.com/tic/imatges/ddns/ddns04.png)

---

![Versions del programari](https://proferamon.com/tic/imatges/ddns/ddns05.png)

---

![Monitoratge d'esdeveniments](https://proferamon.com/tic/imatges/ddns/ddns06.png)

---

![Verificadors de configuració](https://proferamon.com/tic/imatges/ddns/ddns07.png)

---

![Configuracions](https://proferamon.com/tic/imatges/ddns/ddns08.png)

---

![Usuaris](https://proferamon.com/tic/imatges/ddns/ddns09.png)

# 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:

```bash
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

- [Documentació oficial de Kea – The DHCP-DDNS Server](https://kea.readthedocs.io/en/latest/arm/ddns.html)
- [ISC Kea – pàgina oficial](https://www.isc.org/kea/)
- [Ubuntu Server Docs – Install ISC Kea](https://ubuntu.com/server/docs/how-to/networking/install-isc-kea/)
- [ISC Packages for BIND 9](https://kb.isc.org/docs/isc-packages-for-bind-9)
- [RFC 2136 – DNS Dynamic Update](https://datatracker.ietf.org/doc/html/rfc2136)
- [RFC 4703 – Resolution of DHCID Conflicts](https://datatracker.ietf.org/doc/html/rfc4703)

#### Versions d'aquest document

+ HTML - [ddns.html](https://proferamon.com/tic/ddns.html)
+ PDF - [ddns.pdf](https://proferamon.com/tic/docs/ddns.pdf)
+ ODT - [ddns.odt](https://proferamon.com/tic/odt/ddns.odt)
+ MD - [ddns.md](https://proferamon.com/tic/md/ddns.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
