1. Bind9 mit Replikation

Beide VMs sind mit Ubuntu 16.04 LTS ausgestattet und haben folgende wesentliche Eigenschaften:

  1. Master-Server

    • Hostname: uhu.dom1.site

    • IP-Adresse: 10.20.30.3

  2. Slave-Server:

    • Hostname: uhu2.dom1.site

    • IP-Adresse: 10.20.30.4

HINWEIS: Hier wird man am besten erst einmal mit sudo -i dauerhaft root.

1.1. Forwarders

Zur Erinnerung: Für die Weiterleitung ins Internet benötigen wir einen vorgeschalteten DNS-Server. Dies kann allgemein bei allen Servern geschehen. Dazu wurde die Direktive forwarders { 10.20.30.100; 144.76.34.109; }; aktiviert und angepasst:

options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                10.20.30.100;
                144.76.34.109;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

1.2. Master-Konfiguration

Hier ist besonders die Zeile notify yes; von Belang. Wir haben sie hinzugefügt, um den Slave bei Erhöhung der serial-Angabe informieren zu können, dass er sich die Daten replizieren muss:

=> cat /etc/bind/named.conf.local
zone "dom1.site" {
        type master;
        notify yes;
        file "/etc/bind/db.dom1.site";
};

zone "30.20.10.in-addr.arpa" {
        type master;
        notify yes;
        file "/etc/bind/db.10.20.30";
};

AUFGABE: Bitte die Sicherheit mit allow-transfer verbesseren! Siehe dazu Seite 319.

Im entsprechenden Zonenfile ist es wichtig, den zweiten Nameserver, der als Slave fungieren soll, auch als solchen mit aufzunehmen. Dies wird durch die Zeile @ IN NS uhu2.dom1.site. realisiert, die hinzugefügt werden muss. Vergisst man dies, kann sich zwar der Slave die Daten bei einem systemctl restart bind9 selber ziehen, wird aber nicht vom Master mittels seiner notify-Nachrichten über Änderugen informiert:

=> cat /etc/bind/db.dom1.site
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     uhu.dom1.site. root.uhu.dom1.site. (
                             90         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
; Dies ist der eigene, lokale Master-Nameserver:
@       IN      NS      uhu.dom1.site.

; HINZUGEFÜGT: Dies ist der andere, entfernte Slave-Nameserver:
@       IN      NS      uhu2.dom1.site.

uhu     IN      A       10.20.30.3
uhu     IN      AAAA    ::1

; Weitere Einträge (ähnlich der /etc/hosts, allerdings ZUERST die Hostnamen, DANN die IPs!)
uhu2    IN      A       10.20.30.4
xphost  IN      A       10.20.30.126
xphost2 IN      A       10.20.30.127

AUFGABE: Bitte auch die reversen Zonenfiles anpassen!

1.3. Slave-Konfiguration

Hier ist zuerst einmal wichtig, anzugeben, wer der Master ist, von dem dann die Daten kopiert werden sollen. Das legen wir mit der Anweisung masters { 10.20.30.3; }; fest:

⇒ cat /etc/bind/named.conf.local

zone "dom1.site" {
        type slave;
        masters { 10.20.30.3; };
        file "/etc/bind/db.dom1.site";
};

zone "30.20.10.in-addr.arpa" {
        type slave;
        masters { 10.20.30.3; };
        file "/etc/bind/db.10.20.30";
};

Dann brauchen wir auch wieder das Zonenfile. Anders als beim Master, wo wir den Slave mittels NS-Record eintragen mussten, sind für die Replikation keine besonderen Einstellungen erforderlich:

=> cat /etc/bind/db.dom1.site
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     uhu2.dom1.site. root.uhu2.dom1.site. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      uhu2.dom1.site.
uhu2    IN      A       10.20.30.4
uhu2    IN      AAAA    ::1

; Weitere Einträge sind hier auf dem Slave nicht erforderlich,
; da er sich die Datensätze repliziert.

1.4. Testing

  • Auf beiden Maschinen: tail -f /var/log/syslog

  • Auf dem Master

    • Datensatz hinzufügen

    • Seriennummer erhöhen

    • Config neu laden: rndc reload

1.5. Sicherheit

AUF DEM MASTER:

Um nur dem Slave-Server mit der Adresse 10.20.30.4 Zonentransfers zu erlauben (AXFR = Asynchronous Full Transfer Zone oder Asynchronous Xfer Full Range), verwenden wir allow-transfer:

zone "dom1.site" {
        type master;
        notify yes;
        allow-transfer { 10.20.30.4; };
        file "/etc/bind/db.dom1.site";
};

zone "30.20.10.in-addr.arpa" {
        type master;
        notify yes;
        file "/etc/bind/db.10.20.30";
};

Weiterhin kann man das ganz normale Abfragen der Datenbank (nslookup) reglementieren, in der Zonendefinition verwenden wir dazu so etwas:

allow-query { 127.0.0.1; 10.20.30.0/24; };

2. DHCP und DNS verbinden

ZIEL Einrichtung von dynamischen DNS (DDNS) unter Debian / Ubuntu

Siehe auch

2.1. Vorbereitung

DHCP- und DNS-Server sollten jeweils eingerichtet sein:

  • DHCP-Server: Deklaration eines Subnets mit gültigem Range

  • DNS-Server: Bereitstellung einer eigenen Zone für die Domäne "dom1.site", gern auch mit gültigen "forwarders"

  • Der Servername lautet im Beispiel "uhu"

HINWEIS: Die folgende Verzeichnisrecht-Anpassung von /etc/bind/ ist wegen rndc freeze und rndc thaw (siehe unten) unter Debian erforderlich, wenn der bind-Daemon seine Journaldateien in diesem Verzeichnis ablegen können soll:

=> chmod g+w /etc/bind

Besser ist aber im Fall von DDNS, die Zonen unter /var/lib/bind zu verwalten, zumal wir bei Ubuntu wegen AppArmor dazu gezwungen werden. Die Dateirechte sehen dort im übrigen so aus:

=> ls -ld /etc/bind
drwxr-sr-x 2 root bind 4096 Okt 30 11:17 /etc/bind

Wenn man also plant, die Zonendateien unter /var/lib/bind abzulegen, ist hier kein Handlungsbedarf.

2.2. Datei /etc/bind/named.conf

Unterhalb von include "/etc/bind/named.conf.options"; ist folgendes einzufügen:

controls {
          inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; };
};

