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 dc2
Code-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 dnsutils
Code-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|winbindd
Code-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/private
Code-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/*.ldb
Code-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.11
Code-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.de
Code-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-dns
Code-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.tld
Code-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.tld
Code-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@dc2
Code-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>&1
Code-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-server
Code-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.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht.