Active Directory mit DNS und DHCP Failover auf Debian

Wie schon beim 1. Server schalten wir IPv6 aus…

nano /etc/sysctl.conf

…und am Ende folgende Zeile einfügen:

net.ipv6.conf.all.disable_ipv6 = 1

Das System aktualisieren…

apt update -y && apt upgrade -y && apt clean -y && apt autoremove -y && reboot

Host Datei prüfen und ggf. anpassen:

nano /etc/hosts
127.0.0.1          localhost
192.168.178.12     dc2.intern.domain.tld dc2Code-Sprache: CSS (css)

Samba installieren

apt-get install acl attr samba samba-dsdb-modules samba-vfs-modules smbclient winbind libpam-winbind libnss-winbind libpam-krb5 krb5-config krb5-user dnsutilsCode-Sprache: JavaScript (javascript)

Möglicherweise wird bei der Installation folgendes abgefragt:

  • WINS Server: nein
  • Default Kerberos Realm: INTERN.DOMAIN.TLD
  • Kerberos Server: dc1.intern.domain.tld
  • Admin Server: dc1.intern.domain.tld

BIND9 installieren und anpassen

apt install bind9

Samba für Erstellung der Domäne vorbereiten

Zu aller erst sicherstellen, dass keine Samba oder DNS Dienste laufen.

ps ax | egrep "samba|smbd|nmbd|winbindd"Code-Sprache: JavaScript (javascript)

Die Ausgabe könnte wie folgt aussehen…

root@dc1:~# ps ax | egrep "samba|smbd|nmbd|winbindd"
  158 ?        Ss     0:00 /usr/sbin/smbd -D --option=server role check:inhibit=yes --foreground
  162 ?        Ss     0:03 /usr/sbin/winbindd -D --option=server role check:inhibit=yes --foreground
  219 ?        S      0:00 /usr/sbin/smbd -D --option=server role check:inhibit=yes --foreground
  220 ?        S      0:00 /usr/sbin/smbd -D --option=server role check:inhibit=yes --foreground
  232 ?        S      0:00 /usr/sbin/smbd -D --option=server role check:inhibit=yes --foreground
30976 pts/2    S+     0:00 grep -E samba|smbd|nmbd|winbinddCode-Sprache: PHP (php)

Die letzte Zeile zeigt unseren soeben gestarteten Suchprozess und alle anderen gehören zu Samba und DNS. Die Nummern der ersten Spalte sind die Prozess IDs (kurz PID), welche allesamt beendet werden müssen (PID durch die jeweilige Nummer ersetzen).

kill -9 PID

Desweiteren muss die vorhandene Konfigurationsdatei von Samba entfernt werden. Mit smbd -b | grep "CONFIGFILE" zeigt das System an, wo sich diese befindet.

rm /etc/samba/smb.conf

Auch müssen eventuell bereits bestehende Datenbanken von Samba entfernt werden. Mit smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR" werden die entsprechenden Pfade angezeigt.

root@dc1:~# smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
   LOCKDIR: /var/run/samba
   STATEDIR: /var/lib/samba
   CACHEDIR: /var/cache/samba
   PRIVATE_DIR: /var/lib/samba/privateCode-Sprache: PHP (php)

Mit diesen Befehlen habe ich alle Datenbanken bei mir entfernt:

rm /var/run/samba/*.tdb
rm /var/run/samba/*.ldb
rm /var/lib/samba/*.tdb
rm /var/lib/samba/*.ldb
rm /var/cache/samba/*.tdb
rm /var/cache/samba/*.ldb
rm /var/lib/samba/private/*.tdb
rm /var/lib/samba/private/*.ldbCode-Sprache: JavaScript (javascript)

Und da wir gerade so schön mit Löschen beschäftigt sind, entfernen wir auch die Konfiguration von Kerberos.

rm /etc/krb5.conf

In der Datei nano /etc/default/bind9 den Eintrag wie folgt ändern:

OPTIONS="-4 -u bind"Code-Sprache: JavaScript (javascript)
nano /etc/bind/named.conf.options
// Netze, aus denen zugegriffen werden darf
acl internals { 127.0.0.0/8; 192.168.178.0/24; };

options {
      directory "/var/cache/bind";
      version "Go Away 0.0.7";
      notify no;
      empty-zones-enable no;
      auth-nxdomain yes;
      // Weiterleitungen (hier Router und die bekannten DNS Server)
	  forwarders { 10.20.50.1; 1.1.1.1; 8.8.8.8; };
      allow-transfer { 192.168.178.11; };

      dnssec-validation no;
      dnssec-enable no;
      dnssec-lookaside no;

      // If you only use IPv4. 
      listen-on-v6 { none; };
      // Adressen, auf denen der DNS hört und arbeitet. 
      listen-on port 53 { 192.16.178.12; 127.0.0.1; ::1; };

      // Added Per Debian buster Bind9. 
      // Due to : resolver: info: resolver priming query complete messages in the logs. 
      // See: https://gitlab.isc.org/isc-projects/bind9/commit/4a827494618e776a78b413d863bc23badd14ea42
      minimal-responses yes;

      //  Add any subnets or hosts you want to allow to use this DNS server
      allow-query { "internals";  };
      allow-query-cache { "internals"; };

      //  Add any subnets or hosts you want to allow to use recursive queries
      recursion yes;
      allow-recursion {  "internals"; };

      // https://wiki.samba.org/index.php/Dns-backend_bind
      // DNS dynamic updates via Kerberos (optional, but recommended)
      // ONE of the following lines should be enabled AFTER you provision or join a DC with bind9_dlz 
      // or AFTER upgrading your dns from internal to bind9_dlz 
      // Before Samba 4.9.0
      // tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";
      // From Samba 4.9.0 ( You will need to run samba_dnsupgrade if upgrading your Samba version. ) 
      tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";

  };			Code-Sprache: PHP (php)

Jetzt stellen wir den DNS Server vom, so dass der DC2 nicht mehr den Router fragt, sondern den DC1.

nano /etc/resolv.conf
search intern.domain.tld
nameserver 192.168.178.11Code-Sprache: CSS (css)

BIND9 testen

host -t A localhost 127.0.0.1
host -t PTR 127.0.0.1 127.0.0.1
nslookup beoceka.deCode-Sprache: CSS (css)

Server als zusätzlichen Domaincontroller in die Domäne aufnehmen

samba-tool domain join intern.domain.tld DC -U"INTERN\administrator" --dns-backend=BIND9_DLZ --option='idmap_ldb:use rfc2307 = yes'Code-Sprache: JavaScript (javascript)

Kommt dabei dieser Fehler:

ERROR: Failed to find a writeable DC for domain 'intern.domain.tld': The transport-connection attempt was refused by the remote system.
Code-Sprache: JavaScript (javascript)

…dann läuft Samba nicht auf dem DC1. Diesen manuell starten, erneut versuchen und überprüfen, weshalb Samba nicht mehr lief.

Berechtigung für BIND setzen

chown root:bind /var/lib/samba/bind-dnsCode-Sprache: JavaScript (javascript)

Kerberos von Samba kopieren und prüfen

rm /etc/krb5.conf 
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf Code-Sprache: PHP (php)
kinit administrator
klist

BIND anpassen

nano /etc/bind/named.conf.local

Am Ende einfügen:

include "/var/lib/samba/bind-dns/named.conf";Code-Sprache: PHP (php)

Dienste starten

systemctl start bind9
systemctl enable bind9
systemctl stop smbd nmbd winbind
systemctl disable smbd nmbd winbind
systemctl unmask samba-ad-dc
systemctl start samba-ad-dc
systemctl enable samba-ad-dc

Server mit reboot neustarten.

DNS Einträge prüfen

host intern.domain.tldCode-Sprache: CSS (css)

Hier müssen jetzt beide DCs erscheinen, auf beiden DCs. Das gleiche auch mit folgenden Abfragen:

host -t SRV _kerberos._udp.intern.domain.tld
 Code-Sprache: CSS (css)
host -t SRV _ldap._tcp.intern.domain.tldCode-Sprache: CSS (css)

Wenn ein Eintrag fehlt, können diese mit folgenden Befehlen nachgeholt werden.

samba-tool dns add dc1 intern.domain.tld intern.domain.tld A 192.168.178.12 -Uadministrator
samba-tool dns add dc1 intern.domain.tld _kerberos._udp.intern.domain.tld SRV 'dc2.intern.domain.tld 88 0 100' -Uadministrator
samba-tool dns add dc1 intern.domain.tld _ldap._tcp.intern.domain.tld SRV 'dc2.intern.domain.tld 389 0 100' -Uadministrator
Code-Sprache: JavaScript (javascript)

SYSVOL Replikation (auf DC1 ausführen)

Wir wechseln auf den DC1…

apt install rsync
systemctl enable rsync
systemctl start rsync

Einen SSH Schlüssel generieren und alle Abfragen mit ENTER bestätigen:

ssh-keygen -t RSA

Schlüssel auf 2. Server übertragen.

ssh-copy-id root@dc2Code-Sprache: CSS (css)

Die Verbindung mit ssh dc2 testen. Es sollte direkt die Konsole von dc2 zu sehen sein, ohne Eingabe eines Kennwortes. Bei der Gelegenheit installieren wir auf dem DC2 ebenfalls rsync mit apt install rsync. Die Konsole von dc2 mit exit verlassen.

Testlauf mit rsync --dry-run -XAavz --chmod=775 --delete-after --progress --stats /var/lib/samba/sysvol/ root@dc2:/var/lib/samba/sysvol/ starten. Es müsste angezeigt werden, wie viele Dateien zu kopieren wären.

Der Befehl für die eigentliche Replikation heißt rsync -XAavz --chmod=775 --delete-after --progress --stats /var/lib/samba/sysvol/ root@dc2:/var/lib/samba/sysvol/ und wird in einem Cronjob angelegt:

crontab -e

*/5 * * * * rsync -XAavz --chmod=775 --delete-after --progress --stats /var/lib/samba/sysvol/ root@dc2:/var/lib/samba/sysvol/ > /var/log/sysvol-replication.log 2>&1Code-Sprache: JavaScript (javascript)

