Skip to main content

Finální a funkční návod: Pi-hole + Vlastní rekurzivní Unbound resolver na Raspberry Pi (pro Portainer)

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


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 systemctlcurl stop-o avahi-daemon/opt/unbound/root.hints sudo systemctl disable avahi-daemonhttps://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.