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í.
Blokování české a slovenské reklamy
Toto jsou nejdůležitější seznamy pro blokování reklam na českých a slovenských webech.
-
CZ/SK Adblock List (oficiální seznam pro Adblock/uBlock, funguje skvěle i v Pi-hole)
-
Zaměřuje se na reklamy na hlavních českých a slovenských portálech. Je velmi aktivně udržovaný.
-
https://raw.githubusercontent.com/CzechAdblock/adblock-tve/main/filter.txt
-
-
Seznam Patrika Křížka (doplněk k hlavnímu seznamu)
-
Obsahuje další domény specifické pro český internet, které se nemusí objevit v hlavním seznamu.
-
https://raw.githubusercontent.com/kriznik/pihole-czech/master/lists/domains-adblock.txt
-
Vynikající a doporučené seznamy (obecné)
Tyto seznamy jsou považovány za standard a jsou velmi dobře udržované. The Firebog je jeden z nejrespektovanějších zdrojů.
-
Firebog - "Ticked Lists" (zaškrtnuté seznamy)
-
Firebog.net analyzuje a kategorizuje desítky seznamů. Ty, které jsou označené jako "zaškrtnuté", jsou považovány za bezpečné (neblokují legitimní weby) a jsou doporučené pro každého.
-
Reklamy (standardní):
-
https://adaway.org/hosts.txt
-
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
-
-
Podezřelé weby:
-
https://raw.githubusercontent.com/mitchellkrogza/The-Big-List-of-Hacked-and-Hijacked-Domains/master/hosts
-
-
Phishing (podvodné stránky):
-
https://phishing.army/download/phishing_army_blocklist_extended.txt
-
-
-
OISD (o-is-d.com) - Full List
-
Jeden z nejpopulárnějších a nejkomplexnějších seznamů vůbec. Blokuje reklamy, malware, phishing, telemetrii a mnoho dalšího. Je velmi dobře udržovaný a má minimum falešných pozitiv (tzv. "false positives"). Pro mnoho lidí je to jediný seznam, který potřebují.
-
https://dbl.oisd.nl/
-
Blokování Malware, Adware a Virů (bezpečnostní)
Tyto seznamy se zaměřují specificky na bezpečnostní hrozby.
-
Firebog - Seznamy zaměřené na malware
-
Kolekce několika seznamů, které se specializují na domény šířící malware.
-
https://raw.githubusercontent.com/PolishFiltersTeam/KAD/master/hosts
-
https://raw.githubusercontent.com/FadeMind/hosts.extras/master/add.Spam/hosts
-
-
Developer Dan's Threat-Intel Feeds
-
Velmi kvalitní a často aktualizovaný seznam domén spojených s malwarem a phishingem.
-
https://www.github.developerdan.com/hosts/lists/threat-intel/hosts.txt
-
-
URLHaus by Abuse.ch
-
Tento projekt sbírá a sdílí domény, které jsou aktivně využívány k šíření malwaru. Jedná se o velmi důležitý bezpečnostní seznam.
-
https://urlhaus.abuse.ch/downloads/hostfile/
-
DŮLEŽITÉ UPOZORNĚNÍ:
Méně je někdy více. Nezačínejte tím, že přidáte všechny seznamy najednou. Příliš mnoho seznamů může vést k tzv. "overblocking", kdy začnete blokovat i weby a služby, které používat chcete (např. stránky pro sledování zásilek, některé platební brány atd.).
Doporučený postup:
-
Začněte s českým seznamem a seznamem od OISD.
-
Aktualizujte Gravity (Tools -> Update Gravity).
-
Používejte internet jako obvykle po dobu jednoho dne.
-
Pokud vše funguje, můžete opatrně přidat další seznam (např. jeden bezpečnostní) a postup opakovat.
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:
sudo apt update
sudo apt install dnsutils
dig @192.168.54.2 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.