Skip to main content

Nový Návod: Redundantní DNS Servery (Pi-hole + Unbound) na Raspberry Pi 5 s Automatickou Synchronizací

Nový Návod: Redundantní DNS Servery (Pi-hole + Unbound) na Raspberry Pi 5 s Automatickou Synchronizací

Tento návod ti pomůže nastavit dva nezávislé DNS servery, které se budou navzájem zálohovat a udržovat synchronizovanou konfiguraci. Získáš tak maximální dostupnost a spolehlivost blokování reklam a bezpečné DNS resolvingu ve tvé síti.

 

Cílová architektura:

 

  • Primární server (DNS1): Raspberry Pi 5 s IP adresou 192.168.54.2

  • Sekundární server (DNS2): Raspberry Pi 5 s IP adresou 192.168.54.3

  • Oba servery: Každý poběží Pi-hole a Unbound v Docker kontejnerech. Unbound bude fungovat jako rekurzivní resolver, Pi-hole jako ad-blocker.

  • Synchronizace: Konfigurace Pi-hole (blacklisty, whitelisty, adlisty) se bude automaticky synchronizovat z DNS1 na DNS2 pomocí rsync přes SSH.

  • Časová synchronizace: Operační systémy na obou RPi budou synchronizovat čas s robustní sadou českých NTP serverů pro optimální spolehlivost DNSSEC.


 

Předpoklady (Pro oba Raspberry Pi):

 

Než začneme, ujisti se, že pro oba Raspberry Pi máš splněno následující:

  • Dvě Raspberry Pi 5: Každé s vlastní SD kartou/SSD (doporučeno pro rychlost a životnost).

  • 64-bitový Raspberry Pi OS Lite (nebo Desktop): Nainstalovaný a aktualizovaný.

  • Statické IP adresy:

    • DNS1: 192.168.54.2

    • DNS2: 192.168.54.3

    • Ujisti se, že tyto IP adresy jsou mimo rozsah DHCP serveru tvého routeru, aby nedošlo ke kolizi.

  • SSH přístup: Povoleno a funkční na obou RPi.

  • Uživatel s sudo právy: Na obou RPi (např. výchozí uživatel pi).

  • Nainstalovaný Docker a Portainer: Postup pro instalaci Dockeru a Portaineru najdeš v původním návodu na Zelina.eu, případně zde je rychlý postup:

# Instalace Dockeru
curl -sSL https://get.docker.com | sh
sudo usermod -aG docker pi # Přidej uživatele 'pi' do skupiny docker pro práci bez sudo
newgrp docker # Nebo se odhlas a znovu prihlas

# Instalace Docker Compose pluginu
sudo apt install -y docker-compose-plugin

# Instalace Portaineru
docker volume create portainer_data
docker run -d -p 9000:9000 -p 9443:9443 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

