A DNS szerver szerepe

Az internet IP (internet protokoll) alapú világméretű hálózat. Minden hálózatra kötött eszköznek van egy IP címe (egyedi azonosító) és az eszközök ez alapján kommunikálnak egymással. Az internet protokoll egy szám, ami IPv4 esetén négy bájt (szám 0-255-ig) ponttal elválasztva, például 74.125.136.100 . Persze ahhoz, hogy egyszerűbb legyen az életünk és a web böngészőbe ne hasonló számokat keljen beírogatni, kitalálták, hogy a számokat egyedi nevekkel lehessen helyettesíteni. Ezek lettek a domain nevek. Tehát amikor a böngészőbe beírjuk, hogy 74.125.136.100 akkor ugyanúgy a népszerű kereső oldalra jutunk, mintha azt írtuk volna, hogy google.com . De honnan tudja böngésző, hogy a beírt névhez milyen IP cím tartozik. És itt jön a lényeg. Az IP címek, nevekkel történő megfeleltetéséért a DNS szerverek felelősek. Amikor a böngészőbe beírjuk, hogy “google.com”, akkor a számítógép megkérdezi a DNS szervert, hogy “Ugyan mond már meg hogy milyen IP cím tartozik ehhez a domain névhez!”. A DNS szerver pedig küldi a választ, hogy “74.125.136.100”. Ezzel a böngésző már tud valamit kezdeni és meg fogja tudni jeleníteni az adott IP címen lévő web oldalt…

A feladat tehát adott, a virtuális teszt környezetünkbe telepítünk egy BIND9 DNS szervert. A környezet a következő nevekből és IP címekből fog állni, a DNS szervernek ezeket kell majd feloldania:

  • dns.debian.lnx - 192.168.10.10 - ez maga a DNS szerver
  • host.debian.lnx - 192.168.10.100 - egy host gép
  • gateway.debian.lnx - 192.168.10.254 - egy gateway gép ami az átjárást biztosítja a szeparált virtuális hálózat és a lan között.

A BIND9 telepítése

Parancssorban root felhasználóként telepítsük a bind9 csomagot.

# apt-get install bind9

Miután feltelepült, a szolgáltatás egyből fut, ellenőrizzük.

# systemctl status bind9
● bind9.service - BIND Domain Name Server
   Loaded: loaded (/lib/systemd/system/bind9.service; enabled)
  Drop-In: /run/systemd/generator/bind9.service.d
           └─50-insserv.conf-$named.conf
   Active: active (running) since k 2016-03-01 20:12:43 CET; 22min ago
     Docs: man:named(8)
 Main PID: 375 (named)
   CGroup: /system.slice/bind9.service
           └─375 /usr/sbin/named -f -u bind
...

Először állítsuk be a forwarders opciót. Ez teszi lehetővé, hogy ha olyan DNS kérés érkezik a kiszolgálóhoz, amit nem tud feloldani, akkor a kérést továbbítja egy megadott másik DNS szerverhez feloldásra. A következő fontos beállítás, az allow-query. Ez mondja meg a DNS szervernek, hogy mely tartományoktól fogadhat csak el DNS lekérdezéseket. Nyissuk meg hát a named.conf.options fájlt és állítsuk be ezeket.

# nano named.conf.options
...
	forwarders {
		8.8.8.8;
	};
	allow-query { 192.168.10.0/24; 127.0.0.1; };
...

A forwardersnél megadhatjuk a szolgáltatónk, a google publikus vagy bármely a hálózatban elérhető DNS szerver címét.

A következő feladat, hogy a named.conf.local fájlba felvesszük a debian.lnx tartományunkat.

# nano named.conf.local
zone "debian.lnx" {
        type master;
        file "/etc/bind/db.debian.lnx";
};

zone "10.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.192";
};

Ügyeljünk a sorvégi és a kapcsos zárójelek végén levő pontos vesszőkre. Most csináljunk egy másolatot a db.empty fájlból db.debian.lnx néven. Majd a localhost-ot cseréljük debian.lnx-re.

# cp db.empty db.debian.lnx
# sed -i s/localhost/debian\.lnx/g db.debian.lnx

Az utolsó sorban az NS rekordot javítsuk ki dns.debian.lnx-re és vegyük fel a többi nevet és címet.

# nano db.debian.lnx
...
@	IN	NS	dns.debian.lnx.
dns	IN	A	192.168.10.10
host	IN	A	192.168.10.100
gateway	IN	A	192.168.10.254

A reverse fájlal, vagyis a db.192-vel járjunk el hasonlóan.

# cp db.empty db.192
# sed -i s/localhost/debian\.lnx/g db.192

Az utolsó sorban itt is javítsuk az NS rekordot és vegyük fel a többi gép reverse (PTR) címét.

# nano db.192
...
@	IN	NS	dns.debian.lnx.
10	IN	PTR	dns.debian.lnx.
100	IN	PTR	host.debian.lnx.
254	IN	PTR	gateway.debian.lnx.

