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

Referenzen