Das Problem
Du hast einen Multi-DC Samba4 Active Directory aufgebaut. DNS-Auflösung funktioniert, DRS-Replikation zeigt “0 consecutive failures” auf allen Partitionen. Alles grün.
Dann legst du einen neuen DNS-Record an:
# Auf dem Primary DC - funktioniert
dig @192.168.66.1 srv-falcon.deathstar.lan +short
192.168.66.42
# Auf dem Replica DC - nichts
dig @192.168.66.2 srv-falcon.deathstar.lan +short
(keine Ausgabe)
Wie kann das sein? DRS repliziert doch alles?
TL;DR
Statische Bind-Zonen in /etc/bind/local.conf.samba4 werden nicht via DRS repliziert. Die Samba4 DLZ (Dynamic Loadable Zone) lädt nur AD-integrierte Zonen aus CN=MicrosoftDNS,CN=System.
Lösung: DNS-Records als AD-integrierte Einträge in der bestehenden Zone anlegen, nicht als separate statische Zonen.
Ursache
Viele Anleitungen zeigen, wie man schnell eine DNS-Zone anlegt:
# /etc/bind/local.conf.samba4
zone "infra.deathstar.lan" {
type master;
file "/etc/bind/db.infra";
};
Das funktioniert - auf diesem einen Server. Aber:
- Statische Zonen sind lokal — sie existieren nur in der Bind-Config und Zonendatei
- DRS repliziert nur LDAP-Daten —
/etc/bind/*ist kein LDAP - Die DLZ ignoriert neue Zonen — sie lädt nur beim Start existierende Zonen aus CN=System
Das perfide: DRS zeigt keine Fehler, weil es seine Arbeit korrekt macht. Es gibt einfach nichts zu replizieren.
Die Samba4 DLZ verstehen
Wenn Bind9 mit Samba4 DLZ startet, passiert folgendes:
samba_dlz: trying partition 'CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan'
samba_dlz: configured writeable zone 'deathstar.lan'
samba_dlz: configured writeable zone '66.168.192.in-addr.arpa'
Die DLZ liest nur aus CN=MicrosoftDNS,CN=System — die sogenannte “Legacy-Partition”. Die moderneren Partitionen DomainDnsZones und ForestDnsZones werden für normale Zonen ignoriert.
Und hier kommt der Haken: Neue Zonen, die du nach dem Start anlegst, werden nicht automatisch geladen. Selbst wenn du sie korrekt in CN=System erstellst.
Lösung: AD-integrierte Records statt Zonen
Statt eine neue Zone infra.deathstar.lan anzulegen, erstelle einen A-Record srv-falcon in der bestehenden deathstar.lan Zone:
1. Template von bestehendem Record holen
ldbsearch -H /var/lib/samba/private/sam.ldb \
-b 'DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan' \
'(name=dc-vader)' dnsRecord
Ausgabe:
dnsRecord:: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCAQ==
Das ist der Base64-kodierte DNS-Record. Die letzten Bytes sind die IPv4-Adresse.
2. IP-Adresse anpassen
import base64
# Original: 192.168.66.1 (letztes Byte 0x01 = 1)
orig = base64.b64decode("BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCAQ==")
# Neue IP: 192.168.66.42 (letztes Byte 0x2A = 42)
new = orig[:-1] + bytes([42])
print(base64.b64encode(new).decode())
# Ausgabe: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
3. Record via ldbadd anlegen
cat > /tmp/srv-falcon.ldif << EOF
dn: DC=srv-falcon,DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan
objectClass: top
objectClass: dnsNode
dc: srv-falcon
name: srv-falcon
dnsRecord:: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
EOF
ldbadd -H /var/lib/samba/private/sam.ldb /tmp/srv-falcon.ldif
4. Sofort verfügbar — und repliziert automatisch
# Primary DC
dig @192.168.66.1 srv-falcon.deathstar.lan +short
192.168.66.42
# Replica DC (nach DRS-Replikation)
dig @192.168.66.2 srv-falcon.deathstar.lan +short
192.168.66.42
Der Record wird via DRS automatisch auf alle DCs repliziert. Kein manuelles Kopieren, kein Bind-Restart nötig.
Bonus: Ohne Admin-Passwort arbeiten
samba-tool dns add braucht Kerberos-Auth oder ein Admin-Passwort. Für Automation ist das unpraktisch.
Die ldbadd/ldbdel Befehle arbeiten direkt auf der lokalen SAM-Datenbank — ohne Authentifizierung (als root). Das ist sicher, weil:
- Du musst bereits root auf dem DC sein
- Die Änderung wird via DRS signiert und repliziert
- Die LDAP-ACLs bleiben intakt
Verifikation
Nach dem Anlegen prüfen:
# DNS-Auflösung
dig @<primary-dc> hostname.domain.lan +short
dig @<replica-dc> hostname.domain.lan +short
# Record im LDAP
ldbsearch -H /var/lib/samba/private/sam.ldb \
-b 'DC=domain.lan,CN=MicrosoftDNS,CN=System,DC=domain,DC=lan' \
'(name=hostname)' dn
# DRS-Replikation (auf Replica)
samba-tool drs showrepl | grep -A3 "DC=domain,DC=lan"
Aufräumen: Statische Zonen entfernen
Falls du bereits statische Zonen hast:
# 1. Eintrag aus local.conf.samba4 entfernen
sed -i '/zone "subdomain/,/^};$/d' /etc/bind/local.conf.samba4
# 2. Zonendatei löschen
rm /etc/bind/db.subdomain
# 3. Bind neu laden
rndc reload
# 4. AD-integrierten Record anlegen (siehe oben)
Lessons Learned
1. DRS repliziert nur was im AD ist
Statische Bind-Zonen existieren nur im Dateisystem von dc-vader. DRS weiß nichts davon. Nur AD-LDAP-Daten werden repliziert.
2. Nicht annehmen dass Replikation automatisch funktioniert
DRS zeigt “Success” auch wenn keine Daten zum Replizieren da sind. Du musst prüfen ob die Daten selbst existieren, nicht nur ob DRS läuft.
3. Diagnose: Filesystem vs LDAP trennen
# Filesystem-Check (lokal)
ls /etc/bind/db.*
# LDAP-Check (repliziert)
ldbsearch -H /var/lib/samba/private/sam.ldb 'dnsRecord=*' | grep dn:
Wenn ls Dateien zeigt aber ldbsearch leer ist → falsche Methode genutzt.
4. Warum so viele Tutorials statische Zonen empfehlen
Historische Gründe: Frühe Samba4-Versionen hatten DNS-Bugs. Statische Zonen waren der Workaround. Heute nicht mehr nötig.
5. Edge Cases beachten
- Subzones (
infra.deathstar.lan): Funktionieren genauso, nur mit angepasstemdnsZoneName - Reverse Zones (PTR Records): Brauchen andere
objectClass(dnsNodestattdnsZone) - Nicht-Standard-Ports: Wenn DNS auf anderem Server als AD läuft, prüfe Firewall-Regeln
Fazit
- Statische Bind-Zonen = lokal, manuell, fehleranfällig
- AD-integrierte Records = repliziert, automatisch, sauber
Wenn du einen Multi-DC Samba4 AD betreibst, vergiss statische Zonen. Alles gehört ins AD.