DNS (Domain Name System) is een systeem waarin alle domeinnamen van servers in een specifieke hiërarchie zijn georganiseerd. Waarom hebben we dit nodig? Stel je voor dat je verbinding moet maken met een apparaat met het IP-adres 91.206.179.207. Je kunt dit adres in de opdrachtregel invoeren om de benodigde informatie te krijgen, maar veel van zulke numerieke combinaties onthouden is erg lastig. Daarom zijn er speciale servers gemaakt die domeinnamen omzetten naar IP-adressen. Wanneer je bijvoorbeeld hostman.com in de zoekbalk van je browser invoert, worden de aanvraaggegevens naar een DNS-server gestuurd. Die zoekt in zijn database naar overeenkomsten, stuurt het juiste IP-adres terug naar je apparaat en pas daarna kan de browser de resource rechtstreeks benaderen.
Je eigen DNS configureren maakt een flexibelere en nauwkeurigere systeemconfiguratie mogelijk en voorkomt afhankelijkheid van derden. In dit artikel bekijken we hoe je DNS opzet met de BIND-nameserver op Ubuntu.
Zone: Een deel van de DNS-hiërarchie dat op een DNS-server wordt gehost. Het bepaalt de grenzen waarbinnen een specifieke server of groep servers verantwoordelijk is.
Rootservers: DNS-servers met informatie over top-level domains (.ru, .com, enz.).
Domein: Een benoemd deel van de DNS-hiërarchie, een specifieke node die andere nodes kan bevatten. DNS-adressen worden van rechts naar links gelezen en beginnen met een punt, waarbij domeinen ook door punten gescheiden zijn. Bijvoorbeeld: het domein poddomen.domen.ru moet worden gelezen als .ru.domen.poddomen. Meestal weerspiegelt de domeinnaam de DNS-hiërarchie, maar de laatste punt wordt weggelaten.
FQDN (Fully Qualified Domain Name): Een volledige domeinnaam inclusief alle bovenliggende domeinen.
Resource record: Een opslageenheid van informatie, in feite een record dat een naam koppelt aan service-informatie. Het bestaat uit:
Naam (NAME): De naam of het IP-adres dat eigenaar is van de zone
Time to Live (TTL): Hoelang een record in de DNS-cache blijft voordat het wordt verwijderd
Class (CLASS): Netwerktype, meestal IN (Internet)
Type (TYPE): Het doel van het record
Data (DATA): Aanvullende details
A-record: Koppelt een hostnaam aan een IPv4-adres. Elke netwerkinterface kan maar één A-record hebben.
website.com. 520 IN A 91.206.179.207
AAAA-record: Hetzelfde als een A-record, maar voor IPv6.
CNAME: Canonical name record, een alias voor een echte naam (doorverwijzing).
MX: Specificeert mailhosts voor het domein. Het NAME-veld bevat het bestemmingsdomein, het DATA-veld de prioriteit en host voor het ontvangen van mail.
website.com. 17790 IN MX 10 mx.website.com.
website.com. 17790 IN MX 20 mx2.website.com.
NS: Verwijst naar de DNS-server die het domein bedient.
PTR: Koppelt een IP-adres aan een domeinnaam (reverse lookup).
SOA: Beschrijft de belangrijkste zone-instellingen.
SRV: Bevat adressen van servers die interne domeindiensten leveren, zoals Jabber.
Om de instructies in dit artikel te volgen, heb je minstens twee Ubuntu-servers nodig in hetzelfde datacenter. Je kunt deze servers bij Hostman bestellen.
We hebben twee Ubuntu 20.04-servers nodig: een primaire en een secundaire DNS-server, respectievelijk ns1 en ns2. Daarnaast zijn er extra servers die onze geconfigureerde DNS-servers gebruiken.
Je moet op elke server superuserrechten hebben.
We gebruiken bind9 als DNS-server. Installeer het bind9-pakket uit de Linux-repository:
sudo apt update && sudo apt upgrade -y
sudo apt install bind9
Daarnaast is het aan te raden netwerktools te installeren:
sudo apt install dnsutils
Start daarna de bind9-service:
sudo service bind9 start
Het hoofdconfiguratiebestand van de server is /etc/bind/named.conf. Het beschrijft algemene instellingen en wordt meestal opgesplitst in meerdere bestanden.
Dit bestand bevat de algemene serverparameters:
options {
dnssec-validation auto;
auth-nxdomain no;
directory "/var/cache/bind";
recursion no; # recursieve queries naar de nameserver uitschakelen
listen-on {
172.16.0.0/16;
127.0.0.0/8;
};
forwarders {
172.16.0.1;
8.8.8.8;
};
};
Controleer of alles correct is ingevoerd met named-checkconf:
sudo named-checkconf
Als alles klopt, kan de bind-server starten.
De primaire DNS-server bewaart de hoofdkopie van het zonebestand. Alle zones komen in de map /etc/bind/master-zones. Maak die aan:
sudo mkdir /etc/bind/master-zones
Maak een bestand aan voor de zone:
sudo touch /etc/bind/master-zones/test.example.com.local.zone
Voeg SOA-, NS- en A-records toe:
$ttl 3600
$ORIGIN test.example.com.
test.example.com. IN SOA (
ns.test.example.com.
abuse.test.example.com.
2022041201
10800
1200
604800
3600 )
@ IN NS ns.test.example.com.
@ IN NS ns2.test.example.com.
@ IN A 172.16.101.3
ns IN A 172.16.0.5
ns2 IN A 172.16.0.6
Controleer met named-checkzone:
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.local.zone
Dit is een extra bestand dat in de hoofdconfiguratie wordt ingeladen. Hier definiëren we lokale zones:
zone "test.example.com." {
type master;
file "/etc/bind/master-zones/test.example.com.local.zone";
};
Controleer de configuratie en herstart bind9 (de -z vlag controleert zonebestanden):
sudo named-checkconf
sudo named-checkconf -z
sudo service bind9 restart
sudo service bind9 status
Views maken het mogelijk om naamresolutie flexibel te beheren voor verschillende subnets. Zet dit in /etc/bind/named.conf:
include "/etc/bind/named.conf.options";
acl "local" { 172.16.0.0/16; };
view "local" {
include "/etc/bind/named.conf.local";
match-clients { local; };
};
Herstart daarna bind9:
sudo service bind9 restart
Na de herstart kun je vanaf een andere computer in het lokale netwerk de SOA-record opvragen van server 172.16.0.5:
dig @172.16.0.5 -t SOA test.example.com
De primaire DNS-server is nu klaar. De volgende secties behandelen de secundaire server, mailserver-instellingen en reverse zones.
De eerste stappen zijn hetzelfde: bind9 en dnsutils installeren en starten.
Maak vervolgens de map /etc/bind/slave voor zonebestanden en geef de juiste permissies:
sudo mkdir /etc/bind/slave
sudo chmod g+w /etc/bind/slave
Voeg de zone toe in /etc/bind/named.conf.local:
zone "test.example.com." {
type slave;
file "/etc/bind/slave/test.example.com.local.zone";
masters { 172.16.0.5; };
};
Views in named.conf:
include "/etc/bind/named.conf.options";
acl "local" { 172.16.0.0/16; };
view "local" {
match-clients { local; };
include "/etc/bind/named.conf.local";
};
Controleer en herstart:
sudo named-checkconf
sudo named-checkconf -z
sudo service bind9 restart
Zone transfer uitvoeren:
sudo rndc retransfer test.example.com
rndc retransfer forceert een zone transfer zonder serial-check. Belangrijk: verhoog de serial number altijd wanneer je het zonebestand wijzigt (bij voorkeur datum + increment).
Beperk daarna zone transfers op de primaire server met allow-transfer in de zoneconfig (named.conf):
zone "test.example.com." {
type master;
allow-transfer { 172.168.0.6; };
file "/etc/bind/master-zones/test.example.com.local.zone";
};
Herstart:
sudo service bind9 restart
Vanaf hier voer je verdere wijzigingen uit op de primaire server.
We gebruiken in dit voorbeeld mx als hostnaam. De FQDN wordt mx.test.example.com.
Voeg MX-records toe aan /etc/bind/master-zones/test.example.com.local.zone:
@ IN MX 10 mx.test.example.com.
@ IN MX 20 mx2.test.example.com.
Werk de serial number in het SOA-record bij:
$TTL 3600
@ IN SOA ns.test.example.com. admin.test.example.com. (
2024071101 ; Serial number
10800 ; Refresh
1200 ; Retry
604800 ; Expire
3600 ; Minimum TTL
)
Controleer de zonefile:
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.local.zone
Herlaad BIND:
sudo service bind9 reload
Reverse DNS zet IP-adressen om naar domeinnamen.
Voorbeeld: 192.168.1.10 wordt 10.1.168.192.in-addr.arpa.
Maak een reverse zonefile:
sudo nano /etc/bind/master-zones/16.172.in-addr.arpa.zone
Voeg data toe:
$TTL 3600
16.172.in-addr.arpa. IN SOA (
ns.test.example.com.
admin.test.example.com.
2022041202
10800
1200
604800
3600 )
IN NS ns.test.example.com.
IN NS ns2.test.example.com.
3.101.16.172.in-addr.arpa. IN PTR test.example.com.
5.0.16.172.in-addr.arpa. IN PTR ns.test.example.com.
6.0.16.172.in-addr.arpa. IN PTR ns2.test.example.com.
2.101.16.172.in-addr.arpa. IN PTR mail.test.example.com.
Controleer:
sudo named-checkzone 16.172.in-addr.arpa /etc/bind/master-zones/16.172.in-addr.arpa.zone
Voeg in named.conf.local toe:
zone "16.172.in-addr.arpa." {
type master;
file "/etc/bind/master-zones/16.172.in-addr.arpa.zone";
allow-transfer { 172.16.0.6; };
};
Herstart:
sudo named-checkconf
sudo named-checkconf -z
sudo service bind9 restart
Test met dig:
dig @172.16.0.5 -x 172.16.0.5
Op de secundaire server voeg je in named.conf.local toe:
zone "16.172.in-addr.arpa." {
type slave;
file "/etc/bind/slave/16.172.in-addr.arpa.zone";
masters { 172.16.0.5; };
};
Om queries van buitenaf te verwerken, voeg je het externe IP toe aan listen-on in named.conf.options:
listen-on {
aaa.bbb.ccc.ddd/32; # ons externe IP
172.16.0.0;
127.0.0.0/8
}
Maak de zonefile aan (serial number aanpassen!):
sudo nano /etc/bind/master-zones/test.example.com.zone
Inhoud:
$TTL 3600
$ORIGIN test.example.com.
test.example.com. IN SOA (
ns.test.example.com.
admin.test.example.com.
2022041205
10800
1200
604800
3600 )
@ IN NS ns.test.example.com.
@ IN NS ns2.test.example.com.
@ IN A aaa.bbb.ccc.ddd
ns IN A aaa.bbb.ccc.ddd
ns2 IN A eee.fff.ggg.hhh
Maak een apart bestand voor externe view zones:
sudo nano /etc/bind/named.conf.external
zone "test.example.com." {
type master;
file "/etc/bind/master-zones/test.example.com.zone";
allow-transfer { 172.16.0.6; };
};
Voeg in named.conf toe:
acl "external-view" { aaa.bbb.ccc.ddd; };
view "external-view" {
recursion no;
match-clients { external-view; };
include "/etc/bind/named.conf.external";
};
Controleer en herstart:
sudo named-checkconf -z
sudo named-checkzone test.example.com. /etc/bind/master-zones/test.example.com.zone
sudo service bind9 restart
sudo service bind9 status
Op de secundaire server zet je in named.conf.options het externe adres bij listen-on, maak je een named.conf.external aan met slave-zone en voer je transfer uit:
sudo rndc retransfer test.example.com IN external-view
Bij DNS-setup is logging erg belangrijk. BIND9 kan uitgebreide logging-configuraties aan.
Maak log.conf:
sudo nano /etc/bind/log.conf
Inhoud:
logging {
channel bind.log {
file "/var/lib/bind/bind.log" versions 10 size 20m;
severity debug;
print-category yes;
print-severity yes;
print-time yes;
};
category queries { bind.log; };
category default { bind.log; };
category config { bind.log; };
};
Include in hoofdconfig:
include "/etc/bind/log.conf";
Herstart:
sudo service bind9 restart
In deze gids hebben we DNS geconfigureerd op een Ubuntu-server met het bind9-pakket. Na het volgen van de stappen kunnen de twee DNS-servers worden gebruikt voor naamresolutie in het netwerk. Om de custom DNS-servers te gebruiken, configureer je je andere servers om 172.16.0.5 en 172.16.0.6 als DNS-servers te gebruiken.
Deze setup kan dienen als basis voor verdere uitbreidingen, zoals het opzetten van een mailserver.