Pi-Hole und Unbound

Pi-Hole und Unbound – thinkkreativ Blogartikel

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_abfragen
  • sensor.pi_hole_blockierte_anzeigen
  • sensor.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.