2.3. Datei /etc/bind/named.conf.local

Wie eben erläutert, macht es Sinn, die Zonendateien an einen anderen Ort zu legen.

In jedem Zonenblock müssen wir nun den Pfad zu den Zonendateien mit Hilfe der "file"-Anweisung auf /var/lib/bind verbiegen, so dass diese Angaben dann z.B. so lauten könnten:

...

   file "/var/lib/bind/db.dom1.site";

...

   file "/var/lib/bind/db.10.20.30";

...

Weiterhin sind in jeden Zonenblock nach der "file"-Anweisung diese Direktiven erforderlich:

allow-update { key "rndc-key"; };
notify yes;

Und schließlich muss am Ende der Datei noch folgendes angefügt werden:

include "/etc/bind/rndc.key";

Falls die Zonendateien nicht bereits unter /var/lib/bind erstellt wurden, verschieben wir sie jetzt an diesen Ort:

=> mv /etc/bind/db.dom1.site /etc/bind/db.10.20.30 /var/lib/bind/

2.4. Datei /etc/dhcp/dhcpd.conf

Zuerst muss die Zeile ddns-update-style none; auskommentiert werden (Raute-Zeichen voranstellen):

#ddns-update-style none;

Danach fügt man gleich darunter folgendes ein, wobei server-identifier (= Servername) und ddns-domainname (= Domainname wie im DNS festgelegt) anzupassen sind:

server-identifier           uhu;
ddns-updates                on;
ddns-update-style           interim;
ddns-domainname             "dom1.site.";
ddns-rev-domainname         "in-addr.arpa.";
ignore                      client-updates;

# This is the key so that DHCP can authenticate it's self to BIND9
include                     "/etc/bind/rndc.key";

# This is the communication zone
zone dom1.site. {
      primary 127.0.0.1;
      key rndc-key;
}

2.5. Bei Ubuntu: Leserechte für rndc.key via AppArmor einräumen

Bei Ubuntu Server 16.04 LTS sind per Default die Sicherheitspolicies von AppArmor aktiv. Da sich /usr/sbin/named im enforce-Modus befindet, wird damit auch der Zugriff auf die Datei rndc.key blockiert.

