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).
-
Přihlas se přes SSH k danému Raspberry Pi.
-
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
-
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).
-
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
-
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).
-
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š zkusitnum-threads: 4
pro využití všech jader, ale2
je bezpečný výchozí bod. -
msg-cache-size
arrset-cache-size
: Tyto hodnoty jsou vhodné pro RPi5 s jeho RAM.
-
-
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).
-
Přihlas se do Portaineru (
https://<IP_ADRESA_RPi>:9443
). -
Přejdi na
Stacks
>Add stack
. -
Pojmenuj stack například
dns-resolver
. -
Zkopíruj následující
docker-compose.yml
kód do webového editoru Portaineru. DŮLEŽITÉ: Vports
sekci Pi-hole změň IP adresu na skutečnou IP adresu daného RPi, na kterém stack nasazuješ (tedy192.168.54.2
pro DNS1 a192.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