Lokaler DNS-Server

Ein lokaler DNS Server in einem Hausinternen Netzwerk sorgt für Überblick und für leicht über Namen erreichbare Server. Für mache Dienste wie z.B. Mailverkehr im LAN ist ein DNS-Server auch zwingend erforderlich. (für firmeninterne Mailadressen).

Was genau ein DNS-Server ist und wie das ganze im Prinzip funktioniert würde hier den Rahmen sprengen darum verweise ich hier auf Wikipedia – Domain Name System.

Das hier ist allerdings nur eine Erklärung wie man einen DNS-Server zu Hause oder in einer kleinen Firma (bis ca. 50 Büromitarbeiter… ) verwalten und einrichten kann. (Es gibt auch andere Möglichkeiten und Hersteller von DNS-Servern) im Prinzip ist es aber das gleiche. In dieser Anleitung werden nur einfache Files zum speichern der Informationen verwendet. Bei größeren Netzwerken würde ich das ganze mit einer Datenbank/LDAP umsetzen. Je nach den vorhandenen Systemen und Anforderungen kann natürlich auch ein Windows Server oder ein Apple für eine diese Aufgabe die sinnvollere Lösung sein.

Die Installation des DNS-Servers erfolgt natürlich über die Paketverwaltung

apt-get install bind9

Da der DNS-Server noch keine vernünftige Konfiguration hat wird der erst mal gestoppt

/etc/init.d/bind9 stop

Konfiguration

Die zentrale Konfigurationsdatei von bind ist die /etc/bind/named.conf

/etc/bind/named.conf

// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the 
// structure of BIND configuration files in Debian, *BEFORE* you customize 
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

Wie man schön erkennen kann steht unter Debian in dieser fast nichts. Die Konfiguration wird zur besseren Übersicht aufgeteilt. Diese Aufteilung behalte ich auch bei. Bei großen Konfigurationen kann man das ganze auch selbst etwas besser Aufteilen oder gleich in eine Datenbank oder einen LDAP-Server auslagern.

Anlegen der Zonen

Eine Zone ist ein Namensraum. Man besitzt zum Beispiel die 2nd Level Domain mustermann.at innerhalb dieser Domain gibt es wiederum verschiedene Namen die wiederum IPs, CNAMEs zugewiesen sind www.mustermann.at, mail.mustermann.at, max.mustermann.at, susi.mustermann.at …

Es gibt zwei Arten von Zonen die „forward lookup“ Zone und die „reverse lookup“ Zone. Die forward lookup Zone ist für die auflösung von Namen in IP Adresse zuständig. Also die am meisten gebrauchte Zone. Allerdings ist es auch ratsam eine reverse lookup Zone zu definieren und zu pflegen um die lokalen IPs zu verwalten und die vorhandenen IPs auch einem Namen zuordnen zu können.

Die Zonen müssen in der named.conf.local defniniert werden.

/etc/bind/named.conf.local

//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

zone "trabauer.local" {
	type master;
	file "/etc/bind/db.trabauer.local";	};

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

Die eigentlichen Informationen der Zonen werden in den entsprechen Files angegeben. Die Namen der Konfigurationsdateien sind im Prinzip egal, ich würde aber empfehlen die Dateien einfach nach den Zonen zu benennen. db. ist die gängige Namensgebung.

Forward lookup Zone

/etc/bind/db.trabauer.local

; BIND data file for trabauer.local
; /etc/bind/db.trabauer.local
;
$TTL	86400
@	IN	SOA	trabauer.local. root.trbauer.local. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@				IN	NS	majestix.trabauer.local.
				IN	MX	10 majestix.trabauer.local.
				IN	A	192.168.0.2

majestix				IN	A	192.168.0.2
router				IN	A	192.168.0.1
ap1					IN	A	192.168.0.3
ap2					IN	A	192.168.0.4
hp3000				IN	A	192.168.0.96
asterix				IN	A	192.168.0.8
fritzbox				IN	CNAME	router

Reverse lookup Zone

/etc/bind/db.0.168.192

; BIND reverse data file for rfc1918 zone
; /etc/bind/db.192.168.0

$TTL	86400
@	IN	SOA	trabauer.local. root.trabauer.local. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS	majestix.trabauer.local.
1	IN	PTR	router.trabauer.local.
3	IN	PTR	ap1.trabauer.local.
4	IN	PTR	ap2.trabauer.local.
8	IN	PTR	asterix.trabauer.local.
96	IN	PTR	hp3000.trabauer.local.