Po instalaci Portaineru se k němu připoj přes prohlížeč (např. https://192.168.54.2:9443) a dokonči jeho prvotní nastavení.

Krok 1: Základní Příprava Systému (Oba Raspberry Pi)

 

Opakuj tento krok pro oba servery (DNS1 a DNS2).

  1. Přihlas se přes SSH k danému Raspberry Pi.

  2. Aktualizuj systém a nainstaluj základní nástroje:

sudo apt update && sudo apt upgrade -y
sudo apt install -y wget rsync nano

Vytvoř adresáře pro data Pi-hole a Unbound:

sudo mkdir -p /opt/unbound/etc/unbound/
sudo mkdir -p /opt/pihole/etc-pihole/
sudo mkdir -p /opt/pihole/etc-dnsmasq.d/

Stáhni root.hints soubor pro Unbound:

sudo wget -O /opt/unbound/etc/unbound/root.hints https://www.internic.net/domain/named.root

 

  1. Tento soubor je nezbytný pro rekurzivní DNS, protože obsahuje adresy kořenových DNS serverů.


 

Krok 2: Konfigurace NTP Časové Synchronizace (Oba Raspberry Pi)

 

Toto je klíčové pro DNSSEC. Zajistíme, že oba servery budou mít vždy přesný čas synchronizovaný s ověřenými českými a evropskými NTP servery.

Opakuj pro oba servery (DNS1 a DNS2).

  1. Otevři konfigurační soubor timesyncd:

sudo nano /etc/systemd/timesyncd.conf

Uprav nebo přidej následující řádky do sekce [Time] (odkomentuj NTP= a přidej servery):

[Time]
NTP=ntp.cesnet.cz tik.cesnet.cz tak.cesnet.cz 0.cz.pool.ntp.org 1.cz.pool.ntp.org 2.cz.pool.ntp.org 0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org
FallbackNTP=time.google.com time.cloudflare.com
    • NTP: Zde jsou preferované české a obecné pool.ntp.org servery.

    • FallbackNTP: Záložní servery pro případ, že by české nebyly dostupné.

  • Ulož a zavři soubor (Ctrl+X, Y, Enter).

  • Restartuj službu systemd-timesyncd:

sudo systemctl restart systemd-timesyncd

Ověř stav synchronizace:

timedatectl status

 

  1. Měl bys vidět:

    • System clock synchronized: yes

    • NTP service: active

    • Případně RTC in local TZ: no je v pořádku.


 

Krok 3: Unbound Konfigurace (Oba Raspberry Pi)

 

Toto je konfigurace rekurzivního resolveru. Bude identická pro oba servery.

Opakuj pro oba servery (DNS1 a DNS2).

  1. Vytvoř konfigurační soubor Unboundu:

sudo nano /opt/unbound/etc/unbound/unbound.conf

Vlož následující obsah:

server:
    # Povoluje přístup z localhostu a Docker sítě
    access-control-oresolved: 127.0.0.1/32 allow
    access-control-oresolved: 172.20.0.0/24 allow # Pro Docker síť

    # Základní nastavení
    verbosity: 1
    port: 5335 # Unbound bude naslouchat na tomto portu, Pi-hole ho bude používat

    # Soukromí a bezpečnost
    do-not-query-localhost: no # Nezbytné pro Unbound uvnitř Dockeru
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    use-caps-for-id: yes
    edns-buffer-size: 1472
    prefetch: yes # Zlepšuje výkon přednačítáním
    num-threads: 2 # Počet vláken, pro RPi5 můžeš zkusit i 4 pro max. výkon
    # Optimalizace cache (přizpůsobeno pro RPi5 s dostatkem RAM)
    msg-cache-size: 128m # Velikost cache pro DNS zprávy
    rrset-cache-size: 256m # Velikost cache pro DNS záznamy (doporučeno min 2x msg-cache)
    cache-min-ttl: 3600 # Minimální TTL pro záznamy v cache (1 hodina)
    cache-max-ttl: 86400 # Maximální TTL pro záznamy v cache (24 hodin)
    do-tcp: yes
    do-udp: yes

    # Rebinding ochrana (velmi důležité pro domácí sítě)
    private-address: 192.168.0.0/16
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12

    # Logging
    log-queries: no
    log-replies: no

    # DNSSEC
    auto-trust-anchor-file: "/etc/unbound/root.hints"
    • num-threads: Pro RPi5 můžeš zkusit num-threads: 4 pro využití všech jader, ale 2 je bezpečný výchozí bod.

    • msg-cache-size a rrset-cache-size: Tyto hodnoty jsou vhodné pro RPi5 s jeho RAM.

  1. Ulož a zavři soubor.


 

Krok 4: Deployment Pi-hole & Unbound Stacku (Oba Raspberry Pi)

 

Použijeme Portainer k nasazení Docker stacku.

Opakuj pro oba servery (DNS1 a DNS2).

  1. Přihlas se do Portaineru (https://<IP_ADRESA_RPi>:9443).

  2. Přejdi na Stacks > Add stack.

  3. Pojmenuj stack například dns-resolver.

  4. Zkopíruj následující docker-compose.yml kód do webového editoru Portaineru. DŮLEŽITÉ: V ports sekci Pi-hole změň IP adresu na skutečnou IP adresu daného RPi, na kterém stack nasazuješ (tedy 192.168.54.2 pro DNS1 a 192.168.54.3 pro DNS2).

version: "3.8"

services:
  unbound:
    container_name: unbound
    image: mvance/unbound:latest
    restart: unless-stopped
    networks:
      dns_network:
        ipv4_address: 172.20.0.10
    volumes:
      - /opt/unbound/etc/unbound:/etc/unbound/
    command: -c /etc/unbound/unbound.conf
    healthcheck:
      test: ["CMD", "unbound-control", "healthcheck"]
      interval: 10s
      timeout: 5s
      retries: 3
    environment:
      TZ: Europe/Prague # Nebo tvá časová zóna
    ports:
      - "5335:5335/tcp" # Interní port pro Pi-hole, externí pro Unbound (pro testování)
      - "5335:5335/udp"

  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    restart: unless-stopped
    networks:
      dns_network:
        ipv4_address: 172.20.0.11 # Interní IP pro Pi-hole
    ports:
      # --- DŮLEŽITÉ: ZDE ZMĚŇ IP ADRESU NA AKTUÁLNÍ IP RASPBERRY PI ---
      # Příklad pro DNS1: "192.168.54.2:53:53/tcp"
      # Příklad pro DNS2: "192.168.54.3:53:53/tcp"
      - "TVOJE_IP_RPi:53:53/tcp"
      - "TVOJE_IP_RPi:53:53/udp"
      - "TVOJE_IP_RPi:80:80/tcp" # Webové rozhraní Pi-hole (HTTP)
      # Pokud máš reverzní proxy pro HTTPS (doporučeno), nemusíš mapovat port 443 zde
      # Tvá reverzní proxy se bude starat o 443 a přesměrování na port 80 Pi-hole.
      # - "TVOJE_IP_RPi:443:443/tcp" # Povolení portu, ale vyžaduje další konfiguraci SSL/TLS certifikátů
      - "67:67/udp" # Pouze pro DHCP, pokud jej budeš používat
    environment:
      TZ: Europe/Prague # Nebo tvá časová zóna
      WEBPASSWORD: "TvéSilnéHesloPihole" # Změň na silné a komplexní heslo!
      DNSMASQ_LISTENING: "all"
      PIHOLE_DNS_: "172.20.0.10#5335" # Přeposílání dotazů na interní Unbound
      DNSSEC: "true"
      REV_SERVER: "true" # Povolí Conditional Forwarding pro lokální jména
      REV_SERVER_CIDR: "192.168.54.0/24" # Změň na rozsah TVÉ LOKÁLNÍ SÍTĚ! (např. 192.168.1.0/24)
      REV_SERVER_TARGET: "192.168.54.1" # IP adresa tvého routeru (nebo lokálního DHCP serveru)
      REV_SERVER_DOMAIN: "local" # Tvůj lokální doménový název (např. .local, .lan)
      # NTP servery pro Pi-hole - české a záložní
      PIHOLE_NTP_SERVERS: "ntp.cesnet.cz,tik.cesnet.cz,tak.cesnet.cz,0.cz.pool.ntp.org,1.cz.pool.ntp.org,2.cz.pool.ntp.org,0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org"
    volumes:
      - /opt/pihole/etc-pihole/:/etc/pihole/
      - /opt/pihole/etc-dnsmasq.d/:/etc/dnsmasq.d/
    depends_on:
      - unbound

networks:
  dns_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24 # Interní Docker síť pro kontejnery