Ha változtatunk a zóna fájl (esetünkben db.debian.lnx, db.192) tartalmán, akkor a benne lévő Serial opción növelni kell hogy a DNS szerver reload után életbelépjenek azok. Újraindítás (restart) esetén újratölti a zóna fájlokat, de reload esetén ha a Serial nem változik, akkor nem. A Serial tartalmát csak simán növelhetjük, de a bevett szokás, hogy a módosítás dátumát irjuk ide hozzátéve egy két jegyű számot a végére, jelezvén a napon belüli esetleges változások számát pl. 2016022901.

# cat /etc/bind/db.debian.lnx 
$TTL	604800
@	IN	SOA	debian.lnx. root.debian.lnx. (
			2016022901	; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	dns.debian.lnx.
dns	IN	A	192.168.10.10
host	IN	A	192.168.10.100
gateway	IN	A	192.168.10.254
# cat /etc/bind/db.192
$TTL	604800
@	IN	SOA	debian.lnx. root.debian.lnx. (
			2016022901	; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	dns.debian.lnx.
10	IN	PTR	debian.lnx.
100	IN	PTR	host.debian.lnx.
254	IN	PTR	gateway.debian.lnx.

Mielött ujratöltjük a DNS szerver konfigokat, ellenőrizzük azokat.

# named-checkconf /etc/bind/named.conf.local 
# named-checkconf /etc/bind/named.conf.options

Ha nem ad vissza semmit, akkor nincs benne hiba. Most a zone fájlok ellenörzése következik.

# named-checkzone debian.lnx db.debian.lnx 
zone debian.lnx/IN: loaded serial 2016022903
OK
# named-checkzone 10.168.190.in-addr.arpa db.192
zone 10.168.190.in-addr.arpa/IN: loaded serial 2016022901
OK

Úgy néz ki, hogy szintaktikailag minden rendben. Nincs más hátra, mint a DNS szerver konfigurációk újratöltése.

# systemctl reload bind9

A host és a gateway gépre belépve, állítsuk be a /etc/resolv.conf-ba, hogy az új DNS szerver legyen használva.

# nano /etc/resolv.conf
nameserver 192.168.10.10

Ha ez meg van akkor ellenőrizzük, hogy az új DNS szerver feloldja-e az gépneveket.

# nslookup gateway.debian.lnx
Server:		192.168.10.10
Address:	192.168.10.10#53

Name:	gateway.debian.lnx
Address: 192.168.10.254

# nslookup host.debian.lnx
Server:		192.168.10.10
Address:	192.168.10.10#53

Name:	host.debian.lnx
Address: 192.168.10.100

# nslookup dns.debian.lnx
Server:		192.168.10.10
Address:	192.168.10.10#53

Name:	dns.debian.lnx
Address: 192.168.10.10

Most nézzünk egy olyan címet, amit biztosan nem tud helyben feloldani és egy másik DNS szerverhez kell fordulnia. Kérjük meg dig utasítással a szerverünket, hogy oldja fel a www.index.hu domain nevet.

# dig @192.168.10.10 www.index.hu

; <<>> DiG 9.9.5-9+deb8u5-Debian <<>> @192.168.10.10 www.index.hu
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11439
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.index.hu.			IN	A

;; ANSWER SECTION:
www.index.hu.		89	IN	A	217.20.130.99

;; AUTHORITY SECTION:
.			11755	IN	NS	c.root-servers.net.
.			11755	IN	NS	d.root-servers.net.
.			11755	IN	NS	g.root-servers.net.
.			11755	IN	NS	h.root-servers.net.
.			11755	IN	NS	m.root-servers.net.
.			11755	IN	NS	j.root-servers.net.
.			11755	IN	NS	l.root-servers.net.
.			11755	IN	NS	f.root-servers.net.
.			11755	IN	NS	k.root-servers.net.
.			11755	IN	NS	a.root-servers.net.
.			11755	IN	NS	b.root-servers.net.
.			11755	IN	NS	e.root-servers.net.
.			11755	IN	NS	i.root-servers.net.

;; Query time: 203 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Thu Mar 03 20:39:07 CET 2016
;; MSG SIZE  rcvd: 268

Látható, hogy minden további nélkül feloldotta, vagyis a forwarders opció működik. Ha most még egyszer lekérjük ugyanezt, akkor a válasz végén levő statisztikából kiderül, hogy már nem fordul a másik DNS szerverhez, hanem cache-böl válaszol rá, amit láthatunk a Query time különbségéből.

# dig @192.168.10.10 www.index.hu
; <<>> DiG 9.9.5-9+deb8u5-Debian <<>> @192.168.10.10 www.index.hu
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23696
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1
...

...
;; Query time: 31 msec
;; SERVER: 192.168.10.10#53(192.168.10.10)
;; WHEN: Thu Mar 03 20:44:37 CET 2016
;; MSG SIZE  rcvd: 268

Így már csak 31 msec a válasz idő az elöbbi 203-al szemben.

Ez már elég, ahhoz hogy a BIND9 DNS szerver alapszinten működjön. A késöbbiek folyamán majd leírom, a DNS szerverünk kiegészítését egy slave DNS szerverrel, ahova autómatán szinkronizálódnak majd a zóna változások és a fő DNS szerver kiesése esetén tökéletesen működik, mint tartalék DNS szerver.