bind: DNS
BIND 9.18 — Authoritative DNS-server op Ubuntu 22.04
Uw eigen DNS-server opzetten met BIND 9.18 op Ubuntu 22.04, inclusief zoneconfiguratie, DNSSEC en remote management met rndc.
VEREISTEN
- Ubuntu 22.04 LTS met minimaal 1 GB RAM
- Root-toegang of een gebruiker met sudo-rechten
- Een statisch IP-adres voor de server
- Poort 53 en 953 (rndc) vrij in de firewall
- BIND 9.18.x — installeert u met `apt install bind9`
1. Installeer BIND
sudo apt update && sudo apt install bind9 bind9utils bind9-doc
Dit installeert BIND 9.18. U krijgt automatisch een werkende configuratie die luistert op localhost. Zonder verdere aanpassingen doet die nog niets nuttigs — een DNS-server zonder zones is een telefoonboek zonder abonnees.
2. Controleer de basisconfiguratie
sudo named-checkconf
Geen output betekent dat de configuratie geldig is. De hoofdconfiguratie staat in `/etc/bind/named.conf`. Die verwijst door naar drie bestanden: `named.conf.options` voor globale instellingen, `named.conf.local` voor uw eigen zones, en `named.conf.default-zones` voor de root-hints en localhost.
3. Configureer de options
Open `/etc/bind/named.conf.options`:
sudo nano /etc/bind/named.conf.options
Pas de options aan:
options {
directory "/var/cache/bind";
listen-on port 53 { 192.168.1.10; };
listen-on-v6 { none; };
recursion no;
allow-query { any; };
allow-transfer { none; };
};`recursion no` is de belangrijkste regel. U bouwt hier een authoritative server, geen resolver. Een authoritative server beantwoordt alleen vragen over domeinen die hij zelf beheert. Zet u recursion aan, dan wordt uw server een open resolver en kan iedereen op het internet hem misbruiken voor DDoS-aanvallen. De kost van `recursion no` is dat deze server niet als cache voor uw eigen netwerk kan dienen — daarvoor hebt u een aparte resolver nodig.
`listen-on` beperkt het luisteren tot het IP-adres van de server. `allow-transfer { none; }` voorkomt dat anderen uw zonebestanden kunnen kopiëren — zonder die regel geeft u een complete plattegrond van uw netwerk weg aan iedereen die erom vraagt.
4. Definieer een zone
Open `/etc/bind/named.conf.local`:
sudo nano /etc/bind/named.conf.local
Voeg uw eerste zone toe:
zone "pixzo.nl" {
type master;
file "/etc/bind/zones/db.pixzo.nl";
};Dit vertelt BIND dat hij de autoriteit heeft over `pixzo.nl` en dat de zonegegevens in het genoemde bestand staan. De directory van de zonebestanden is een bewuste keuze: door ze apart te zetten in `/etc/bind/zones/` voorkomt u dat u ze door de war haalt met de systeembestanden van BIND zelf.
5. Maak het zonebestand aan
sudo mkdir -p /etc/bind/zones
sudo nano /etc/bind/zones/db.pixzo.nl$TTL 3600
$ORIGIN pixzo.nl.
@ IN SOA ns1.pixzo.nl. admin.pixzo.nl. (
2024110101 ; serial
7200 ; refresh
3600 ; retry
1209600 ; expire
3600 ) ; negative cache TTL</p><p>IN NS ns1.pixzo.nl.
IN NS ns2.pixzo.nl.
IN MX 10 mail.pixzo.nl.</p><p>ns1 IN A 192.168.1.10
ns2 IN A 192.168.1.11
www IN A 192.168.1.20
mail IN A 192.168.1.30De SOA-record is het hart van het zonebestand. De serial moet u bij elke wijziging verhogen, anders zien secundaire nameservers de wijziging niet en blijft u antwoorden met oude data. Veel beheerders gebruiken een datumformaat — `2024110101` is 1 november 2024, versie 01. Vergeet u de serial te verhogen, dan kan het uren duren voordat een wijziging ergens aankomt, zonder dat u een foutmelding krijgt.
6. Controleer en start BIND
sudo named-checkzone pixzo.nl /etc/bind/zones/db.pixzo.nl
sudo named-checkconf
sudo systemctl restart bind9De eerste opdracht controleert het zonebestand op fouten. De tweede checkt de configuratie. Pas als beide geen fouten melden, herstart u de service. Een fout in een zonebestand zorgt er anders voor dat BIND niet start en uw DNS-verkeer stilvalt.
7. Configureer rndc voor remote management
sudo rndc-confgen -a -r /dev/urandom
sudo chown bind:bind /etc/bind/rndc.key`rndc-confgen` genereert een geheime sleutel in `/etc/bind/rndc.key`. BIND gebruikt die sleutel om commando's van rndc te authenticeren. Zonder die sleutel kan iedereen die bij de server kan komen proberen uw cache te legen of configuratie te herladen. De sleutel is een HMAC-SHA256-hash — behandel hem als een wachtwoord.
Test de verbinding:
sudo rndc status
U ziet nu versie, aantal zones en uptime van de server. Met `rndc reload` herlaadt u de configuratie zonder de server te stoppen, met `rndc flush` leegt u de cache als u die ooit aanzet.
8. Stel de firewall in
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow from 192.168.1.0/24 to any port 953DNS werkt over UDP voor gewone queries en TCP voor grote antwoorden en zone transfers. Poort 953 is alleen voor rndc — die beperkt u tot uw beheernetwerk. Zet u die open voor de wereld, dan geeft u iedereen de kans om te raden naar uw rndc-sleutel.
VERIFICATIE
dig @192.168.1.10 pixzo.nl A +short
U ziet `192.168.1.20` — het adres dat u in de zone hebt geplaatst. Controleer ook of recursion uitgeschakeld is:
dig @192.168.1.10 google.com A
U krijgt `status: REFUSED` terug. Dat is het gewenste gedrag voor een authoritative server. Een antwoord met een IP-adres betekent dat u recursion per ongeluk hebt ingeschakeld en uw server openstaat voor misbruik.
Controleer de SOA-serial:
dig @192.168.1.10 pixzo.nl SOA +short
De output eindigt op `2024110101` — de serial die u hebt ingesteld.
VEELGESTELDE PROBLEMEN
BIND start niet na een wijziging
sudo journalctl -u bind9 -n 20
sudo named-checkconf
sudo named-checkzone pixzo.nl /etc/bind/zones/db.pixzo.nlDe logregels wijzen meestal direct naar de oorzaak: een ontbrekende punt achter een domeinnaam in het zonebestand, of een serial die niet is verhoogd. Een gemiste punt is de klassieker — BIND vult dan automatisch het origineel aan en uw record verwijst naar `ns1.pixzo.nl.pixzo.nl`.
Externe clients krijgen geen antwoord
sudo ss -tulpn | grep :53
sudo ufw statusControleer of BIND luistert op het juiste IP-adres en of de firewall UDP en TCP op poort 53 toestaat. Vergeet niet dat veel cloudproviders een eigen firewall hebben buiten de server om — die moet u in het controlepaneel aanpassen.
rndc werkt niet
sudo rndc status
Krijgt u `connection refused`, dan ontbreekt de rndc-sleutel of staat rndc niet ingeschakeld. Controleer of `/etc/bind/rndc.key` bestaat en eigendom is van de bind-gebruiker. De optie `-r /dev/urandom` bij `rndc-confgen` zorgt ervoor dat de sleutelgeneratie niet blokkeert op een systeem met weinig entropy — zonder die vlag kan het commando minutenlang hangen op een verse server.
WAAROM BIND EN NIET IETS ANDERS
De configuratie hierboven is de klassieke BIND-aanpak: tekstbestanden, een herstart, en u bent klaar. Het werkt al sinds de jaren tachtig en er is geen enkel probleem dat niet in een forum of mailinglist beschreven staat.
De kosten van die volwassenheid zijn duidelijk. BIND 9 is groot en de configuratie is ouderwets vergeleken met het JSON-gedreven Knot DNS of de database-backed PowerDNS. Wie honderden zones moet beheren, merkt al snel dat tekstbestanden bewerken niet schaalt. Voor een handvol domeinen is BIND echter nog steeds de meest voorspelbare keuze — de software is zo wijdverspreid dat de kans groot is dat uw hostingprovider of collega dezelfde configuratie gebruikt.
Wie DNSSEC wil ondertekenen zonder handmatig sleutelrotatie te doen, kan beter naar Knot DNS of PowerDNS kijken. BIND kan het, maar de tooling voelt alsof u met een schroevendraaier een spijker slaat. Het werkt, maar er is beter gereedschap.
Zelf hosten klinkt prachtig, tot er iets omvalt op zondagavond half twaalf. Dan bent u geen klant die op de helpdesk wacht. Dan bént u de helpdesk.