Kea DDNS opzetten: BIND 9 TSIG, forward en reverse automatische updates
AI_Manager
Het opzetten van Kea DDNS zorgt ervoor dat wanneer DHCP een adres verleent, het A-record van de hostnaam en het PTR-record van het IP-adres automatisch worden geregistreerd in BIND 9. Kea DHCPv4 wijzigt de DNS-zonebestanden niet direct, maar stuurt een Name Change Request naar Kea D2, waarna D2 een RFC 2136 dynamische update met een TSIG-handtekening naar de BIND 9 primary stuurt.
Dit artikel gebruikt het 10.20.30.0/24 netwerk en het interne domein lab.example.internal als voorbeeld. Het simpelweg overnemen van de ddns-update-style voorbeelden van de oude ISC DHCP naar Kea zal niet werken. U moet rekening houden met functiescheiding, sleutelbeveiliging, consistentie tussen forward en reverse zones, DHCID-conflictbeheer en de juiste opstartvolgorde van services. Alle commando’s en configuraties zijn weergegeven in codeblokken.

Componenten en datastroom voor het opzetten van Kea DDNS
Deze oefening installeert Kea DHCPv4, D2 en BIND samen op één Rocky Linux 9 server met IP 10.20.30.53. Daarom worden het genereren van sleutels, lokale nsupdate-commando’s en service-opdrachten allemaal op deze server uitgevoerd, terwijl de verificatie van de client op een apart testapparaat plaatsvindt. In een productieomgeving waar DHCP en DNS gescheiden zijn, moet u de TSIG-geheimen via een beveiligd beheerkanaal naar de D2-host distribueren en de DNS-doeladressen en firewalls van D2 correct instellen.
| Componenten | Voorbeeldadres | Rol |
|---|---|---|
| Kea DHCPv4 | 10.20.30.53 | Adreslease, hostnaambeleid en verzenden van NCR naar D2 |
| Kea D2 | 127.0.0.1:53001 | Converteert NCR naar DNS UPDATE-berichten en voorziet deze van een TSIG-handtekening |
| BIND 9 primary | 10.20.30.53:53 | Authoritative server voor de dynamische forward en reverse zones |
| Client | 10.20.30.100~200 | Verstrekt de naam of FQDN in het DHCPREQUEST-bericht |
- In de forward zone lab.example.internal. wordt een A-record aangemaakt dat de hostnaam koppelt aan een IPv4-adres.
- In de reverse zone 30.20.10.in-addr.arpa. wordt een PTR-record aangemaakt dat het IPv4-adres koppelt aan een FQDN.
- DHCID-records worden gebruikt om conflicten te verminderen waarbij andere DHCP-clients dezelfde naam proberen te overschrijven.
- TSIG biedt authenticatie en integriteit voor updateberichten, maar versleutelt de DNS-query-antwoorden zelf niet.
Raadpleeg de officiële documentatie: Kea DHCP-DDNS Server, Kea DHCPv4 DDNS-configuratie en BIND 9 dynamisch updatebeleid.
Stap 1 voor het opzetten van Kea DDNS: Voorafgaande controles en pakketverificatie
Installeer Kea en BIND 9 vanuit ondersteunde distributiepakketten of goedgekeurde ISC-repositories. Voeg niet zomaar repositories toe, maar controleer eerst de versiekandidaten en handtekeningen. Hieronder staan voorbeelden van pakketnamen voor de EL9-familie.
# Bereid eerst dezelfde ISC 3.0 LTS-opslagplaats voor als in het artikel over het opzetten van Kea DHCP.
curl --fail --location --proto '=https' --tlsv1.2 \
https://dl.cloudsmith.io/public/isc/kea-3-0/setup.rpm.sh \
--output /tmp/isc-kea-3-0-setup.rpm.sh
less /tmp/isc-kea-3-0-setup.rpm.sh
sudo bash /tmp/isc-kea-3-0-setup.rpm.sh
sudo dnf --showduplicates list isc-kea-dhcp4 isc-kea-dhcp-ddns bind bind-utils
sudo dnf install -y isc-kea-dhcp4 isc-kea-dhcp-ddns bind bind-utils policycoreutils-python-utils
rpm -q isc-kea-dhcp4 isc-kea-dhcp-ddns bind bind-utils
kea-dhcp4 -V
named -V
systemctl show kea-dhcp-ddns -p User -p Group -p ExecStart
Controleer eerst de hostnaam, tijd, netwerkinterfaces en eventuele conflicten met bestaande DHCP- of DNS-listeners.
hostnamectl
chronyc tracking
ip -br address
sudo ss -luntp | grep -E ':(53|67|53001)\b' || true
getent passwd named
systemctl show kea-dhcp-ddns -p User -p Group
Stap 2 voor het opzetten van Kea DDNS: Genereren van TSIG-geheime sleutels en scheiding van rechten
BIND 9 en Kea D2 moeten hetzelfde TSIG-geheim gebruiken. Print de sleutel niet naar het scherm of de shell-geschiedenis; genereer deze alleen als root en plaats het key-blok voor BIND en het secret-bestand voor Kea met minimale rechten. Zorg ervoor dat de punt aan het einde van de sleutelnaam in beide configuraties exact overeenkomt.
sudo install -d -o root -g named -m 0750 /etc/named/keys
sudo sh -c 'umask 077; tsig-keygen -a hmac-sha256 kea-ddns.lab.example.internal. > /etc/named/keys/kea-ddns.key'
sudo chown root:named /etc/named/keys/kea-ddns.key
sudo chmod 0640 /etc/named/keys/kea-ddns.key
Vanaf Kea 2.5.8 kunt u een secret-file gebruiken in plaats van het geheim direct in het configuratiebestand op te nemen.
# Vraag de daadwerkelijke uitvoeringsgebruiker/-groep van D2 op. Als systemd User leeg is, is dit root.
D2_USER=$(systemctl show kea-dhcp-ddns -p User --value)
D2_USER=${D2_USER:-root}
D2_GROUP=$(systemctl show kea-dhcp-ddns -p Group --value)
D2_GROUP=${D2_GROUP:-$(id -gn "$D2_USER")}
sudo install -d -o root -g "$D2_GROUP" -m 0750 /etc/kea/secrets
sudo install -o root -g "$D2_GROUP" -m 0640 /dev/null /etc/kea/secrets/kea-ddns.secret
sudo awk -F'"' '/secret/{print $2}' /etc/named/keys/kea-ddns.key \
| sudo tee /etc/kea/secrets/kea-ddns.secret >/dev/null
sudo restorecon -Rv /etc/kea/secrets
sudo stat -c '%U:%G %a %n' /etc/named/keys/kea-ddns.key /etc/kea/secrets/kea-ddns.secret
Kopieer het TSIG-geheim niet naar berichten, tickets, Git-repositories of opdrachtuitvoer. Als u vermoedt dat het geheim is gelekt, maak dan een nieuwe sleutel aan, vervang deze in BIND en D2 volgens een gepland proces en trek de oude sleutel in.
Stap 3 voor het opzetten van Kea DDNS: BIND 9 dynamic zone configuratie
Neem het TSIG-sleutelbestand op in /etc/named.conf en definieer de forward en reverse primary zones.
include "/etc/named/keys/kea-ddns.key";
zone "lab.example.internal" IN {
type primary;
file "dynamic/db.lab.example.internal";
allow-update { key "kea-ddns.lab.example.internal."; };
};
zone "30.20.10.in-addr.arpa" IN {
type primary;
file "dynamic/db.10.20.30";
allow-update { key "kea-ddns.lab.example.internal."; };
};
allow-update geeft de betreffende sleutel toestemming om de gehele zone bij te werken. Als u meer gedetailleerde beperkingen op namen of records nodig heeft, ontwerp dan een update-policy voor BIND, maar gebruik beide opties niet tegelijkertijd in dezelfde zone.
Wijzig de volgende items binnen het bestaande options-blok van /etc/named.conf. Voeg geen dubbele options-blokken toe. Aangezien deze server ook als recursieve DNS voor interne clients fungeert, moet u het bereik voor queries en recursie beperken tot het testnetwerk.
listen-on port 53 { 127.0.0.1; 10.20.30.53; };
listen-on-v6 port 53 { ::1; };
allow-query { localhost; 10.20.30.0/24; };
recursion yes;
allow-recursion { localhost; 10.20.30.0/24; };
Sla de onderstaande twee zonebestanden op in de huidige werkmap als respectievelijk db.lab.example.internal en db.10.20.30 en plaats ze vervolgens met het volgende install-commando.
Initiële forward zone-bestand
$TTL 300
@ IN SOA dns01.lab.example.internal. hostmaster.lab.example.internal. (
2026072101 ; serial
3600 ; refresh
900 ; retry
604800 ; expire
300 ) ; minimum
IN NS dns01.lab.example.internal.
dns01 IN A 10.20.30.53
Initiële reverse zone-bestand
$TTL 300
@ IN SOA dns01.lab.example.internal. hostmaster.lab.example.internal. (
2026072101 ; serial
3600 ; refresh
900 ; retry
604800 ; expire
300 ) ; minimum
IN NS dns01.lab.example.internal.
53 IN PTR dns01.lab.example.internal.
sudo install -d -o named -g named -m 0770 /var/named/dynamic
sudo install -o named -g named -m 0660 db.lab.example.internal /var/named/dynamic/
sudo install -o named -g named -m 0660 db.10.20.30 /var/named/dynamic/
sudo restorecon -Rv /etc/named/keys /var/named/dynamic
sudo named-checkconf /etc/named.conf
sudo named-checkzone lab.example.internal /var/named/dynamic/db.lab.example.internal
sudo named-checkzone 30.20.10.in-addr.arpa /var/named/dynamic/db.10.20.30
Het journal-bestand van een dynamic zone wordt door named aangemaakt. Schakel SELinux niet uit en verander /var/named niet volledig naar 0777; behoud de standaard pakketcontext en zorg dat alleen de dynamic-map beschrijfbaar is.
sudo systemctl enable --now named
sudo systemctl --no-pager --full status named
sudo journalctl -u named -b --no-pager | tail -n 100
dig @127.0.0.1 SOA lab.example.internal +norecurse
dig @127.0.0.1 SOA 30.20.10.in-addr.arpa +norecurse
Stap 4 voor het opzetten van Kea DDNS: Zelfstandige test van BIND dynamische updates
Door BIND en TSIG alleen te testen met nsupdate voordat u Kea koppelt, kunt u eventuele fouten isoleren. Deze test voegt tijdelijke A- en PTR-records toe, controleert deze en verwijdert ze vervolgens.
sudo nsupdate -k /etc/named/keys/kea-ddns.key <<'EOF'
server 127.0.0.1
zone lab.example.internal.
update add ddns-test.lab.example.internal. 300 A 10.20.30.250
send
zone 30.20.10.in-addr.arpa.
update add 250.30.20.10.in-addr.arpa. 300 PTR ddns-test.lab.example.internal.
send
EOF
dig @127.0.0.1 ddns-test.lab.example.internal A +short
dig @127.0.0.1 -x 10.20.30.250 +short
sudo journalctl -u named --since '-5 minutes' --no-pager
sudo nsupdate -k /etc/named/keys/kea-ddns.key <<'EOF'
server 127.0.0.1
update delete ddns-test.lab.example.internal. A
send
update delete 250.30.20.10.in-addr.arpa. PTR
send
EOF
Stap 5 voor het opzetten van Kea DDNS: Kea D2 configuratie
Configureer /etc/kea/kea-dhcp-ddns.conf als volgt. Het DNS-serveradres moet naar de BIND 9 primary wijzen.
{
"DhcpDdns": {
"ip-address": "127.0.0.1",
"port": 53001,
"dns-server-timeout": 1000,
"ncr-protocol": "UDP",
"ncr-format": "JSON",
"tsig-keys": [
{
"name": "kea-ddns.lab.example.internal.",
"algorithm": "HMAC-SHA256",
"secret-file": "/etc/kea/secrets/kea-ddns.secret"
}
],
"forward-ddns": {
"ddns-domains": [
{
"name": "lab.example.internal.",
"key-name": "kea-ddns.lab.example.internal.",
"dns-servers": [ { "ip-address": "10.20.30.53", "port": 53 } ]
}
]
},
"reverse-ddns": {
"ddns-domains": [
{
"name": "30.20.10.in-addr.arpa.",
"key-name": "kea-ddns.lab.example.internal.",
"dns-servers": [ { "ip-address": "10.20.30.53", "port": 53 } ]
}
]
},
"loggers": [
{ "name": "kea-dhcp-ddns", "severity": "INFO" }
]
}
}
sudo kea-dhcp-ddns -t /etc/kea/kea-dhcp-ddns.conf
sudo systemctl enable --now kea-dhcp-ddns
sudo systemctl --no-pager --full status kea-dhcp-ddns
sudo ss -lunp | grep ':53001'
sudo journalctl -u kea-dhcp-ddns -b --no-pager | tail -n 100
Stap 6 voor het opzetten van Kea DDNS: D2 koppelen in DHCPv4
In dit voorbeeld wordt ddns-override-client-update: true gebruikt zodat Kea zowel A- als PTR-records beheert wanneer een client om een update verzoekt. Een verzoek van een client om updates te weigeren wordt gerespecteerd via ddns-override-no-update: false. Daarom worden niet bij alle terminals automatisch A/PTR-records aangemaakt; controleer de FQDN-opties en de werkelijke NCR-logs.
Het volgende voorbeeld toont de kernonderdelen van /etc/kea/kea-dhcp4.conf. Pas de interface, router, DNS-adressen en pool aan aan uw werkelijke netwerk. Zowel dhcp-ddns.enable-updates als ddns-send-updates moeten zijn ingeschakeld om verzoeken naar D2 te verzenden.
{
"Dhcp4": {
"interfaces-config": { "interfaces": [ "ens192" ] },
"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/kea-leases4.csv"
},
"renew-timer": 900,
"rebind-timer": 1800,
"valid-lifetime": 3600,
"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-override-no-update": false,
"ddns-override-client-update": true,
"ddns-replace-client-name": "when-not-present",
"ddns-generated-prefix": "host",
"ddns-qualifying-suffix": "lab.example.internal",
"ddns-update-on-renew": false,
"ddns-conflict-resolution-mode": "check-with-dhcid",
"subnet4": [
{
"id": 100,
"subnet": "10.20.30.0/24",
"pools": [ { "pool": "10.20.30.100 - 10.20.30.200" } ],
"option-data": [
{ "name": "routers", "data": "10.20.30.1" },
{ "name": "domain-name-servers", "data": "10.20.30.53" },
{ "name": "domain-name", "data": "lab.example.internal" }
]
}
],
"loggers": [ { "name": "kea-dhcp4", "severity": "INFO" } ]
}
}
ddns-replace-client-name is zo ingesteld dat deze alleen wordt aangemaakt als er nog geen naam is. Als het beheerbeleid vereist dat de server alle namen dwingend vastlegt, kunt u always overwegen, maar ontwerp eerst reserverings- en naamgevingsregels die niet conflicteren met bestaande clientnamen.
sudo kea-dhcp4 -t /etc/kea/kea-dhcp4.conf
sudo systemctl enable --now kea-dhcp4
sudo systemctl --no-pager --full status kea-dhcp4
sudo ss -lunp | grep -E ':(67|53001)\b'
sudo journalctl -u kea-dhcp4 -b --no-pager | tail -n 100
Stap 7 voor het opzetten van Kea DDNS: Verificatie van werkelijke A-, PTR- en DHCID-records
Nadat een testclient een nieuwe DHCP-lease heeft ontvangen, voert u zowel forward- als reverse-lookups uit op basis van het toegewezen adres en de FQDN. Omdat het vernieuwen van een lease op een actieve interface de verbinding kan verbreken, voert u dit uit vanaf een console of een apart testapparaat.
# Vernieuw de lease op de testclient via een methode die past bij de werkelijke omgeving
sudo dhclient -r ens192
sudo dhclient -v ens192
ip -4 address show dev ens192
dig @10.20.30.53 client01.lab.example.internal A +noall +answer
dig @10.20.30.53 -x 10.20.30.101 +noall +answer
dig @10.20.30.53 client01.lab.example.internal DHCID +noall +answer
sudo journalctl -u kea-dhcp4 -u kea-dhcp-ddns -u named \
--since '-10 minutes' --no-pager
| Symptoom | Te controleren items | Veelvoorkomende oorzaken |
|---|---|---|
| Geen A- of PTR-records | DHCPv4-logs en 53001 UDP | D2-koppeling uitgeschakeld, naamgevingsbeleid, D2 gestopt |
| Alleen A-record aangemaakt | reverse-ddns domein en reverse zone | Discrepantie in reverse zone-naam of DNS-serveradres |
| NOTAUTH | BIND primary en zone-declaratie | Overdracht naar secondary, zone-naam komt niet overeen |
| NOTAUTH of REFUSED | TSIG-sleutelnaam, secret en algoritme | Sleutel komt niet overeen, allow-update niet toegestaan |
| YXDOMAIN en conflicten | Bestaande A- en DHCID-records en client-identifiers | Een andere client bezit dezelfde naam |
Kea DDNS-beheer: wijzig dynamic zone-bestanden niet handmatig
Een dynamic zone die door named wordt uitgevoerd, wordt beheerd in combinatie met .jnl-journalbestanden. Als u zonebestanden direct bewerkt, kunnen wijzigingen worden overschreven of kan er een inconsistentie met het journal ontstaan. Als handmatige wijzigingen noodzakelijk zijn, synchroniseer dan eerst, bevries (freeze) de betreffende zone, valideer deze en hef de bevriezing (thaw) vervolgens op.
sudo rndc freeze lab.example.internal
sudoedit /var/named/dynamic/db.lab.example.internal
sudo named-checkzone lab.example.internal /var/named/dynamic/db.lab.example.internal
sudo rndc thaw lab.example.internal
sudo rndc zonestatus lab.example.internal
Verwijder niet zomaar .jnl-bestanden of A-, PTR- en DHCID-records om fouten snel te verhelpen. Controleer eerst de eigenaar van de DHCP-lease, de forward- en reverse-records en de DHCID, en bepaal daarna de volgorde voor het stoppen, back-uppen en herstellen van de service.
Controle van firewall, SELinux en rechten
Tussen de client en de geautoriseerde DNS-server is DNS 53/TCP·UDP vereist, en tussen de DHCP-server en de client is de DHCP-poort nodig. Aangezien 53001/UDP van D2 alleen is gebonden aan de loopback van dezelfde host, moet deze niet extern worden opengesteld.
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --permanent --zone=internal --add-service=dns
sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
sudo firewall-cmd --reload
sudo firewall-cmd --zone=internal --list-all
sudo ss -luntp | grep -E ':(53|67|53001)\b'
sudo ausearch -m AVC -ts recent | tail -n 50
Het uitschakelen van firewalld of SELinux is geen oplossing. Zorg ervoor dat named alleen naar de dynamic-directory kan schrijven, dat het secret-bestand van D2 alleen leesbaar is voor root en het daadwerkelijke D2-uitvoeringsaccount, en dat TSIG-rechten alleen aan de noodzakelijke zones worden verleend.
Checklist voor hoge beschikbaarheid, back-up en monitoring
- Valideer via failover-tests of beide DHCP-servers van Kea HA de D2 en de authoritative DNS kunnen bereiken.
- Synchroniseer de DNS-secondary via NOTIFY en IXFR/AXFR van de primary en wijs de primary expliciet aan als doelwit voor D2-updates.
- Maak back-ups van de Kea-configuratie, de lease-database, de BIND-configuratie, zones, journals en TSIG-sleutels met verschillende beveiligingsniveaus.
- Beperk de rechten voor het herstellen van sleutels en oefen regelmatig de procedures voor het roteren van sleutels en het herstarten van services.
- Observeer niet alleen het succes van DHCP-leases, maar ook de D2-wachtrij, de resultaten van DNS UPDATE, inconsistenties tussen A- en PTR-records en de zone-serial.
sudo systemctl is-active kea-dhcp4 kea-dhcp-ddns named
sudo kea-dhcp4 -t /etc/kea/kea-dhcp4.conf
sudo kea-dhcp-ddns -t /etc/kea/kea-dhcp-ddns.conf
sudo named-checkconf -z /etc/named.conf
sudo rndc status
sudo rndc zonestatus lab.example.internal
Gerelateerde artikelen
- Kea DHCP-server opzetten: Rocky Linux 9, reserveringen, validatie en HA
- Diagnosegids voor Linux ‘No space left on device’
Samenvatting
Een veilige Kea DDNS-implementatie. Start DHCPv4, D2 en BIND 9 niet allemaal tegelijk, maar controleer stap voor stap door BIND-zones te valideren, TSIG afzonderlijk te testen, D2 te koppelen en vervolgens daadwerkelijke DHCP-lease-tests uit te voeren. Observeer forward A-records, reverse PTR-records en DHCID’s in samenhang, en neem procedures voor rechten op secret-bestanden, dynamic zone-journals, back-ups en sleutelrotatie op in uw operationele richtlijnen om te voorkomen dat automatisering de dataconsistentie schaadt.