bind: DNS
BIND 9.18 — Authoritative DNS Server op Ubuntu 22.04
Je 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 — installeer je met `apt install bind9`
1. Installeer BIND
sudo apt update && sudo apt install bind9 bind9utils bind9-doc
Dit installeert BIND 9.18. Je 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 je 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. Je bouwt hier een authoritative server, geen resolver. Een authoritative server beantwoordt alleen vragen over domeinen die hij zelf beheert. Zet je recursion aan, dan wordt je server een open resolver en kan iedereen op het internet hem misbruiken voor DDoS-aanvallen. De kosten van `recursion no` zijn dat deze server niet als cache voor je eigen netwerk kan dienen — daarvoor heb je een aparte resolver nodig.
`listen-on` beperkt het luisteren tot het IP-adres van de server. `allow-transfer { none; }` voorkomt dat anderen je zonebestanden kunnen kopiëren — zonder die regel geef je een complete plattegrond van je 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 je 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/` voorkom je dat je 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 je bij elke wijziging verhogen, anders zien secundaire nameservers de wijziging niet en blijf je antwoorden met oude data. Veel beheerders gebruiken een datumformaat — `2024110101` is 1 november 2024, versie 01. Vergeet je de serial te verhogen, dan kan het uren duren voordat een wijziging ergens aankomt, zonder dat je 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 je de service. Een fout in een zonebestand zorgt er anders voor dat BIND niet start en je 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 je 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
Je ziet nu versie, aantal zones en uptime van de server. Met `rndc reload` herlaad je de configuratie zonder de server te stoppen, met `rndc flush` leeg je de cache als je 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 beperk je tot je beheernetwerk. Zet je die open voor de wereld, dan geef je iedereen de kans om te raden naar je rndc-sleutel.
VERIFICATIE
dig @192.168.1.10 pixzo.nl A +short
Je ziet `192.168.1.20` — het adres dat je in de zone hebt gezet. Controleer ook of recursion uitstaat:
dig @192.168.1.10 google.com A
Je krijgt `status: REFUSED` terug. Dat is het gewenste gedrag voor een authoritative server. Een antwoord met een IP-adres betekent dat je recursion per ongeluk aan hebt staan en je server open is voor misbruik.
Controleer de SOA-serial:
dig @192.168.1.10 pixzo.nl SOA +short
De output eindigt op `2024110101` — de serial die je 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 je 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 je in het controlepaneel aanpassen.
rndc werkt niet
sudo rndc status
Krijg je `connection refused`, dan mist de rndc-sleutel of staat rndc niet aan. Controleer of `/etc/bind/rndc.key` bestaat en eigendom is van de bind-gebruiker. De optie `-r /dev/urandom` bij `rndc-confgen` zorgt 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 je bent klaar. Het werkt al sinds de jaren tachtig en er is geen enkel probleem dat niet in een forum of mailinglist staat beschreven.
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 je 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 je 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 ben je geen klant die op de helpdesk wacht. Dan bén je de helpdesk.