home Sonstiges Linux OpenBSD Links

DNS-Server mit BIND

Ein DNS-Server dient dazu, einen Domainnamen in eine IP aufzulösen. (www.marty44.net hat zum Beispiel die IP 81.88.34.44) Wozu das gut sein soll? Computer können sich nur über die IP verständigen, aber für den normalen Menschen ist das unbrauchbar, da er sich eher Namen merken kann.

1. Installation der Software
Ich habe die Version 9.2.2 von BIND verwendet. Wenn man allerdings mal ab und zu freshmeat liest, dann wird einen auffallen, das BIND ziemlich oft dort mit neuen Versionen auftaucht. BIND kann man unter http://www.isc.org/products/BIND/bind9.html runterladen. So sollte die Installation erfolgen:

www:# cd /usr/src/
www:/usr/src# tar xfz /von/wo/auch/immer/bind-9.2.2.tar.gz
www:/usr/src# cd bind-9.2.2
www:/usr/src/bind-9.2.2# ./configure
www:/usr/src/bind-9.2.2# make
www:/usr/src/bind-9.2.2# make install
Bei meiner Uralt-Debian-Version (2.1) mit Kernel 2.2.17 tauchte folgender Fehler beim make auf:
unix/os.o: In function 'linux_keepcaps':
/usr/src/bind-9.2.2/bin/named/unix/os.c:249: undefined reference to 'prctl'
make[2]: *** [named] Error 1
make[2]: Leaving directory /usr/src/bind-9.2.2/bin/named'
make[1]: *** [subdirs] Error 1
make[1]: Leaving directory /usr/src/bind-9.2.2/bin'
make: *** [subdirs] Error 1
Wenn dies auftreten sollte, dann die Datei /usr/src/bind-9.2.2/bin/named/unix/os.c folgendermaßen ändern (Ausschnitt ab Zeile 249):
---Anfang vorher---
        if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) < 0) {
                if (errno != EINVAL)
                        isc__strerror(errno, strbuf, sizeof(strbuf));
                        ns_main_earlyfatal("prctl() failed: %s", strbuf);
        } else {
                non_root_caps = ISC_TRUE;
                if (getuid() != 0)
                        non_root = ISC_TRUE;
        }
}
---Ende vorher---
---Anfang nachher (rot markiert die Änderungen)---
/*      if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) < 0) {
                if (errno != EINVAL)
                        isc__strerror(errno, strbuf, sizeof(strbuf));
                        ns_main_earlyfatal("prctl() failed: %s", strbuf);
        } else { */
                non_root_caps = ISC_TRUE;
                if (getuid() != 0)
                        non_root = ISC_TRUE;
/*      } */
}
---Ende nachher---

Was dieses bewirkt? Laut http://www.they.com/doc/bind9/changelog steht ab Kernel 2.3.99 eine Funktion zur Verfügung, die BIND als nicht-root laufen läßt, da ich aber Kernel 2.2.17 habe und dieser diese Option nicht zu unterstützen scheint, habe ich somit die ganze Abfrage einfach auskommentiert. BIND muß jetzt allerdings unbedingt unter dem User root laufen! Dies ist unter Sicherheitsaspekten nicht so toll... Vielleicht sollte ich so langsam doch mal auf eine aktuelle Distro umsteigen ;)

2. Konfiguration der Dateien
Es müssen etliche Dateien konfiguriert werden, bevor der DNS-Server läuft:

/etc/host.conf - hier wird eingetragen, was zuerst zur DNS-Auflösung benutzt werden soll (/etc/hosts oder der DNS-Server)

order hosts,bind
multi on
/etc/resolv.conf - hier wird eingestellt, was DNS-Kurznamen anzuhängen ist (hier: marty44.net) und welcher DNS-Server zur Abfrage benutzt werden soll (natürlich der, den wir gerade konfigurieren ;) )
search marty44.net
nameserver 192.168.44.1
/etc/named.conf - ist eine Datei vom DNS-Server. Hier wird als erstes eingestellt, wo die Zonendaten liegen (unter /var/named). Danach folgen die DNS-Server, die abgefragt werden sollen, wenn sie der eigene DNS-Server nicht weis (forwarders { ... }). Als nächstes wird die Rootzone (.) definiert, genauere Angaben über sie findet man in der Datei named.root. Weiter geht es mit der Zone localhost für die Auflösung von einen DNS-Namen in eine IP und die Zone für die Auflösung einer IP in einen DNS-Namen (0.0.127.in-addr.arpa). Das selbe dann nochmal für marty44.net.
options {
        directory "/var/named";
        forwarders { 195.185.185.195; 212.185.255.231; };
};

zone "." { type hint; file "named.root"; };

zone "localhost" IN { type master; file "pz/localhost"; allow-update { none; }; };