Starten des DNS-Servers

/etc/init.d/bind9 start

Der BIND DNS Server ist recht zickig was die Konfigurationdateien betrifft. Um Fehler festzustellen sollte man am besten die Logs in einer zweiten Session mit tail -f verfolgen.

Fehler findet man einfach schneller wenn man genauere Informationen hat.

Feb 20 11:30:17 majestix named[22752]: starting BIND 9.7.2-P3 -u bind
Feb 20 11:30:17 majestix named[22752]: built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-dlz-postgres=no' '--with-dlz-mysql=no' '--with-dlz-bdb=yes' '--with-dlz-filesystem=yes' '--with-dlz-ldap=yes' '--with-dlz-stub=yes' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=' 'CPPFLAGS='
Feb 20 11:30:17 majestix named[22752]: adjusted limit on open files from 1024 to 1048576
Feb 20 11:30:17 majestix named[22752]: found 4 CPUs, using 4 worker threads
Feb 20 11:30:17 majestix named[22752]: using up to 4096 sockets
Feb 20 11:30:17 majestix named[22752]: loading configuration from '/etc/bind/named.conf'
Feb 20 11:30:17 majestix named[22752]: /etc/bind/named.conf.local:18: unexpected end of input 
Feb 20 11:30:17 majestix named[22752]: loading configuration: unexpected end of input
Feb 20 11:30:17 majestix named[22752]: exiting (due to fatal error)
Feb 20 11:32:35 majestix named[22787]: starting BIND 9.7.2-P3 -u bind

War ein Tippfehler in der etc/bind/named.conf.local in der Zeile 18

Auch fehlende wichtige Einträge können Probleme verursachen

Feb 20 11:32:35 majestix named[22787]: zone 0.in-addr.arpa/IN: loaded serial 1
Feb 20 11:32:35 majestix named[22787]: zone 127.in-addr.arpa/IN: loaded serial 1
Feb 20 11:32:35 majestix named[22787]: zone 0.168.192.in-addr.arpa/IN: loaded serial 1
Feb 20 11:32:35 majestix named[22787]: zone 255.in-addr.arpa/IN: loaded serial 1
Feb 20 11:32:35 majestix named[22787]: zone trabauer.local/IN: NS 'majestix.trabauer.local' has no address records (A or AAAA)
Feb 20 11:32:35 majestix named[22787]: zone trabauer.local/IN: not loaded due to errors.
Feb 20 11:32:35 majestix named[22787]: zone localhost/IN: loaded serial 2
Feb 20 11:32:35 majestix named[22787]: managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found
Feb 20 11:32:35 majestix named[22787]: managed-keys-zone ./IN: loaded serial 0
Feb 20 11:32:35 majestix named[22787]: running
Feb 20 11:34:30 majestix named[22787]: received control channel command 'stop -p'
Feb 20 11:34:30 majestix named[22787]: shutting down: flushing changes
Feb 20 11:34:30 majestix named[22787]: stopping command channel on 127.0.0.1#953
Feb 20 11:34:30 majestix named[22787]: stopping command channel on ::1#953
Feb 20 11:34:30 majestix named[22787]: no longer listening on ::#53
Feb 20 11:34:30 majestix named[22787]: no longer listening on 127.0.0.1#53
Feb 20 11:34:30 majestix named[22787]: no longer listening on 192.168.0.2#53

Hier hab ich in meiner trabauer.local Domain vergessen einen A Record für den Server an zu legen

Der erfolgreiche Start des DNS-Servers sieht so aus

