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:

    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.

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

           

           


           

          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:

          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.