Der Rest wird von DC1 aus gesteuert.

DHCP installieren (zurück auf DC2)

apt install isc-dhcp-server

Auch dieser DHCP hört nur auf IPv4:

nano /etc/default/isc-dhcp-serverCode-Sprache: JavaScript (javascript)
INTERFACESv4="eth0"
#INTERFACESv6=""Code-Sprache: PHP (php)

Wir exportieren, wie zuvor auch auf dem DC1, den Keytab.

samba-tool domain exportkeytab --principal=dhcpduser@INTERN.DOMAIN.TLD /etc/dhcpduser.keytab
chown root:root  /etc/dhcpduser.keytab
chmod 400  /etc/dhcpduser.keytab

Wir wechseln wieder auf den DC1. Dort passen wir die DHCP Konfiguration an.

…und die Konfiguration wie folgt anpassen:

nano /etc/dhcp/dhcpd.conf

Nach der Zeile „ddns-update-style none“ folgenden Part einfügen:

failover peer "dhcp-failover" {
  primary;
  address dc1.intern.domain.tld;
  peer address dc2.intern.domain.tld;
  max-response-delay 60;
  max-unacked-updates 10;
  mclt 3600;
  split 128;
  load balance max seconds 3;
}Code-Sprache: JavaScript (javascript)

In jedem definierten Subnetz muss nun das Failover hinzugefügt werden:

  pool {
    failover peer "dhcp-failover";
    max-lease-time 1800; # 30 minutes
    range 192.168.178.50 192.168.178.199;
  }Code-Sprache: PHP (php)

Datei speichern und DHCP mit /etc/init.d/isc-dhcp-server restart prüfen, ob sich eventuell Fehler eingeschlichen haben.

Wenn alles passt, die Konfiguration auf den DC2 kopieren…

scp /etc/dhcp/dhcpd.conf root@dc2:/etc/dhcp/dhcp.conf Code-Sprache: JavaScript (javascript)

Wieder auf den DC2 wechseln und die /etc/dhcp/dhcpd.conf anpassen. primary wird zu secondary, Adressen anpassen und zwei Zeilen löschen.

failover peer "dhcp-failover" {
  secondary;
  address dc2.intern.domain.tld;
  peer address dc1.intern.domain.tld;
  max-response-delay 60;
  max-unacked-updates 10;
  load balance max seconds 3;
}Code-Sprache: JavaScript (javascript)
systemctl restart isc-dhcp-server

DHCP für Neustart einrichten

systemctl enable isc-dhcp-server

DHCP Server mit systemctl restart isc-dhcp-server neustarten und auf Fehler prüfen. Auch hier hatte ich bei meinen Tests immer wieder Sonderzeichen vergessen.

DNS Update Script

Das DNS Update Script können wir uns vom DC1 kopieren.

scp root@dc1://usr/local/bin/dhcp-dyndns.sh /usr/local/bin/dhcp-dyndns.sh
Code-Sprache: JavaScript (javascript)
chmod 755 /usr/local/bin/dhcp-dyndns.sh

Jetzt mit einem Windows oder Linux Client prüfen, ob man eine IP bekommt. Zum Testen auch ma den DC1 abschalten und nur den DC2 betreiben und umgekehrt.

Mit dhcp-lease-list lassen sich die vergebenen IP Adressen anschauen.

Alternativ geht das auch mit der Weboberfläche Webmin.

2 Kommentare zu „Active Directory mit DNS und DHCP Failover auf Debian“

  1. Hallo, vielen Dank für die super Anleitung. Leider bekomme ich beim Absetzen des Befehls
    database „dlopen /usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_11.so“;
    den Fehler: database: Kommando nicht gefunden.
    Finde auch leider keine Infos zu dem fehlenden Prog. database
    Wäre toll wenn Du mir dazu einen Tipp geben kannst.
    VG

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert