18 KiB
Kapitel 2 – Pi-hole + Unbound (Rohtext)
Einleitung
Werbung im Browser, Tracking auf dem Smartphone, Datenabfragen im Smart-TV – all das läuft im Hintergrund über DNS. Jeder Aufruf einer Webseite, jeder Klick in einer App löst eine DNS-Anfrage aus. Genau hier setzt Pi-hole an: es fängt diese Anfragen ab und filtert bekannte Werbe- und Trackingadressen heraus, bevor sie überhaupt geladen werden können. Das entlastet die Geräte, spart Bandbreite und sorgt für ein aufgeräumtes Netz.
Zusammen mit Unbound als lokalem DNS-Resolver wird daraus eine besonders saubere Lösung. Unbound fragt nicht einfach einen externen DNS-Dienst wie Google oder Cloudflare, sondern löst jede Anfrage selbst von der Wurzel des Domain Name Systems bis zur Zieladresse auf. Damit bleiben die Daten im eigenen Netz, die Privatsphäre steigt deutlich, und es entsteht ein kleiner Geschwindigkeitsvorteil, weil der Weg kürzer ist.
Für Content Creator und Streamer bedeutet das: weniger Ablenkung durch Werbung, stabile Netzwerkperformance und ein professionellerer Workflow. Für Privatnutzer: mehr Ruhe beim Surfen, besserer Schutz vor Tracking und ein Stück digitale Selbstbestimmung im eigenen Heimnetz.
Voraussetzungen
Bevor wir mit der Einrichtung starten, stellen wir sicher, dass die Grundlagen stimmen:
- Proxmox ist bereits installiert und erreichbar (siehe Kapitel 1).
- Zugang zur Proxmox-Weboberfläche über einen Browser im Heimnetz.
- Internetverbindung für den Download des Container-Templates.
- Grundverständnis: Was ist eine IP-Adresse und was ist eine Domain?
- Ein wenig Geduld und Bereitschaft, sich durch die Proxmox-GUI zu klicken – wir führen durch jeden Schritt.
Optional hilfreich:
- Ein zweites Gerät (z. B. Tablet oder Smartphone), um die Anleitung nebenher geöffnet zu haben, während man in Proxmox arbeitet.
Schritt für Schritt
Container anlegen
Jetzt legen wir den Container an, in dem Pi-hole und Unbound gemeinsam laufen werden.
-
CT erstellen anklicken
👉 Screenshot geeignet: Schaltfläche „CT erstellen“ oben rechts. -
Allgemein
- Knoten: (dein Proxmox-Host)
- CT ID: automatisch vergeben oder nach Wunsch anpassen
- Hostname:
pihole - Unprivilegierter Container: aktivieren (empfohlen)
- Passwort: Root-Passwort vergeben und merken
- SSH-Schlüssel: optional (falls vorhanden)
👉 Screenshot geeignet: Reiter „Allgemein“.
-
Vorlage
- Speicher: z. B.
local-lvm - Vorlage:
Debian 12.7.1 Standardauswählen
👉 Screenshot geeignet: Reiter „Vorlage“.
- Speicher: z. B.
-
Root-Disk
- Größe: 6–8 GB reichen vollkommen
👉 Screenshot geeignet: Reiter „Root-Disk“.
- Größe: 6–8 GB reichen vollkommen
-
CPU
- Kerne: 1
- Rest auf Standard belassen
👉 Screenshot geeignet: Reiter „CPU“.
-
Arbeitsspeicher
- RAM: 512 MB – 1 GB
- Swap: 0–256 MB (optional)
👉 Screenshot geeignet: Reiter „Arbeitsspeicher“.
-
Netzwerk
- Bridge:
vmbr0(Standard) - IPv4:
Statisch - IPv4/CIDR: feste Adresse eintragen, z. B.
192.168.1.5/24 - Gateway (IPv4): Router-IP, z. B.
192.168.1.1 - IPv6:
DHCP(für spätere Nutzung, z. B. Proxy Manager)
👉 Screenshot geeignet: Reiter „Netzwerk“ mit statischer IPv4 und IPv6 DHCP.
- Bridge:
Warning
Wichtig: Pi-hole benötigt unbedingt eine feste IPv4-Adresse.
Ohne feste IP können Router und Clients den DNS-Traffic nicht korrekt weiterleiten.
Tip
Reserviere die feste IPv4 auch in deinem Router (DHCP-Reservierung), damit sie nicht doppelt vergeben wird.
- DNS
- DNS-Server: leer lassen
- Suchdomäne: leer lassen
👉 Screenshot geeignet: Reiter „DNS“.
Note
Es wird kein DNS-Server eingetragen.
Zunächst nutzt der Container die Host-Einstellungen von Proxmox.
Später, nach der Installation, stellen wir den Container auf127.0.0.1um, damit er Pi-hole/Unbound selbst nutzt.
- Bestätigen
- Übersicht prüfen
- Mit Fertigstellen abschließen
👉 Screenshot geeignet: Reiter „Bestätigen“.
Prüfen
- Container erscheint links in der Server-Ansicht.
- Über Start → Container hochfahren.
- Über Konsole → Login mit
rootund vergebenem Passwort.
Erster Zugriff
Direkt nach dem Anlegen ist der Container über die Proxmox-Konsole erreichbar.
Ein SSH-Dienst läuft bereits, aber Root darf sich nicht per SSH anmelden.
Darum legen wir uns zuerst in der Proxmox-Konsole einen eigenen Benutzer an.
-
Container in der Proxmox-Weboberfläche auswählen → oben Konsole anklicken.
👉 Screenshot geeignet: geöffnete Konsole in Proxmox. -
In der Konsole einen neuen Benutzer erstellen:
adduser adminuser- Passwort vergeben
- Alle weiteren Fragen (Name, Raum, etc.) mit Enter überspringen
-
Diesem Benutzer Admin-Rechte geben:
usermod -aG sudo adminuser
Verbindung vom Mac/PC aus
-
macOS / Linux (Terminal):
ssh adminuser@192.168.1.5👉 Screenshot geeignet: Terminal mit erfolgreichem SSH-Login.
-
Windows (WinSCP):
- Neue Sitzung → Protokoll SFTP
- Hostname:
192.168.1.5 - Benutzername:
adminuser - Passwort: das beim
adduservergebene
👉 Screenshot geeignet: WinSCP-Loginfenster mit Benutzer „adminuser“.
Optional: Root-SSH erlauben
Falls Root-Zugang per SSH benötigt wird:
-
Konfiguration öffnen:
nano /etc/ssh/sshd_config -
Mit
Strg+WnachPermitRootLoginsuchen. -
Wert auf
yessetzen. -
Speichern mit
Strg+O, Enter → Beenden mitStrg+X. -
SSH neu starten:
systemctl restart ssh
-
macOS / Linux (Terminal):
ssh root@192.168.1.5 -
Windows (WinSCP):
Mit Benutzerrootverbinden.
Warning
Root-SSH ist unsicher, wenn dein Netzwerk nicht geschützt ist. Verwende diese Option nur, wenn es unbedingt notwendig ist.
Installation Pi-hole
Bevor wir Pi-hole installieren, aktualisieren wir zuerst das System im Container.
apt update
apt upgrade -y
Danach laden wir das Installationsskript von Pi-hole und starten es:
curl -sSL https://install.pi-hole.net | bash
Tip
Sollte
curlnicht installiert sein, kannst du es mitapt install curl -ynachholen.
Das Installationsskript startet eine geführte Einrichtung im Terminal.
Hier werden wir Schritt für Schritt durch die Grundkonfiguration geführt (z. B. Netzwerkkarte, Upstream-DNS, Blocklisten).
👉 Screenshot geeignet: Start des Pi-hole Installationsskripts im Terminal.
Konfiguration während der Installation
Das Installationsskript führt dich durch mehrere Auswahlmenüs.
Alle Eingaben machst du mit den Pfeiltasten und bestätigst mit Enter.
-
Netzwerkschnittstelle wählen
- Wähle die Schnittstelle aus, die du bei der Container-Erstellung konfiguriert hast (meist
eth0).
👉 Screenshot geeignet: Auswahl der Netzwerkschnittstelle.
- Wähle die Schnittstelle aus, die du bei der Container-Erstellung konfiguriert hast (meist
-
Statische IP bestätigen
- Die feste IPv4-Adresse, die wir beim Anlegen des Containers vergeben haben, wird hier angezeigt.
- Bestätige diese Einstellung.
👉 Screenshot geeignet: Anzeige der statischen IP.
-
Upstream DNS-Server
- Für den Moment kannst du einen externen Resolver auswählen (z. B. Quad9 oder Cloudflare).
- Später ersetzen wir diesen durch unseren eigenen Unbound-Resolver.
👉 Screenshot geeignet: Auswahl Upstream-DNS.
-
Blocklisten
- Die Standard-Blockliste von Pi-hole reicht für den Anfang.
- Weitere Listen können später im Webinterface hinzugefügt werden.
-
Protokollierung
- Empfehlung: Anonymisierte Logs aktivieren, damit Statistiken vorhanden sind, aber keine kompletten Client-IPs gespeichert werden.
👉 Screenshot geeignet: Auswahl der Logging-Einstellungen.
- Empfehlung: Anonymisierte Logs aktivieren, damit Statistiken vorhanden sind, aber keine kompletten Client-IPs gespeichert werden.
Am Ende zeigt das Skript eine Übersicht und bestätigt die Installation.
Note
Nach Abschluss der Installation erhältst du die Admin-Weboberfläche von Pi-hole und ein Web-Admin-Passwort.
Dieses Passwort unbedingt notieren – ohne kannst du dich später nicht anmelden.
Installation Unbound
Was ist Unbound?
Unbound ist ein sogenannter rekursiver DNS-Resolver.
Im Gegensatz zu externen DNS-Anbietern (z. B. Google 8.8.8.8 oder Cloudflare 1.1.1.1) löst Unbound deine DNS-Anfragen selbstständig auf.
Das bedeutet:
- Unbound fragt direkt bei den Root-Servern des Internets nach.
- Von dort bekommt er die Adresse der zuständigen Top-Level-Domain-Server (z. B.
.com). - Dann fragt er bei diesen nach dem autoritativen Server für die gesuchte Domain (z. B.
example.com). - Schließlich liefert Unbound die endgültige IP-Adresse zurück.
Damit fallen externe DNS-Dienste komplett weg.
Alle Auflösungen passieren lokal in deinem Netzwerk.
Das sorgt für mehr Privatsphäre und macht dich unabhängiger von Dritten.
👉 Screenshot geeignet: Netzwerkaufbau mit und ohne Unbound – links der Weg über externe DNS-Server, rechts der direkte Weg über Unbound mit Root-Servern.
Note
Der erste Aufruf einer Domain kann über Unbound etwas länger dauern, da die komplette Kette abgefragt werden muss.
Danach wird das Ergebnis zwischengespeichert (Caching), sodass weitere Aufrufe sofort beantwortet werden.
Unbound installieren
Unbound wird über die Paketverwaltung installiert:
apt install unbound -y
Zusätzlich benötigt Unbound die Root-Hints, also die Adressen der Root-Server des Internets:
wget https://www.internic.net/domain/named.cache -O /var/lib/unbound/root.hints
Unbound konfigurieren
Jetzt erstellen wir eine Konfigurationsdatei, die speziell auf Pi-hole abgestimmt ist:
nano /etc/unbound/unbound.conf.d/pi-hole.conf
Folgenden Inhalt einfügen:
server:
verbosity: 0
interface: 127.0.0.1
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
do-ip6: yes
root-hints: "/var/lib/unbound/root.hints"
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: no
edns-buffer-size: 1232
prefetch: yes
num-threads: 2
so-rcvbuf: 1m
- interface 127.0.0.1 & port 5335 → Unbound lauscht nur lokal und nicht im gesamten Netzwerk, was die Sicherheit erhöht.
- root-hints → verweist auf die Root-Server-Datei.
- harden-Optionen → sorgen für zusätzliche Sicherheit und DNSSEC-Unterstützung.
- prefetch → häufig angefragte Domains werden im Cache aktuell gehalten.
Datei speichern mit Strg+O, Enter → Beenden mit Strg+X.
Unbound starten
Unbound aktivieren und starten:
systemctl enable unbound
systemctl restart unbound
systemctl status unbound
Tip
Wenn alles funktioniert, zeigt der Status active (running).
Falls Fehler auftreten, können sie mitjournalctl -xeangezeigt werden.
Unbound testen
Bevor wir Pi-hole mit Unbound verbinden, prüfen wir, ob Unbound korrekt läuft.
Dafür nutzen wir das Tool dig, das DNS-Abfragen testet.
Falls es noch nicht installiert ist:
apt install dnsutils -y
Jetzt eine Testabfrage direkt an Unbound:
dig @127.0.0.1 -p 5335 example.com
Wichtige Punkte in der Ausgabe:
- Status: NOERROR → bedeutet, die Domain wurde erfolgreich aufgelöst.
- SERVER: 127.0.0.1#5335 → zeigt, dass Unbound selbst geantwortet hat.
- ANSWER SECTION enthält die IP-Adresse von
example.com.
👉 Screenshot geeignet: Terminalausgabe eines erfolgreichen dig-Befehls.
Note
Beim ersten Aufruf einer Domain dauert die Antwort etwas länger, da Unbound den kompletten Weg von den Root-Servern bis zur Ziel-Domain abfragt.
Jeder weitere Aufruf ist sofort im Cache und dadurch schneller.
Erster Login in die Pi-hole Weboberfläche
Nach der Installation von Pi-hole erreichen wir die Weboberfläche im Browser:
http://192.168.1.5/admin
👉 Screenshot geeignet: Loginseite der Pi-hole Weboberfläche.
Das Passwort wurde am Ende der Installation im Terminal angezeigt.
Falls du es nicht notiert hast, kannst du es im Container neu setzen:
pihole -a -p
Blocklisten & Whitelist einrichten
Die meiste Arbeit erledigen wir bequem in der Pi-hole Weboberfläche.
-
Blocklisten hinzufügen
- Menü öffnen: Group Management → Adlists
- Jede URL einzeln eintragen und als Gruppe Default auswählen.
- Mit Add bestätigen.
Empfehlenswerte Listen:
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/tif.txt https://big.oisd.nl https://v.firebog.net/hosts/lists.php?type=tick https://v.firebog.net/hosts/lists.php?type=malware https://o0.pages.dev/Pro/adblock.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.plus.mini.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/ultimate.mini.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/ultimate.txt https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/multi.txt https://adaway.org/hosts.txt https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/SmartTV.txt https://raw.githubusercontent.com/Perflyst/PiHoleBlocklist/master/android-tracking.txt https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt https://v.firebog.net/hosts/Prigent-Ads.txt https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt👉 Screenshot geeignet: Adlists-Seite mit mehreren eingetragenen Listen.
-
Listen aktualisieren (Gravity Update)
- Menü: Tools → Update Gravity
- Button Update anklicken.
- Nach kurzer Zeit ist die Datenbank aktualisiert.
👉 Screenshot geeignet: Update Gravity mit Fortschrittsanzeige.
-
Wichtige Dienste freigeben (Whitelist)
- Menü: Group Management → Domains → Whitelist
- Beispiele für Regex-Einträge, um WhatsApp oder Facebook zuverlässig freizugeben:
(^|\.)whatsapp\.com$ (^|\.)facebook\.com$
👉 Screenshot geeignet: Domain-Management mit Regex-Whitelist.
Tip
Fast alles in Pi-hole lässt sich über die Weboberfläche erledigen.
Das Terminal ist nur Plan B, falls die GUI mal nicht erreichbar ist.
Logging
Unter Settings → Privacy stellst du ein, wie Pi-hole mit Logs umgeht:
- Anonymous mode (empfohlen): Anfragen werden gezählt, aber ohne Client-IP gespeichert.
- Show everything: nur nutzen, wenn du detaillierte Fehleranalysen machen willst.
👉 Screenshot geeignet: Auswahlfeld „Privacy mode“.
Upstream-DNS auf Unbound setzen
Jetzt verbinden wir Pi-hole mit unserem lokalen Resolver:
- Gehe zu Settings → DNS.
- Entferne alle externen Upstream-Server (Cloudflare, Google usw.).
- Trage stattdessen ein:
127.0.0.1#5335 - Speichern.
👉 Screenshot geeignet: Pi-hole DNS-Konfiguration mit 127.0.0.1#5335.
Router auf Pi-hole umstellen
Damit Pi-hole Anfragen bearbeiten kann, müssen wir den DNS-Server im Netzwerk ändern.
Dafür gibt es zwei Möglichkeiten:
-
Am Router (empfohlen)
- Im Router-Interface den Bereich Netzwerk / DHCP / DNS-Server öffnen.
- Als primären DNS-Server die feste IP des Containers eintragen (z. B.
192.168.1.5). - Speichern und Router kurz neu starten.
👉 Screenshot geeignet: Router-Einstellung DNS-Server.
Tip
So nutzt jedes Gerät im Netzwerk automatisch Pi-hole, ohne dass man sie einzeln konfigurieren muss.
-
Am einzelnen Gerät (für Tests)
- In den Netzwerkeinstellungen des PCs oder Smartphones manuell als DNS-Server
192.168.1.5eintragen. - Verbindung trennen und neu verbinden.
- In den Netzwerkeinstellungen des PCs oder Smartphones manuell als DNS-Server
Funktion prüfen
- Öffne eine Webseite am PC/Smartphone, das den neuen DNS-Server nutzt.
- Im Pi-hole-Dashboard (http://192.168.1.5/admin) sollten jetzt die ersten Anfragen sichtbar sein.
- Dort erkennst du: Blockierte Anfragen, durchgelassene Anfragen und die Gesamtzahl.
👉 Screenshot geeignet: Pi-hole Dashboard mit ersten Anfragen.
Ergebnis
Wir haben nun ein funktionierendes System aus Pi-hole und Unbound in einem einzigen Container:
- Pi-hole filtert Werbung und Tracking netzwerkweit.
- Unbound löst alle DNS-Anfragen rekursiv auf – direkt von den Root-Servern bis zur Ziel-Domain.
- Durch die Kombination sind wir unabhängig von externen DNS-Anbietern und behalten die volle Kontrolle über unsere Daten.
- Blocklisten sorgen für eine starke Filterwirkung, Regex-Whitelist-Einträge stellen sicher, dass wichtige Dienste wie WhatsApp oder Facebook weiterhin nutzbar bleiben.
- Über die Weboberfläche können alle Einstellungen komfortabel gepflegt und jederzeit erweitert werden.
👉 Screenshot geeignet: Pi-hole Dashboard mit laufenden Statistiken (Anfragen gesamt, blockierte Anfragen, verwendete Listen).
Note
Nicht alle Werbung kann gefiltert werden.
Dienste wie YouTube oder Spotify liefern Werbung über dieselben Server wie die eigentlichen Inhalte.
Pi-hole kann solche Werbung nicht zuverlässig blockieren, ohne auch die Inhalte selbst zu unterbrechen.
Tip
Ab jetzt läuft die gesamte DNS-Auflösung deines Heimnetzes durch Pi-hole + Unbound.
Jede Anfrage, die im Dashboard erscheint, bestätigt: dein Netzwerk filtert erfolgreich.
Ausblick
Im nächsten Kapitel kümmern wir uns um den Nginx Proxy Manager (NPM).
Damit stellen wir die Weichen, um alle unsere Dienste sicher und übersichtlich nach außen verfügbar zu machen – mit HTTPS-Zertifikaten und zentralem Zugriffspunkt.