Das Problem
Du gibst dig @dc-vader.deathstar.lan srv-r2d2.deathstar.lan ein - und… nichts. Kein Error, kein Timeout, einfach leere Ausgabe.
Der Record sollte da sein. Der Host (srv-r2d2) läuft auf 192.168.66.42. Der DNS-Server (dc-vader.deathstar.lan) ist ein Samba AD DC.
Du öffnest die Doku zum Anlegen neuer Records: “Use Windows RSAT DNS Manager”. Nicht installiert.
Alternative: “Use Univention Web-UI”. Zu umständlich.
Die Frage: Wie packt man einen DNS A-Record per Hand in Samba AD, ohne Windows-Client mit PowerShell?
TL;DR
# 1. Base64 für die IP generieren (hier: 192.168.66.42)
python3 -c "
import base64
# Template von existierendem Record (letzte zwei Bytes = IP-Oktette 3+4)
orig = base64.b64decode('BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCAQ==')
# Letztes Byte durch gewünschtes Oktett ersetzen
new = orig[:-1] + bytes([42]) # 42 = letztes Oktett
print(base64.b64encode(new).decode())
"
# → BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
# 2. LDIF erstellen und importieren
ldbadd -H /var/lib/samba/private/sam.ldb << 'LDIF'
dn: DC=srv-r2d2,DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan
objectClass: top
objectClass: dnsNode
dc: srv-r2d2
name: srv-r2d2
dnsRecord:: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
LDIF
Diagnose: Ist der Record überhaupt im DNS?
Bevor du einen Record anlegst, prüfe erstmal den Status:
1. Ist der Record im DNS vorhanden?
dig @dc-vader.deathstar.lan srv-r2d2.deathstar.lan +short
Falls leer: Record existiert nicht → anlegen Falls IP erscheint: Record existiert bereits → prüfen ob IP korrekt
2. Existiert der Host im LDAP?
ldbsearch -H /var/lib/samba/private/sam.ldb '(name=srv-r2d2)'
Falls leer: Kein LDAP-Eintrag → Record muss neu angelegt werden
Falls Output: Eintrag existiert → prüfe dnsRecord Attribut
3. Welche DNS-Records existieren überhaupt?
ldbsearch -H /var/lib/samba/private/sam.ldb \
'(objectClass=dnsNode)' name dnsRecord | head -20
Expected: Liste mit existierenden Records (dc-vader, etc.)
Das gibt dir einen Template-Record zum Kopieren der Base64-Struktur.
Ursache: Das dnsRecord-Attribut ist binär
In Samba AD (und Windows AD) werden DNS-Records nicht als Klartext gespeichert. Das dnsRecord-Attribut ist ein binäres Blob mit einer undokumentierten Struktur.
Ein existierender Record sieht so aus:
ldbsearch -H /var/lib/samba/private/sam.ldb \
-b 'DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan' \
'(name=srv-c3po)' dnsRecord
dnsRecord:: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCAQ==
Dekodiert man das Base64, erhält man 24 Bytes. Die IP-Adresse steckt in den letzten 4 Bytes.
Lösung
Schritt 1: Template von existierendem Record holen
ldbsearch -H /var/lib/samba/private/sam.ldb \
-b 'DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan' \
'(objectClass=dnsNode)' dnsRecord | grep "dnsRecord::" | head -1
Schritt 2: IP-Bytes anpassen
Für 192.168.66.42 (Subnetz 192.168.66.x bleibt gleich, nur letztes Oktett ändern):
import base64
# Template (hier: 192.168.66.1)
orig = base64.b64decode("BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCAQ==")
# Letztes Byte = letztes IP-Oktett
new = orig[:-1] + bytes([42]) # 42 dezimal = 0x2A
print(base64.b64encode(new).decode())
# → BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
Schritt 3: LDIF erstellen
dn: DC=srv-r2d2,DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan
objectClass: top
objectClass: dnsNode
dc: srv-r2d2
name: srv-r2d2
dnsRecord:: BAABAAXwAAAQAAAAAAADhAAAAAAAAAAAwKhCKg==
Wichtig: Das :: nach dnsRecord signalisiert Base64-Encoding!
Schritt 4: Record importieren
ldbadd -H /var/lib/samba/private/sam.ldb /tmp/srv-r2d2.ldif
# → Added 1 records successfully
Verifikation
# DNS-Auflösung testen
dig @dc-vader.deathstar.lan srv-r2d2.deathstar.lan +short
# → 192.168.66.42
# LDAP-Eintrag prüfen
ldbsearch -H /var/lib/samba/private/sam.ldb \
-b 'DC=deathstar.lan,CN=MicrosoftDNS,CN=System,DC=deathstar,DC=lan' \
'(name=srv-r2d2)' dn
Fazit
DNS-Records in Samba AD sind binär kodiert - aber mit dem richtigen Template und etwas Python ist das kein Hexenwerk. Der Trick: Einen existierenden Record als Vorlage nehmen und nur die IP-Bytes anpassen.
Das ist besonders nützlich für:
- Automatisierte Deployments (Ansible, Terraform)
- Headless Samba AD DCs ohne GUI
- Schnelle Fixes ohne Windows-Client