zone "0.0.127.in-addr.arpa" { type master; file "pz/0.0.127"; allow-update { none; }; };

zone "marty44.net" IN { type master; file "pz/marty44"; };

zone "44.168.192.in-addr.arpa" { type master; file "pz/44.168.192"; };

Es müssen noch zwei Verzeichnisse angelegt werden:
www:# mkdir /var/named
www:# mkdir /var/named/pz
Die Datei mit den Root Nameservern wird mit Hilfe des dig Tools heruntergeladen:
www:# cd /var/named
www:/var/named# dig @e.root-servers.net . ns > named.root
Die Datei kann auch von ftp://ftp.rs.internic.net/domain/named.root heruntergeladen werden, allerdings sollte man immer den Weg über das dig Tool nehmen.

Jetzt brauchen wir noch 4 Zonendateien unter /var/named/pz

/var/named/pz/0.0.127

$TTL 24h
0.0.127.in-addr.arpa.   IN      SOA     localhost. marty.marty44.net. (
                        2002062901
                        3h
                        1h
                        1w
                        1h
                        )
                        IN      NS      w3.marty44.net.
1                       IN      PTR     localhost.
/var/named/pz/44.168.192
$TTL 3h
44.168.192.in-addr.arpa.         IN      SOA     w3.marty44.net. marty.marty44.net. (
                                 2002062901
                                 3h
                                 1h
                                 1w
                                 1h
                                 )
                                 IN      NS      w3.marty44.net.
1                                IN      PTR     w3.marty44.net.
2                                IN      PTR     vdr.marty44.net.
3                                IN      PTR     moehre.marty44.net.
4                                IN      PTR     nc.marty44.net.
29                               IN      PTR     o2.marty44.net.
44                               IN      PTR     marty.marty44.net.
55                               IN      PTR     indy.marty44.net.
254                              IN      PTR     h254.marty44.net.
/var/named/pz/localhost
$TTL 24h
localhost.      IN      SOA     localhost. marty.marty44.net. (
                2002062901
                3h
                1h
                1w
                1h
                )
                IN      NS      w3.marty44.net.
localhost       IN      A       127.0.0.1
/var/named/pz/marty44
$TTL 3h
marty44.net.    IN      SOA     w3.marty44.net. marty.marty44.net. (
                2002062901
                3h
                1h
                1w
                1h
                )
                IN      NS      w3.marty44.net.
w3              IN      A       192.168.44.1
dns             IN      CNAME   w3
martyserver     IN      CNAME   w3
irc             IN      CNAME   w3
gw              IN      CNAME   w3
dhcpserver      IN      CNAME   w3
vdr             IN      A       192.168.44.2
moehre          IN      A       192.168.44.3
nc              IN      A       192.168.44.4
o2              IN      A       192.16.44.29
marty           IN      A       192.168.44.44
indy            IN      A       192.168.44.55
www             IN      A       81.88.34.44
h254            IN      A       192.168.44.254
3. Starten des Servers
Gestartet wird der DNS-Server durch die Eingabe von named. Mit killall named beendet man ihn wieder. Mit einen tail -f /var/log/daemon.log kann man prüfen, ob der Server richtig starten. Hier werden auch eventuelle Fehler in den Konfigurationsdateien angezeigt.

4. Testen des Servers
Wenn der Server läuft, pingt man einfach eine Adresse an, wenn der Name aufgelöst wird zu einer IP, funktioniert er ;)

5. Start-Stop-Script
Wenn der DNS-Server beim Booten automatisch gestartet werden soll, legt man folgendes Script an:
/etc/init.d/bind

#!/bin/sh
#
# Start and Stop bind DNS-Server

case "$1" in start) echo "Starting DNS-Server bind" /usr/local/sbin/named ;; stop) echo "Stopping DNS-Server bind" killall named ;; *) echo "Usage: /etc/init.d/bind {start|stop}" exit 1 ;; esac

exit 0

Abschließend müssen noch die symbolischen Links gesetzt werden:
# cd /etc/rc0.d
/etc/rc0.d# ln -s ../init.d/bind K21bind
/etc/rc0.d# cd ../rc1.d
/etc/rc1.d# ln -s ../init.d/bind K21bind
/etc/rc1.d# cd ../rc2.d
/etc/rc2.d# ln -s ../init.d/bind S19bind
/etc/rc2.d# cd ../rc6.d
/etc/rc6.d# ln -s ../init.d/bind K21bind
Diese Seite stellt nur Basisinformationen zur Verfügung. Es gibt noch dutzende von anderen Einstellungen sowie Möglichkeiten (zum Beispiel dynamisches DNS mit DHCP), was man mit BIND so alles anstellen kann. Zu empfehlen ist das Buch "DNS und BIND" von Paul Albitz und Cricket Liu.


zurück zur Linux-Übersicht
Letzte Aktualisierung dieser Seite: 13. November 2006