DNS-Server bind

Als DNS nutzen wir bind in einer möglichst aktuellen Version, da immer wieder Sicherheitslücken bekannt werden, die teilweise sehr prekär sind.

root@krypton:~ > named -v
BIND 9.2.0rc1

Die Datei /etc/hosts kann leer bleiben. In /etc/resolv.conf sind die folgenden Einträge nötig, damit der DNS auch befragt wird. Der Search-Parameter bewirkt, dass bei einer Anfrage an host nach host.laas.priv gesucht wird.

root@krypton:~ > cat /etc/resolv.conf
domain laas.priv
search laas.priv
nameserver 192.168.0.1

In /etc/host.conf ist folgendes einzutragen. Damit wird nur der Nameserver befragt.

order bind
multi on

Der Hauptteil der Konfiguration findet in /etc/named/named.conf statt. Beispielhaft meine Konfiguration.

#/etc/named/named.conf

# predefined access control lists (acl):
# "any"         allows all hosts
# "none"        denies all hosts
# "localhost"   allows the IP adresses of all interfaces of the system
# "localnets"   allows any host on a network of the local interfaces
#
# defining an additional ACL:
acl "trusted" {
  127.0.0.1/32;
  192.168.0.0/16;
};

#never allow requests from these hosts
acl "bogon" {
  0.0.0.0/8;
  1.0.0.0/8;      #IANA reserved
  2.0.0.0/8;      #IANA reserved
  192.0.2.0/24;   #test addresses
  224.0.0.0/3;    #multicast addresses
  10.0.0.0/8;     #here not used private network
  172.16.0.0/12;  #here not used private network
};

options {
  directory "/etc/named";
  # the default is to fail, if the master file is not correct
  #check-names master ignore;

  pid-file "/var/run/named.pid";

  # the default is to ask the forwarders and if they fail
  # try to find the answer yourself, this will only ask the forwarders
  # forward only;
  # list of DNS servers to ask
  # forward first;
  forwarders {
    #T-Online
    194.25.0.125;
    194.25.2.129;
    194.25.2.130;
    194.25.2.131;
    #Nexgo
    145.253.2.11;
    145.253.2.75;
    #TUB
    130.149.17.5;
    130.149.17.13;
    #Arcor???
    #212.185.151.9;
  };
  # the default is to listen on port 53 on all available interfaces
  # you can also give a detailed list:
  listen-on port 5353 {
    127.0.0.1;
    192.168.0.1;
    192.168.1.1;
  };

  #allow only queries from trusted hosts
  allow-query {
    "trusted";
  };

  allow-recursion {
    "trusted";
  };

  allow-transfer {
    "trusted";
  };

  blackhole {
    bogon;        #ignore requests from these hosts
  };
};

#log every query in "/var/log/named"
logging {
  channel mychannel {
    file "/var/log/named";
    severity info;
    print-time yes;
  };

  category security {
    mychannel;
  };

  category queries {
    mychannel;
  };
};

#definitions of the zones, the ".", "localhost", and "0.0.127.in-addr.arpa" zones has to be defined everytime
#note the reverse notation of the network addresses
zone "." {
  type hint;
  file "root.hint";
};

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

#assign every name an ip number
zone "laas.priv" {
  type master;
  file "pz/laas.priv";
};

#and twice versa (reverse dns)
zone "0.168.192.in-addr.arpa" {
  type master;
  file "pz/192.168.0";
};

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

Jetzt definieren wir noch die einzelnen Zonen. Jede Zone wird in zwei Dateien festgelegt, die in /etc/name/pz residieren. Die /etc/named/pz/127.0.0 ist immer zu anzugeben. Beispielhaft ist meine Einstellung für die Zone laas.priv /etc/named/pz/laas.priv aufgeführt.

$ORIGIN .
$TTL 86400; 1 day
laas.priv IN SOA  www root.localhost (
  12         ; serial
  86400      ; refresh (1 day)
  600        ; retry (10 minutes)
  604800     ; expire (1 week)
  86400      ; minimum (1 day)
)

NS      ns
HINFO   "Pentium Celeron 700 Coppermine" "Linux 2.4.20"
MX      10 mail
TXT     "ns.laas.priv, my own DNS-Server"

$ORIGIN laas.priv.
ftp                     A       192.168.0.1
krypton                 A       192.168.0.1
mail                    A       192.168.0.1
news                    A       192.168.0.1
ns                      A       192.168.0.1
proxy                   A       192.168.0.1
test                    A       192.168.1.1
www                     A       192.168.0.1

mig                     A       192.168.0.2
mutter                  A       192.168.0.2

xenon                   A       192.168.0.3

Die erste Zeile dient dazu, dem named zu sagen, wie lange er die Anfragen in seinem Zwischenspeicher halten soll. Der anschließende Block legt fest, dass der Nameserver www.laas.priv und der Administrator unter root@krypton.laas.priv zu erreichen sind. Der Punkt am Ende der Namen bedeutet, dass die Domäne laas.priv nicht noch an den String angehängt wird. IN SOA bedeutet Internet Start of Authority. NS steht für Nameserver. Wir sind selbst unser Nameserver. Die letzten Zeilen definieren die Rechner in dieser Domäne. mig A 192.168.0.2 legt fest, dass der Rechner mig.laas.priv unter der IP-Adresse 192.168.0.2 bekannt ist.

Nun haben wir die Auflösung von Namen in IP-Adressen realisiert. Andersherum passiert das in der Datei /etc/named/pz/192.168.0.


Nun startet root den Nameserver testweise mit

su -u named -c named

Um zu überprüfen, ob wir alles korrekt gemacht haben, starten wir eine Anfrage: Da ich den DNS-Server unter einem weniger privilegierten Nutzer laufen lasse, kann ich den Standardport 53 leider nicht verwenden. Um diese Konfiguration zu überprüfen, muss entweder der bind als Root mit Port 53 gestartet werden, oder mit einer Firewall alle Anfragen auf Port 53 auf Port 5353 umgelenkt werden.

laas@krypton:~ > host www
www.laas.priv has address 192.168.0.1

laas@krypton:~ > dig www.laas.priv

; <<>> DiG 9.2.0 <<>> www.laas.priv
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47205
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;www.laas.priv.                   IN      A

;; ANSWER SECTION:
www.laas.priv.            86400   IN      A       192.168.0.1

;; AUTHORITY SECTION:
laas.priv.                86400   IN      NS      ns.

;; Query time: 6 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Tue Jun 25 23:48:08 2002
;; MSG SIZE  rcvd: 61

Nun haben wir einen Nameserver, der zusätzlich noch alle erfolgreichen Anfragen zwischenspeichert. D.h. wenn wir im Internet sind, so wird die erste Anfrage an einen Nameserver weitergeleitet, der in unserer forward-Liste steht. Die nächsten Anfragen werden direkt von unserem Server beantwortet. Leider wird bei jedem Neustart des Servers bzw. nach jeder Stunde der Cache geleert. Abhilfe würde hier der Name-Server-Cache-Dämon, kurz NSCD, schaffen.