Moin, du da draußen. Heute zerlegen wir <span class="nb-pill-link">[PowerDNS](https://www.powerdns.io/)</span> auf <span class="nb-pill-link">[Ubuntu 24.04](https://ubuntu.com/24.04)</span>. 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. <span class="nb-accent">Der Vorteil gegenüber BIND9:</span> du änderst Records über API oder <span class="nb-pill-link">pdnsutil</span>, 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 <span class="nb-pill-link">Port 53</span> lauscht. PowerDNS kann da nicht andocken. Deshalb zuerst den Konflikt beseitigen.

```bash
sudo systemctl disable --now systemd-resolved
```

**Danach die Symlink-Datei aufräumen:**  

```bash
sudo rm -f /etc/resolv.conf
```

Und eine temporäre <span class="nb-pill-link">resolv.conf</span> anlegen, damit das System während der Installation noch Namen auflösen kann:  

```bash
echo "nameserver 9.9.9.9" | sudo tee /etc/resolv.conf
echo "nameserver 149.112.112.112" | sudo tee -a /etc/resolv.conf
```

<span class="nb-accent">Firewall:</span> Wenn du <span class="nb-pill-link">[UFW](https://wiki.ubuntuusers.de/UFW/)</span> nutzt (empfohlen im Homelab), öffne die DNS-Ports schon jetzt:  

```bash
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
```
```bash
sudo ufw reload
```

**System updaten, damit keine alten Pakete im Weg stehen:**  

```bash
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. <span class="nb-pill-link">[SQLite](https://www.sqlite.org/index.html)</span> geht für ganz kleine Setups, aber <span class="nb-pill-link">[MariaDB](https://www.mariadb.org)</span> ist skalierbarer und genau das, was ich in Proxmox-Umgebungen einsetze.  

```bash
sudo apt install mariadb-server mariadb-client -y
```

**Sichere Installation:**  

```bash
sudo mysql_secure_installation
```

<span class="nb-accent">Antworten:</span> <span class="nb-pill-link">Set root-Passwort</span> (stark wählen), <span class="nb-pill-link">remote root</span> deaktivieren, <span class="nb-pill-link">test-DB</span> löschen, <span class="nb-pill-link">anonymous user</span> weg.  

**Jetzt die PowerDNS-Datenbank anlegen:** 

```bash
sudo mysql -u root -p
```

**Im MySQL-Prompt:**  

```sql
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;
```

<span class="nb-accent">Schema importieren.</span> Das Paket <span class="nb-pill-link">pdns-backend-mysql</span> liefert die Datei mit:  

```bash
sudo apt install pdns-backend-mysql -y
```

(kommt später mit dem Server)  

**Vorher schon mal:**  

```bash
sudo mysql -u pdns -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
``` 

Falls der Pfad fehlt, check mit <span class="nb-pill-link">dpkg -L pdns-backend-mysql | grep schema</span>.

#### PowerDNS installieren
**Offizielles Repo nutzen**

Ubuntu-Pakete sind oft älter. Besser das offizielle PowerDNS-Repo für auth-49 (aktuelle stabile Serie):  

```bash
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:**

```bash
sudo tee /etc/apt/preferences.d/pdns << EOF
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF
```

Dann: 

```bash
sudo apt update
sudo apt install pdns-server pdns-backend-mysql -y
```

Während der Installation fragt <span class="nb-pill-link">dbconfig-common</span> nach der DB – du kannst das überspringen, weil wir die Config manuell machen. Wähle <span class="nb-pill-link">No</span> bei der automatischen DB-Konfiguration.

#### Konfiguration
**Die Segel setzen**

Hauptkonfig liegt in <span class="nb-pill-link">/etc/powerdns/pdns.conf</span>, aber Backends kommen besser in separate Dateien unter <span class="nb-pill-link">/etc/powerdns/pdns.d/</span>.  

**Erstelle:**

```bash
sudo nano /etc/powerdns/pdns.d/gmysql.conf
```

**Inhalt (genau so, mit deinen Werten):**  

```text
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:  

```bash
sudo nano /etc/powerdns/pdns.conf
```

**Wichtige Zeilen (am Ende anhängen oder anpassen):**  

```text
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:**  

```bash
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

```bash
sudo systemctl restart pdns
sudo systemctl enable pdns
sudo systemctl status pdns
```

Sollte <span class="nb-pill-link">active (running)</span> zeigen. 

**Logs checken:**

```bash
sudo journalctl -u pdns -f
```

**Jetzt die erste Zone mit pdnsutil:**  

```bash
pdnsutil create-zone example.local ns1.example.local
```  

**SOA und NS anpassen:**  

```bash
pdnsutil edit-zone example.local
```  

**Oder direkt per Command:**  

```bash
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 <span class="nb-pill-link">10.168.192.in-addr.arpa</span>  

```bash
pdnsutil create-zone 10.168.192.in-addr.arpa
```  

**Dann PTR-Records:**

```bash
pdnsutil add-record 10.168.192.in-addr.arpa 10 PTR vm01.example.local
```  

Das ist exakt der Punkt, wo bei mir die <span class="nb-pill-link">Proxmox-SDN-Zonen</span> automatisch <span class="nb-pill-link">PTRs</span> schreiben.

#### Testen

Mit <span class="nb-pill-link">dig</span> und <span class="nb-pill-link">dig +short</span>

**Von einem anderen Rechner:**  

```bash
dig @deine-server-ip example.local
```  

<span class="nb-accent">Sollte die A-Record liefern.</span> 

**Reverse:** 

```bash
dig -x 192.168.10.10 @deine-server-ip
```  

**Lokaler Test auf dem Server:**

```bash
pdnsutil check-zone example.local
```

##### Fallstricke

**Wo der Rumpf leckt**

1. **Port 53 noch besetzt** – <span class="nb-pill-link">ss -tlnp | grep :53</span> zeigt systemd-resolved? Dann nochmal disable und reboot.  
2. **DB-Verbindung fehlschlägt** – Falsches Passwort oder User nur für <span class="nb-pill-link">localhost</span> statt <span class="nb-pill-link">127.0.0.1</span>. Log zeigt <span class="nb-pill-link">gmysql connection failed</span>.  
3. **Permission denied auf Config** – pdns läuft als User pdns, deshalb 640 und chown root:pdns.  
4. **API-Key vergessen** – Für Proxmox SDN brauchst du den api-key in pdns.conf und den gleichen Key im Proxmox SDN → DNS Plugin.  
5. **Firewall auf dem Router** – Viele vergessen UDP 53 im Upstream-Firewall.  
6. **DNSSEC aktiv, aber kein Key** – gmysql-dnssec=yes ohne Keys führt zu Fehlern bei Queries. Entweder DNSSEC komplett deaktivieren oder <span class="nb-pill-link">pdnsutil secure-zone example.local</span> und Keys publishen.  
7. **Ubuntu 24.04 Netplan** – Wenn du eine statische IP hast, stell sicher, dass <span class="nb-pill-link">/etc/netplan/*.yaml</span> keinen DNS-Eintrag hat, der auf <span class="nb-pill-link">resolved</span> zeigt.  
8. **Performance** – Bei >500 Zonen <span class="nb-pill-link">cache-size</span> in <span class="nb-pill-link">pdns.conf</span> hochsetzen (default 20k reicht erstmal).  

#### Proxmox-Integration

**Reverse-DNS für VMs**

In Proxmox unter <span class="nb-pill-link">Datacenter</span> → <span class="nb-pill-link">SDN</span> → <span class="nb-pill-link">Options</span> → DNS den PowerDNS-Eintrag anlegen: URL <span class="nb-pill-link">http://pdns-ip:8081/api/v1/servers/localhost</span>, API-Key wie oben, <span class="nb-pill-link">server-id localhost</span>. 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 <span class="nb-pill-link">[Proxmox 8.x](https://www.proxmox.com/en/products/proxmox-ve)</span> sauber.

#### Recursor optional

**Für vollen DNS-Stack**

Wer auch resolving will, installiert zusätzlich <span class="nb-pill-link">pdns-recursor</span> und konfiguriert <span class="nb-pill-link">/etc/powerdns/recursor.conf</span> mit <span class="nb-pill-link">forward-zones</span> oder <span class="nb-pill-link">allow-from</span>. Im Homelab reicht meist der Authoritative plus <span class="nb-pill-link">[unbound](https://unbound.docs.nlnetlabs.nl/en/latest/getting-started/installation.html)</span> oder systemd-resolved als Forwarder.

#### Sicherheit und Wartung

- API nur von localhost oder mit IP-Restriktion.  
- <span class="nb-pill-link">pdns.conf</span>: <span class="nb-pill-link">disable-axfr=no</span> nur wenn Slave-Zonen nötig.  
- Logs rotieren mit logrotate.  
- Backup: <span class="nb-pill-link">mysqldump -u pdns -p pdns > pdns_backup.sql</span>  

<span class="nb-accent">Updates:</span> <span class="nb-pill-link">apt upgrade pdns-server</span> – 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 <span class="nb-pill-link">pdnsutil</span> oder später <span class="nb-pill-link">PowerDNS-Admin</span>, wenn die GUI gewünscht ist.  

**Logbucheintrag beendet.**
