Pi-Hole und Unbound
Eigentlich wollte ich „nur mal kurz“ einen Werbeblocker fürs ganze Haus einrichten. Am Ende ist daraus ein kleines Infrastruktur-Projekt geworden: Pi-hole als zentraler DNS-Werbeblocker, Unbound als eigener rekursiver DNS-Resolver, das Ganze in einer Ubuntu-VM unter Proxmox – mit Docker, Home Assistant und einer Visualisierung per ApexCharts.
In diesem Artikel zeige ich dir:
- Warum ich Pi-hole nutze (und warum es sich lohnt)
- Warum Unbound die perfekte Ergänzung ist
- Wie das Ganze in einer Proxmox-VM läuft
- Wie ich Pi-hole in Docker mit Port 8081 betreibe (weil Port 80 schon belegt war)
- Wie Pi-hole mit Unbound wirklich sauber zusammenarbeitet (Docker-Netzwerk statt 127.0.0.1)
- Wie ich das Ganze mit einer ApexCharts-Karte in Home Assistant visualisiere
Warum Pi-hole?
Pi-hole ist ein DNS-basierter Werbeblocker für das gesamte Netzwerk. Im Gegensatz zu Browser-Plugins blockiert Pi-hole Werbung und Tracking direkt beim DNS-Request:
- Werbung wird gar nicht erst geladen
- Tracking-Domains laufen ins Leere
- Alle Geräte im Netzwerk profitieren: iPhones, Smart-TVs, Tablets, IoT usw.
Das Ergebnis merkt man oft sofort: Seiten bauen sich schneller auf, Apps fühlen sich ruhiger an – und vor allem Geräte ohne eigenen Adblocker profitieren.
Warum zusätzlich Unbound?
Pi-hole alleine ist schon gut – aber Pi-hole ist primär ein Filter. Um Domains aufzulösen, braucht es einen Upstream-DNS. Standardmäßig nimmt man häufig externe Resolver wie Google (8.8.8.8) oder Cloudflare (1.1.1.1). Das hat zwei Nachteile:
- Ein externer Anbieter sieht einen Großteil deiner DNS-Anfragen
- Du bist von der Performance und Verfügbarkeit dieses Dienstes abhängig
Unbound löst beides elegant:
- Unbound ist ein eigener rekursiver DNS-Resolver
- Er fragt direkt bei Root-Servern, TLD-Servern und autoritativen Nameservern
- Er cached Antworten lokal (vieles kommt danach extrem schnell zurück)
- Er kann DNSSEC validieren und erhöht damit die Sicherheit
- Kein großer DNS-Anbieter sieht mehr deinen kompletten DNS-Traffic
Die Kombination sieht so aus:
Geräte im LAN → Pi-hole (Blocker) → Unbound (Resolver) → Internet
Proxmox-Setup: Warum eine eigene VM?
Ich betreibe meine Dienste auf einem Proxmox-Host mit mehreren VMs. Für Pi-hole + Unbound habe ich eine eigene Ubuntu Server VM erstellt. Vorteile:
- Saubere Trennung von Funktionen (Webserver, Home Assistant, DNS usw.)
- Snapshots vor großen Änderungen möglich
- Leichtes Backup der gesamten DNS-Infrastruktur
- Im Notfall kann die VM auf einen anderen Host migriert werden
Die VM hat im LAN eine feste IP: 192.168.178.5. Auf dieser IP laufen:
- mein Apache-Webserver (ThinkKreativ & Co.)
- Home Assistant im Docker
- Pi-hole + Unbound im Docker
Port 80 war schon belegt – Pi-hole auf 8081
Pi-hole möchte mit seinem Webinterface standardmäßig auf Port 80 laufen. Genau dort hängt aber bereits mein Apache, der u.a. thinkkreativ.de ausliefert.
Lösung: Pi-hole bekommt einen anderen externen Port. Intern im Container läuft es weiter auf Port 80, nach außen mappe ich aber auf 8081:
ports: - "53:53/tcp" - "53:53/udp" - "8081:80/tcp"
Der Apache bleibt auf Port 80, Pi-hole ist nun über http://192.168.178.5:8081/admin erreichbar.
Pi-hole + Unbound im Docker: So ist es wirklich korrekt
Der wichtigste Punkt, der oft falsch gemacht wird: 127.0.0.1 im Pi-hole-Container ist nicht der Host. Wenn Unbound in einem anderen Container läuft, ist 127.0.0.1#5335 im Pi-hole-Container schlicht falsch – dann bekommt man Timeouts.
Die saubere Lösung: Beide Container in einem gemeinsamen Docker-Netz und Pi-hole nutzt Unbound über den Servicenamen (unbound).
Die funktionierende docker-compose.yml (Pi-hole Web auf 8081, DNS auf 53):
version: "3.8" services: unbound: image: mvance/unbound:latest container_name: unbound restart: unless-stopped volumes: - /opt/unbound/unbound.conf:/etc/unbound/unbound.conf:ro pihole: image: pihole/pihole:latest container_name: pihole restart: unless-stopped environment: TZ: "Europe/Berlin" WEBPASSWORD: "DEINPASSWORT" DNSMASQ_LISTENING: "all" FTLCONF_dns_upstreams: "unbound#53" volumes: - ./etc-pihole:/etc/pihole - ./etc-dnsmasq.d:/etc/dnsmasq.d ports: - "53:53/tcp" - "53:53/udp" - "8081:80/tcp" depends_on: - unbound
Damit gilt:
- Pi-hole beantwortet DNS auf Port 53 fürs LAN
- Pi-hole leitet nicht geblockte Anfragen an Unbound weiter
- Unbound löst rekursiv auf und cached lokal
Unbound optimiert: Beispiel-Konfiguration
Hier eine kompakte, praxistaugliche unbound.conf, die gut zu Home-Setups passt:
server: verbosity: 1 interface: 0.0.0.0 port: 53 do-ip4: yes do-ip6: no do-udp: yes do-tcp: yes num-threads: 2 so-reuseport: yes edns-buffer-size: 1232 hide-identity: yes hide-version: yes qname-minimisation: yes harden-glue: yes harden-dnssec-stripped: yes harden-referral-path: yes aggressive-nsec: yes msg-cache-size: 64m rrset-cache-size: 128m cache-min-ttl: 600 cache-max-ttl: 86400 prefetch: yes prefetch-key: yes log-queries: no log-replies: no use-syslog: yes logfile: "" auto-trust-anchor-file: "/var/lib/unbound/root.key" root-hints: "/var/lib/unbound/root.hints"
ApexCharts in Home Assistant: Pi-hole schön visualisieren
Ich habe Pi-hole in Home Assistant eingebunden und mit der apexcharts-card eine kleine Übersicht gebaut. Die Sensoren kommen aus der Pi-hole-Integration, z.B.:
sensor.pi_hole_dns_abfragensensor.pi_hole_blockierte_anzeigensensor.pi_hole_anteil_blockierter_anzeigen
Hier das Template für die ApexCharts-Karte:
type: custom:apexcharts-card header: show: true title: Pi-hole – Gesamtübersicht show_states: true colorize_states: true graph_span: 24h span: start: day now: show: true chart: height: 260 toolbar: show: false yaxis: - id: main title: 'Anfragen' decimals: 0 - id: blockrate opposite: true title: 'Blockrate %' min: 0 max: 100 decimals: 0 series: - entity: sensor.pi_hole_dns_abfragen name: 'DNS-Abfragen' type: column color: '#4499EE' group_by: duration: 10min func: max yaxis_id: main - entity: sensor.pi_hole_blockierte_anzeigen name: 'Blockierte Anzeigen' type: column color: '#FFAA33' group_by: duration: 10min func: max yaxis_id: main - entity: sensor.pi_hole_anteil_blockierter_anzeigen name: 'Blockrate %' type: line color: '#FF4F4F' stroke_width: 2 group_by: duration: 10min func: max yaxis_id: blockrate legend: show: true formatter: | EVAL:(w, { seriesName, value }) => { if (seriesName === 'Blockrate %') { return `${seriesName}: ${Math.round(value)} %`; } return `${seriesName}: ${Math.round(value)}`; }
Fazit: Einmal Pi-hole + Unbound, nie wieder ohne
Die Kombination aus Pi-hole und Unbound in einer Proxmox-VM hat sich für mich voll gelohnt:
- Weniger Werbung und Tracking im gesamten Haushalt
- Schnellere DNS-Antworten dank lokalem Cache
- Mehr Datenschutz, weil kein externer DNS-Anbieter alle DNS-Queries sieht
- Saubere Trennung in einer dedizierten VM und leichtes Backup
- Schöne Visualisierung in Home Assistant durch ApexCharts
Wenn du also sowieso einen Proxmox-Host oder einen kleinen Homeserver betreibst: Pi-hole + Unbound solltest du dir unbedingt anschauen. Es ist eines dieser Projekte, die man einmal einrichtet – und danach fragt man sich, wie man vorher ohne leben konnte.