Moin, du da draußen. Heute zerlegen wir PowerDNS auf Ubuntu 24.04. Kein Marketing-Gerede, nur der Weg, wie ich ihn selbst in meinem Homelab gegangen bin. Bei mir managt dat Reverse-DNS für alle VMs im Proxmox-Cluster – sauber, schnell und ohne dass ein externer Dienst mitliest.
PowerDNS ist Authoritative-Server und Recursor in einem Paket, modular aufgebaut und mit Datenbank-Backend statt flachen Zonen-Dateien. Der Vorteil gegenüber BIND9: du änderst Records über API oder pdnsutil, die Änderungen sind sofort live und Replication klappt ohne Kopfschmerzen. Für den Einstieg nehmen wir den Authoritative-Server mit gmysql-Backend – das ist der stabile Anker für Homelabs und kleine bis mittlere Zonen.
Vorbereitung
System klar machen für Port 53
Ubuntu 24.04 bringt systemd-resolved mit, das standardmäßig auf Port 53 lauscht. PowerDNS kann da nicht andocken. Deshalb zuerst den Konflikt beseitigen.
sudo systemctl disable --now systemd-resolved
Danach die Symlink-Datei aufräumen:
sudo rm -f /etc/resolv.conf
Und eine temporäre resolv.conf anlegen, damit das System während der Installation noch Namen auflösen kann:
echo "nameserver 9.9.9.9" | sudo tee /etc/resolv.conf
echo "nameserver 149.112.112.112" | sudo tee -a /etc/resolv.conf
Firewall: Wenn du UFW nutzt (empfohlen im Homelab), öffne die DNS-Ports schon jetzt:
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw reload
System updaten, damit keine alten Pakete im Weg stehen:
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
Reboot danach ist sicherer – Kernel und Netzwerk-Stack sollten frisch sein.
MariaDB als Backend
Die Datenbank als Logbuch
PowerDNS braucht ein persistentes Speicher für Zonen und Records. SQLite geht für ganz kleine Setups, aber MariaDB ist skalierbarer und genau das, was ich in Proxmox-Umgebungen einsetze.
sudo apt install mariadb-server mariadb-client -y
Sichere Installation:
sudo mysql_secure_installation
Antworten: Set root-Passwort (stark wählen), remote root deaktivieren, test-DB löschen, anonymous user weg.
Jetzt die PowerDNS-Datenbank anlegen:
sudo mysql -u root -p
Im MySQL-Prompt:
CREATE DATABASE pdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'127.0.0.1' IDENTIFIED BY 'DeinStarkesPasswortHier2026!';
GRANT ALL ON pdns.* TO 'pdns'@'127.0.0.1';
FLUSH PRIVILEGES;
EXIT;
Schema importieren. Das Paket pdns-backend-mysql liefert die Datei mit:
sudo apt install pdns-backend-mysql -y
(kommt später mit dem Server)
Vorher schon mal:
sudo mysql -u pdns -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
Falls der Pfad fehlt, check mit dpkg -L pdns-backend-mysql | grep schema.
PowerDNS installieren
Offizielles Repo nutzen
Ubuntu-Pakete sind oft älter. Besser das offizielle PowerDNS-Repo für auth-49 (aktuelle stabile Serie):
curl -fsSL https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /usr/share/keyrings/powerdns-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/powerdns-archive-keyring.gpg] http://repo.powerdns.com/ubuntu noble-auth-49 main" | sudo tee /etc/apt/sources.list.d/pdns.list
Preferences setzen, damit das Repo Vorrang hat:
sudo tee /etc/apt/preferences.d/pdns << EOF
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF
Dann:
sudo apt update
sudo apt install pdns-server pdns-backend-mysql -y
Während der Installation fragt dbconfig-common nach der DB – du kannst das überspringen, weil wir die Config manuell machen. Wähle No bei der automatischen DB-Konfiguration.
Konfiguration
Die Segel setzen
Hauptkonfig liegt in /etc/powerdns/pdns.conf, aber Backends kommen besser in separate Dateien unter /etc/powerdns/pdns.d/.
Erstelle:
sudo nano /etc/powerdns/pdns.d/gmysql.conf
Inhalt (genau so, mit deinen Werten):
launch+=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=DeinStarkesPasswortHier2026!
gmysql-dnssec=yes
gmysql-ssl=no
Zusätzlich in der Haupt-pdns.conf die wichtigen Schalter aktivieren oder überschreiben:
sudo nano /etc/powerdns/pdns.conf
Wichtige Zeilen (am Ende anhängen oder anpassen):
local-address=0.0.0.0
local-port=53
api=yes
api-key=DeinAPIKeyHierFuerProxmoxOderAdmin
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1
Bindet auf allen Interfaces, aktiviert die API (später nützlich für Proxmox SDN) und den internen Webserver zum Testen.
Berechtigungen schärfen:
sudo chown root:pdns /etc/powerdns/pdns.d/gmysql.conf
sudo chmod 640 /etc/powerdns/pdns.d/gmysql.conf
Service starten und erste Zone anlegen
sudo systemctl restart pdns
sudo systemctl enable pdns
sudo systemctl status pdns
Sollte active (running) zeigen.
Logs checken:
sudo journalctl -u pdns -f
Jetzt die erste Zone mit pdnsutil:
pdnsutil create-zone example.local ns1.example.local
SOA und NS anpassen:
pdnsutil edit-zone example.local
Oder direkt per Command:
pdnsutil add-record example.local @ SOA ns1.example.local hostmaster.example.local 2026040601 3600 1800 1209600 3600
pdnsutil add-record example.local @ NS ns1.example.local
pdnsutil add-record example.local @ A 192.168.10.10
Für Reverse-DNS (wichtig für Proxmox):
Erst die Zone anlegen, z. B. für 10.168.192.in-addr.arpa
pdnsutil create-zone 10.168.192.in-addr.arpa
Dann PTR-Records:
pdnsutil add-record 10.168.192.in-addr.arpa 10 PTR vm01.example.local
Das ist exakt der Punkt, wo bei mir die Proxmox-SDN-Zonen automatisch PTRs schreiben.
Testen
Mit dig und dig +short
Von einem anderen Rechner:
dig @deine-server-ip example.local
Sollte die A-Record liefern.
Reverse:
dig -x 192.168.10.10 @deine-server-ip
Lokaler Test auf dem Server:
pdnsutil check-zone example.local
Fallstricke
Wo der Rumpf leckt
- Port 53 noch besetzt – ss -tlnp | grep :53 zeigt systemd-resolved? Dann nochmal disable und reboot.
- DB-Verbindung fehlschlägt – Falsches Passwort oder User nur für localhost statt 127.0.0.1. Log zeigt gmysql connection failed.
- Permission denied auf Config – pdns läuft als User pdns, deshalb 640 und chown root:pdns.
- API-Key vergessen – Für Proxmox SDN brauchst du den api-key in pdns.conf und den gleichen Key im Proxmox SDN → DNS Plugin.
- Firewall auf dem Router – Viele vergessen UDP 53 im Upstream-Firewall.
- DNSSEC aktiv, aber kein Key – gmysql-dnssec=yes ohne Keys führt zu Fehlern bei Queries. Entweder DNSSEC komplett deaktivieren oder pdnsutil secure-zone example.local und Keys publishen.
- Ubuntu 24.04 Netplan – Wenn du eine statische IP hast, stell sicher, dass /etc/netplan/*.yaml keinen DNS-Eintrag hat, der auf resolved zeigt.
- Performance – Bei >500 Zonen cache-size in pdns.conf hochsetzen (default 20k reicht erstmal).
Proxmox-Integration
Reverse-DNS für VMs
In Proxmox unter Datacenter → SDN → Options → DNS den PowerDNS-Eintrag anlegen: URL http://pdns-ip:8081/api/v1/servers/localhost, API-Key wie oben, server-id localhost. Dann in der Zone die DNS- und Reverse-DNS-Server auf diesen Eintrag zeigen. Ab da registrieren neue VMs automatisch A und PTR. Funktioniert seit Proxmox 8.x sauber.
Recursor optional
Für vollen DNS-Stack
Wer auch resolving will, installiert zusätzlich pdns-recursor und konfiguriert /etc/powerdns/recursor.conf mit forward-zones oder allow-from. Im Homelab reicht meist der Authoritative plus unbound oder systemd-resolved als Forwarder.
Sicherheit und Wartung
- API nur von localhost oder mit IP-Restriktion.
- pdns.conf: disable-axfr=no nur wenn Slave-Zonen nötig.
- Logs rotieren mit logrotate.
- Backup: mysqldump -u pdns -p pdns > pdns_backup.sql
Updates: apt upgrade pdns-server – der Daemon lädt neue Config ohne Downtime nach Restart.
Das war der komplette Aufbau. Von null auf laufendem DNS-Server in unter 30 Minuten, wenn die DB sauber läuft. Danach hast du einen Server, der 10.000 Queries pro Sekunde packt, ohne dass du jemals wieder auf Cloud-DNS angewiesen bist.
Bei mir läuft das seit über einem Jahr im Cluster – Reverse-DNS für 40 VMs, interne Zonen für Services, alles über pdnsutil oder später PowerDNS-Admin, wenn die GUI gewünscht ist.
Logbucheintrag beendet.