Daher müssen wir AppArmors Konfigurationsdatei für den dhcpd ändern. Wie hier gezeigt, muss die Zeile /etc/dhcp/ddns-keys/** r, auskommentiert werden, danach ist eine neue Zeile hinzuzufügen, die der Datei /etc/bind/rndc.key explizit Leserechte verleiht:

=> vi /etc/apparmor.d/usr.sbin.dhcpd
  #/etc/dhcp/ddns-keys/** r,
  /etc/bind/rndc.key  r,

Nun müssen nur noch die Dateirechte angepasst und die AppArmor-Policies neu eingelesen werden:

=> chown root:bind /etc/bind/rndc.key
=> chmod 640 /etc/bind/rndc.key
=> /etc/init.d/apparmor reload

2.6. Testings

2.6.1. Serverseitig

Beide Server müssen sich nun ohne größere Fehlermeldungen neu starten lassen:

=> /etc/init.d/bind9 restart
=> /etc/init.d/isc-dhcp-server restart

Existiert bereits ein manuell hinzugefügter Eintrag z.B. für "xpbox" in der Zonendatenbank, findet keine dynamische Erzeugung eines RRs statt, auch wenn dem Host eine neue IP-Adresse via DHCP zugewiesen wird.

ACHTUNG: Wenn der Daemon im dynamischen Modus arbeitet (erkennbar am Vorhandensein der *.jnl-Dateien im Verzeichnis /etc/bind), darf der Zonenverwalter nicht einfach die Zonenfiles ändern!! Erst nach dem Ausführen von

=>  rndc freeze

kann er dies tun. Nach Beenden des Editierens und einem rndc reload, kann die dynamische Arbeitsweise wieder mit

=>  rndc thaw

gestartet werden, dabei entstehen wieder die Journaldateien.

2.6.2. Clientseitig

Bei Verwendung von TinyCore Linux als Testsystem für den DHCP-Client, kann man auf einfache Weise die IP-Adresse mit

=> udhcpc -R

freigeben (release).

Das Neubeziehen der IP-Informationen lässt sich problemlos mit der Option -F <HOSTNAME> machen, wobei testweise ein anderer FQDN gesendet und in die Zonendatenbank geschrieben wird:

=> udhcpc -F myTinyLinuxHost

2.7. Praktische Umsetzung auf dem Master-Nameserver (Ubuntu 16.04)

HINWEIS: Wir betrachten hier nur die für DDNS erforderlichen Einstellungen. Bei Replikation mit einem Slave-Server ist in der Zonendefinition zur Verbesserung der Sicherheit die Einschränkung der Zonentransfers empfehlenswert (Default: allow-transfer { any; };).

2.7.1. Konfigurationsdateien des Nameservers

=> grep -v '//' /etc/bind/named.conf
include "/etc/bind/named.conf.options";

controls {
          inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; };
};

include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
=> grep -v '//' /etc/bind/named.conf.options
zone "dom1.site" {
        type master;
        notify yes;
        allow-update { key "rndc-key"; };
        file "/var/lib/bind/db.dom1.site";
};

zone "30.20.10.in-addr.arpa" {
        type master;
        notify yes;
        allow-update { key "rndc-key"; };
        file "/var/lib/bind/db.10.20.30";
};

include "/etc/bind/rndc.key";
=> cat /var/lib/bind/db.dom1.site
$TTL    604800
@       IN      SOA     uhu.dom1.site. root.uhu.dom1.site. (
                             91         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      uhu.dom1.site.
@       IN      NS      uhu2.dom1.site.
uhu     IN      A       10.20.30.3
uhu     IN      AAAA    ::1

; Weitere Einträge (ähnlich der /etc/hosts, allerdings ZUERST die Hostnamen, DANN die IPs!)
uhu2    IN      A       10.20.30.4
xphost  IN      A       10.20.30.6
=> cat /var/lib/bind/db.10.20.30
$TTL    604800
@       IN      SOA     uhu.dom1.site. root.uhu.dom1.site. (
                             91         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      uhu.dom1.site.
3       IN      PTR     uhu.dom1.site.
4       IN      PTR     uhu2.dom1.site.

; Weitere...
4       IN      PTR     uhu2.dom1.site.
6       IN      PTR     xphost.dom1.site.

2.7.2. Konfigurationsdateien des DHCP-Servers

Nach der Installation mittels apt-get install isc-dhcp-server

legt man am besten gleich erst einmal das Listening-Interface fest:

=> tail -1 /etc/default/isc-dhcp-server
INTERFACES="enp0s3"

Dann ist die Hauptkonfigurationsdatei dran:

=> grep -v '^#' /etc/dhcp/dhcpd.conf
ddns-update-style     interim;

server-identifier     uhu;
ddns-updates          on;
ddns-domainname       "dom1.site.";
ddns-rev-domainname   "in-addr.arpa.";
ignore                client-updates;

include               "/etc/bind/rndc.key";

zone dom1.site. {
      primary 127.0.0.1;
      key rndc-key;
}

option domain-name "dom1.site";
option domain-name-servers 10.20.30.3, 10.20.30.4;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 10.20.30.0 netmask 255.255.255.0 {
  range 10.20.30.10 10.20.30.20;
  option routers 10.20.30.1;
}