Finální a funkční návod: Pi-hole + Vlastní rekurzivní Unbound resolver na Raspberry Pi (pro Portainer)
Vytvořeno: 15.07.2025!! Testováno na RPI5, Pihole funkční... dns2.zelina.eu
Tento návod vás provede instalací plně nezávislého, rekurzivního a výkonného DNS resolveru s filtrováním reklam. Unbound slouží jako váš soukromý, bezpečný rekurzivní resolver s podporou DNSSEC a Pi-hole jako efektivní DNS filtr (ad-blocker). Toto řešení se neptá žádných třetích stran jako Google nebo Cloudflare.
Předpoklady
-
Raspberry Pi (ideálně 4/5) s 64-bitovým OS (např. Raspberry Pi OS 64-bit).
-
Nainstalovaný Docker a Portainer.
-
Pevná IP adresa pro Raspberry Pi (v tomto návodu používáme 192.168.54.3).
Architektura řešení
-
Docker vytvoří privátní virtuální síť pro oba kontejnery.
-
Unbound poběží v této síti s pevnou interní IP adresou 172.20.0.10 a bude naslouchat na portu 5335. Bude fungovat jako rekurzivní DNS resolver, který se ptá přímo kořenových serverů internetu.
-
Pi-hole bude naslouchat na standardním DNS portu 53. Všechny dotazy, které projdou jeho filtry, přepošle na pevnou IP adresu Unboundu (172.20.0.10#5335).
-
Tato architektura s pevnou IP adresou je nejrobustnější a eliminuje problémy s překladem jmen při startu kontejnerů.
TY MÁŠ PLNOHODNOTNÝ REKURZIVNÍ RESOLVER. Neběžíš bez resolveru.
Pojďme si to vysvětlit jednoduše, jak ten řetězec funguje:
Tvůj počítač/telefon se zeptá: "Kdo je seznam.cz?" -> Dotaz pošle na 192.168.54.3:53 (to je Pi-hole).
Pi-hole (na portu 53) dotaz přijme:
Zkontroluje, jestli seznam.cz není na blacklistu. Není.
Řekne si: "OK, nevím, kdo to je. Musím se zeptat svého nadřízeného (upstream) serveru."
Podle naší konfigurace (PIHOLE_DNS_: "172.20.0.10#5335") přepošle dotaz na interní adresu 172.20.0.10 na port 5335.
Unbound (na 172.20.0.10:5335) dotaz přijme:
A teď přichází to kouzlo. Unbound NEPOŠLE dotaz na žádný Google DNS, Cloudflare, ani jiný veřejný resolver.
Místo toho se podívá do svého souboru root.hints (který jsi stáhl).
Začne se ptát přímo kořenových serverů internetu: "Kde najdu servery pro doménu .cz?"
Kořenový server mu odpoví.
On se pak zeptá .cz serveru: "Kde najdu server pro doménu seznam.cz?"
.cz server mu odpoví.
Nakonec se zeptá autoritativního serveru pro seznam.cz: "Jakou máš IP adresu?"
Server seznam.cz mu odpoví a Unbound získá finální IP adresu.
Tento celý proces se jmenuje REKURZE. Unbound je tvůj vlastní soukromý REKURZIVNÍ RESOLVER.
Unbound pošle odpověď zpět Pi-hole.
Pi-hole pošle finální odpověď zpět tvému počítači.
Shrnutí:
Pi-hole je jen filtr a "přeposílač" (forwarder).
Unbound je tvůj vlastní, soukromý, rekurzivní resolver. On je ten, kdo dělá tu těžkou práci a zjišťuje IP adresy od úplného začátku.
Takže ano, jedeš s plnohodnotným resolverem, který jsi chtěl. Je to přesně ta konfigurace, která zajišťuje maximální soukromí a nezávislost.
Krok 1: Příprava hostitelského systému
Nejprve připravíme adresáře a konfigurační soubory na vašem Raspberry Pi.
Vypnutí konfliktních služeb (volitelné, ale doporučené):
Služba Avahi může někdy způsobovat problémy v síti. Pro čistou instalaci ji doporučujeme vypnout.
sudo systemctl stop avahi-daemon
sudo systemctl disable avahi-daemon
Vytvoření adresářů:
Vytvoříme adresáře, kde bude uložena veškerá konfigurace a data.
# Smažeme staré pokusy pro absolutně čistý start
sudo rm -rf /opt/pihole /opt/unbound
# Vytvoříme novou, čistou strukturu
sudo mkdir -p /opt/pihole/etc-pihole /opt/pihole/etc-dnsmasq.d
sudo mkdir -p /opt/unbound
Stažení root.hints pro Unbound:
Tento soubor obsahuje seznam kořenových DNS serverů. Je to startovní bod pro rekurzivní vyhledávání.
sudo curl -o /opt/unbound/root.hints https://www.internic.net/domain/named.cache
Krok 2: Konfigurace Unbound s agresivním kešováním
Vytvoříme konfigurační soubor pro Unbound. Nastavení je optimalizováno pro maximální výkon a využití paměti na dedikovaném DNS serveru.
Otevřete nový konfigurační soubor v editoru:
sudo nano /opt/unbound/unbound.conf
Vložte do něj následující obsah:
server:
# Obecné nastavení
verbosity: 1
port: 5335
interface: 0.0.0.0@5335
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes
do-daemonize: no
# Oprávnění - Povolit dotazy z privátních sítí (pro Docker)
access-control: 127.0.0.0/8 allow
access-control: 10.0.0.0/8 allow
access-control: 172.16.0.0/12 allow
access-control: 192.168.0.0/16 allow
# Cesta k souboru s kořenovými servery
root-hints: "/etc/unbound/root.hints"
# Bezpečnost a DNSSEC
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: no # Nutné pro běh v Docker kontejneru
# Agresivní kešování a výkon (optimalizováno pro RPi 4/5 s více RAM)
msg-cache-size: 256m
rrset-cache-size: 512m
num-threads: 4 # Vhodné pro 4-jádrové CPU RPi
so-rcvbuf: 1m
so-sndbuf: 1m
# Minimalizace TTL (udržuje cache déle čerstvou)
cache-min-ttl: 3600 # Minimálně 1 hodina
cache-max-ttl: 86400 # Maximálně 1 den
# Prefetching - Unbound se pokusí obnovit populární záznamy v cache
# ještě předtím, než vyprší jejich platnost. Výrazně zrychluje odezvu.
prefetch: yes
prefetch-key: yes
Krok 3: Vytvoření a nasazení stacku v Portaineru
Nyní nasadíme oba kontejnery pomocí Portaineru.
-
Otevřete webové rozhraní Portaineru.
-
Přejděte do sekce Stacks a klikněte na + Add stack.
-
Zadejte název stacku, např. dns-final.
-
Do pole Web editor vložte následující YAML kód. Nezapomeňte změnit WEBPASSWORD!
version: '3.8'
# Definujeme vlastní síť s explicitní podsítí, abychom mohli přiřadit pevnou IP
networks:
dns_net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
restart: unless-stopped
networks:
- dns_net
environment:
TZ: "Europe/Prague"
WEBPASSWORD: "ZdeZadejteSvéVelmiSilnéHeslo"
# Odkazujeme na pevnou IP adresu Unboundu, ne na jméno služby.
# Tím je zajištěn bezproblémový start.
PIHOLE_DNS_: "172.20.0.10#5335"
DNSSEC: "true"
volumes:
- /opt/pihole/etc-pihole:/etc/pihole
- /opt/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
cap_add:
- NET_ADMIN
ports:
- "192.168.54.2:53:53/tcp"
- "192.168.54.2:53:53/udp"
- "192.168.54.2:80:80/tcp"
- "192.168.54.2:443:443/tcp"
depends_on:
- unbound
unbound:
container_name: unbound
image: klutchell/unbound:1.19.0
restart: unless-stopped
networks:
# Přiřadíme kontejneru pevnou IP adresu v naší síti
dns_net:
ipv4_address: 172.20.0.10
volumes:
- /opt/unbound/unbound.conf:/etc/unbound/unbound.conf:ro
- /opt/unbound/root.hints:/etc/unbound/root.hints:ro
-
Sjeďte dolů a klikněte na Deploy the stack. Počkejte minutu, než se vše stáhne a spustí.
Krok 4: Kompletní testování funkčnosti
Po nasazení je klíčové ověřit, že vše funguje správně. Spusťte tyto příkazy v terminálu na jakémkoliv počítači ve vaší síti (nebo přímo na RPi).
-
Základní test překladu:
dig @192.168.54.3 seznam.cz
Očekávaný výsledek: status: NOERROR a platná IP adresa.
Test blokování reklam:
dig @192.168.54.3 doubleclick.net
Očekávaný výsledek: Odpověď s IP adresou 0.0.0.0.
Test DNSSEC - Ověření platného podpisu:
dig @192.168.54.3 sigok.verteiltesysteme.net
Očekávaný výsledek: status: NOERROR a ve výpisu musí být vlajka ad (Authenticated Data).
Test DNSSEC - Odmítnutí neplatného podpisu:
dig @192.168.54.3 sigfail.verteiltesysteme.net
Očekávaný výsledek: status: SERVFAIL. Toto je správné chování, Unbound odmítl podvrženou odpověď.
Test kešování:
Spusťte dvakrát za sebou:
dig @192.168.54.3 idnes.cz
dig @192.168.54.3 seznam.cz
dig @192.168.54.3 google.cz
Očekávaný výsledek: Query time u prvního dotazu bude v desítkách/stovkách milisekund. U druhého dotazu by měla být Query time: 0 msec.
Krok 5: Finální nastavení sítě
Nakonec nastavte na svém routeru (nebo na jednotlivých zařízeních) jako jediný DNS server adresu vašeho Raspberry Pi: 192.168.54.3. Tím zajistíte, že veškerý DNS provoz ve vaší síti bude procházet přes váš nový, bezpečný, soukromý a rychlý resolver.