Skip to main content

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:

  1. Tvůj počítač/telefon se zeptá: "Kdo je seznam.cz?" -> Dotaz pošle na 192.168.54.3:53 (to je Pi-hole).

  2. 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.

  3. 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.

  4. Unbound pošle odpověď zpět Pi-hole.

  5. 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.

  1. Otevřete webové rozhraní Portaineru.

  2. Přejděte do sekce Stacks a klikněte na + Add stack.

  3. Zadejte název stacku, např. dns-final.

  4. 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
  1. 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:

  1. Začněte s českým seznamem a seznamem od OISD.

  2. Aktualizujte Gravity (Tools -> Update Gravity).

  3. Používejte internet jako obvykle po dobu jednoho dne.

  4. 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).

  1. 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.