Feb 20 11:34:31 majestix named[22826]: starting BIND 9.7.2-P3 -u bind
Feb 20 11:34:31 majestix named[22826]: built with '--prefix=/usr' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--sysconfdir=/etc/bind' '--localstatedir=/var' '--enable-threads' '--enable-largefile' '--with-libtool' '--enable-shared' '--enable-static' '--with-openssl=/usr' '--with-gssapi=/usr' '--with-gnu-ld' '--with-dlz-postgres=no' '--with-dlz-mysql=no' '--with-dlz-bdb=yes' '--with-dlz-filesystem=yes' '--with-dlz-ldap=yes' '--with-dlz-stub=yes' '--with-geoip=/usr' '--enable-ipv6' 'CFLAGS=-fno-strict-aliasing -DDIG_SIGCHASE -O2' 'LDFLAGS=' 'CPPFLAGS='
Feb 20 11:34:31 majestix named[22826]: adjusted limit on open files from 1024 to 1048576
Feb 20 11:34:31 majestix named[22826]: found 4 CPUs, using 4 worker threads
Feb 20 11:34:31 majestix named[22826]: using up to 4096 sockets
Feb 20 11:34:31 majestix named[22826]: loading configuration from '/etc/bind/named.conf'
Feb 20 11:34:31 majestix named[22826]: reading built-in trusted keys from file '/etc/bind/bind.keys'
Feb 20 11:34:31 majestix named[22826]: using default UDP/IPv4 port range: [1024, 65535]
Feb 20 11:34:31 majestix named[22826]: using default UDP/IPv6 port range: [1024, 65535]
Feb 20 11:34:31 majestix named[22826]: listening on IPv6 interfaces, port 53
Feb 20 11:34:31 majestix named[22826]: listening on IPv4 interface lo, 127.0.0.1#53
Feb 20 11:34:31 majestix named[22826]: listening on IPv4 interface eth0, 192.168.0.2#53
Feb 20 11:34:31 majestix named[22826]: generating session key for dynamic DNS
Feb 20 11:34:31 majestix named[22826]: set up managed keys zone for view _default, file 'managed-keys.bind'
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 254.169.IN-ADDR.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 2.0.192.IN-ADDR.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 100.51.198.IN-ADDR.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 113.0.203.IN-ADDR.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 255.255.255.255.IN-ADDR.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: D.F.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 8.E.F.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 9.E.F.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: A.E.F.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: B.E.F.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA
Feb 20 11:34:31 majestix named[22826]: command channel listening on 127.0.0.1#953
Feb 20 11:34:31 majestix named[22826]: command channel listening on ::1#953
Feb 20 11:34:31 majestix named[22826]: zone 0.in-addr.arpa/IN: loaded serial 1
Feb 20 11:34:31 majestix named[22826]: zone 127.in-addr.arpa/IN: loaded serial 1
Feb 20 11:34:31 majestix named[22826]: zone 0.168.192.in-addr.arpa/IN: loaded serial 1
Feb 20 11:34:31 majestix named[22826]: zone 255.in-addr.arpa/IN: loaded serial 1
Feb 20 11:34:31 majestix named[22826]: zone trabauer.local/IN: loaded serial 1
Feb 20 11:34:31 majestix named[22826]: zone localhost/IN: loaded serial 2
Feb 20 11:34:31 majestix named[22826]: managed-keys-zone ./IN: loading from master file managed-keys.bind failed: file not found
Feb 20 11:34:31 majestix named[22826]: managed-keys-zone ./IN: loaded serial 0
Feb 20 11:34:31 majestix named[22826]: running

Testen des DNS-Servers

Mit dem Programm dig kann man gezielte Anfragen an einen DNS Server stellen. Das Programm eignet sich also perfekt um einen DNS Server zu testen.

root@majestix /etc/bind # dig @127.0.0.1 majestix.trabauer.local

; <<>> DiG 9.7.2-P3 <<>> @127.0.0.1 majestix.trabauer.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47546
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;majestix.trabauer.local.	IN	A

;; ANSWER SECTION:
majestix.trabauer.local. 86400	IN	A	192.168.0.2

;; AUTHORITY SECTION:
trabauer.local.		86400	IN	NS	majestix.trabauer.local.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 20 11:36:13 2011
;; MSG SIZE  rcvd: 71

root@majestix /etc/bind # dig @127.0.0.1 fritzbox.trabauer.local

; <<>> DiG 9.7.2-P3 <<>> @127.0.0.1 fritzbox.trabauer.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24782
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;fritzbox.trabauer.local.	IN	A

;; ANSWER SECTION:
fritzbox.trabauer.local. 86400	IN	CNAME	router.trabauer.local.
router.trabauer.local.	86400	IN	A	192.168.0.1

;; AUTHORITY SECTION:
trabauer.local.		86400	IN	NS	majestix.trabauer.local.

;; ADDITIONAL SECTION:
majestix.trabauer.local. 86400	IN	A	192.168.0.2

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 20 11:36:32 2011
;; MSG SIZE  rcvd: 117

Damit läuft der DNS Server und man kann den DNS-Server nun auf allen Clients im LAN eintragen. Das kann man manuell machen oder aber einfach den DNS-Server am lokalen DHCP-Server eintragen. Kann man dies nicht am lokalen Router eintragen. Kann man den Server auch gleich als DHCP-Server einrichten und diesen die ganzen Clients konfigurieren lassen. Wie man einen DHCP-Server einrichtet findet man im Artikel DHCP-Server.

About Florian