Kompletní návod: Bezpečný DNS server s Pi-hole, DoH, DNSSEC a SNI 2025-06-29
Tento návod tě provede krok za krokem vytvořením vlastního DNS resolveru na Raspberry Pi. Výsledkem bude systém, který:
-
Blokuje reklamy a trackery v celé tvé síti pomocí Pi-hole.
-
Šifruje všechny odchozí DNS dotazy pomocí DNS-over-HTTPS (DoH), takže tvůj poskytovatel internetu neuvidí, jaké weby navštěvuješ.
-
Ověřuje pravost DNS odpovědí pomocí DNSSEC, čímž tě chrání před podvrženými stránkami.
-
Podporuje moderní technologie jako Encrypted SNI (ECH) pro ještě vyšší soukromí.
Celé to poběží v Dockeru a budeme to spravovat pohodlně přes Portainer.
Předpoklady
-
Raspberry Pi (doporučuji model 4 nebo 5) se stabilním systémem (např. Raspberry Pi OS).
-
Nainstalovaný Docker a Portainer.
-
Statická IP adresa pro tvůj Raspberry Pi (v našem příkladu budeme používat 192.168.54.7).
Část 1: Příprava adresářů a souborů na Raspberry Pi
Nejdříve si přes SSH (PuTTY) na tvém Pi připravíme veškerou strukturu.
1. Vytvoření adresářové struktury
Vytvoříme si přehlednou strukturu v adresáři /opt/.
# Vytvoření hlavního adresáře pro náš projekt
sudo mkdir -p /opt/dns-server
# Vytvoření adresářů pro konfiguraci Pi-hole
sudo mkdir -p /opt/dns-server/pihole/etc-pihole
sudo mkdir -p /opt/dns-server/pihole/etc-dnsmasq.d
# Vytvoření adresáře pro konfiguraci dnscrypt-proxy
sudo mkdir -p /opt/dns-server/dnscrypt-proxy
2. Nastavení oprávnění pro dnscrypt-proxy
Toto je velmi důležitý krok. Kontejner dnscrypt-proxy běží z bezpečnostních důvodů pod specifickým uživatelem (s ID 991). Aby mohl zapisovat své dočasné soubory (cache), musíme mu dát vlastnictví jeho konfiguračního adresáře.
sudo chown -R 991:991 /opt/dns-server/dnscrypt-proxy
3. Vytvoření konfiguračního souboru pro dnscrypt-proxy
Tento soubor definuje, jaké šifrované DNS servery bude náš systém používat.
sudo nano /opt/dns-server/dnscrypt-proxy/dnscrypt-proxy.toml
Do tohoto souboru vlož následující obsah. Obsahuje výběr několika špičkových, na soukromí orientovaných poskytovatelů. dnscrypt-proxy si automaticky vybere ten nejrychlejší dostupný.
# Seznam serverů, které se mají použít pro DoH.
# Jsou seřazeny podle preferencí, ale dnscrypt-proxy si dynamicky
# vybere ten s nejlepší odezvou.
server_names = ['cloudflare', 'quad9-doh', 'adguard-dns']
# Naslouchat na všech síťových rozhraních uvnitř kontejneru na portu 53.
# Pi-hole bude posílat dotazy právě sem.
listen_addresses = ['0.0.0.0:53']
# Zajistí, že se služba spustí, i když některé servery ze seznamu nejsou dostupné.
require_dnssec = true
require_nolog = true
require_nofilter = true
# Definice zdrojů, odkud se stahuje seznam a parametry všech dostupných serverů.
# Toto je klíčové, aby dnscrypt-proxy věděl, co jména jako 'cloudflare' znamenají.
[sources]
[sources.'public-resolvers']
urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md']
cache_file = '/config/public-resolvers.md'
minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'
# Vypneme blokování IPv6, protože toto chceme řešit až na úrovni Pi-hole.
block_ipv6 = false
Ulož soubor a zavři editor (Ctrl+X, poté Y a Enter).
4. Vytvoření konfiguračního souboru pro DNSSEC v Pi-hole
Tento soubor zapne v Pi-hole pokročilé funkce, zejména DNSSEC.
sudo nano /opt/dns-server/pihole/etc-dnsmasq.d/99-dnssec.conf
Vlož do něj následující obsah:
# Zapnutí validace DNSSEC. Zvyšuje bezpečnost ověřováním pravosti DNS odpovědí.
dnssec
# Důvěryhodná kotva pro DNSSEC.
trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D
# Zvětšení cache pro rychlejší odpovědi na opakované dotazy.
cache-size=10000
Ulož a zavři soubor.
Část 2: Nasazení Stacku v Portaineru
Nyní, když máme vše připraveno, nasadíme samotné služby.
YAML kód pro Portainer Stack
Následující kód je "srdcem" celého našeho setupu. Obsahuje definici obou služeb (pihole i dnscrypt-proxy) a jejich propojení.
# Verze se v moderních definicích již nepoužívá, ale v Portaineru je stále dobré ji uvést.
version: "3.8"
services:
# Služba pro šifrování DNS dotazů (DoH)
dnscrypt-proxy:
image: klutchell/dnscrypt-proxy:latest
container_name: dnscrypt-proxy
restart: unless-stopped
volumes:
# Mapuje náš připravený konfigurační adresář do kontejneru.
- /opt/dns-server/dnscrypt-proxy:/config
networks:
- dns_network
# Služba pro blokování reklam a lokální DNS
pihole:
image: pihole/pihole:latest
container_name: pihole
restart: unless-stopped
ports:
# Mapuje porty pouze na IP adresu našeho Pi, ne na celý systém.
- "192.168.54.7:53:53/tcp"
- "192.168.54.7:53:53/udp"
- "192.168.54.7:80:80/tcp"
environment:
TZ: "Europe/Prague"
WEBPASSWORD: "ZdeZadejSveNoveSuperSilneHeslo"
# KLÍČOVÉ NASTAVENÍ: Říká Pi-hole, kam má posílat dotazy.
# Používáme jméno služby 'dnscrypt-proxy' a její interní port 53.
DNS1: "dnscrypt-proxy#53"
DNS2: "" # Druhý server nepotřebujeme, spoléháme na flexibilitu dnscrypt-proxy.
volumes:
# Mapuje konfigurační adresáře Pi-hole, aby se data zachovala po restartu.
- /opt/dns-server/pihole/etc-pihole:/etc/pihole
- /opt/dns-server/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
cap_add:
# Dává kontejneru potřebná síťová oprávnění.
- NET_ADMIN
depends_on:
# Zajistí, že se Pi-hole spustí až poté, co je připraven dnscrypt-proxy.
- dnscrypt-proxy
networks:
- dns_network
# Definice naší privátní sítě, ve které spolu kontejnery komunikují.
networks:
dns_network:
driver: bridge
Kroky pro nasazení v Portaineru
-
Otevři si webové rozhraní Portaineru.
-
V menu vlevo klikni na Stacks.
-
Vpravo nahoře klikni na + Add stack.
-
Zadej Název stacku, například dns-server.
-
Ujisti se, že je vybrána volba Web editor.
-
Zkopíruj celý YAML kód uvedený výše a vlož ho do textového pole.
-
NEZAPOMEŇ změnit ZdeZadejSveNoveSuperSilneHeslo na své vlastní, bezpečné heslo.
-
Sjeď úplně dolů a klikni na tlačítko Deploy the stack.
Počkej chvilku, než Portainer stáhne obrazy a spustí kontejnery. Oba by se měly rozsvítit zeleně.
Část 3: Finální konfigurace a ověření
Nyní musíme udělat poslední dva kliky v rozhraní Pi-hole, aby vše správně fungovalo.
1. Nastavení DNS a rozhraní v Pi-hole
-
Otevři administraci Pi-hole: http://192.168.54.7/admin
-
Přihlas se svým novým heslem.
-
V menu vlevo jdi do Settings -> záložka DNS.
-
Upstream DNS Servers: V levém sloupci ODŠKRTNI VŠECHNY předdefinované servery (Google, Cloudflare atd.). V pravém sloupci musí být zaškrtnuté pouze Custom 1 (IPv4) s hodnotou dnscrypt-proxy#53.
-
Interface settings: Úplně dole na stránce najdi tuto sekci a vyber možnost Permit all origins. Toto je klíčové, aby Pi-hole odpovídal na dotazy z celé tvé sítě.
-
Klikni na Save.
2. Ověření funkčnosti (Test pravdy)
Nejlepší způsob je odposlouchávat provoz, jak jsme to dělali při ladění.
Na svém Pi v terminálu spusť:
sudo tcpdump -i eth0 -n port 53
(Pokud používáš Wi-Fi, nahraď eth0 za wlan0.)
Z jiného počítače ve tvé síti spusť v příkazovém řádku:
nslookup www.idnes.cz 192.168.54.7
V okně s tcpdump uvidíš pouze komunikaci mezi tvým počítačem a Pi-hole (192.168.54.7). Neuvidíš žádný odchozí provoz z Pi-hole na veřejné servery (1.1.1.1, 8.8.8.8 atd.) na portu 53. To je definitivní důkaz, že šifrování funguje!
🎉 Hotovo! Co dál?
GRATULUJI! Postavil jsi si robustní, bezpečný a soukromí chránící DNS systém.
-
Nastav router: V administraci svého routeru najdi nastavení DHCP a jako jediný DNS server zadej 192.168.54.7.
-
Restartuj zařízení: Restartuj svá zařízení (nebo jen obnov DHCP), aby si načetla nové nastavení DNS.
-
Užívej si internet: Sleduj v Pi-hole Query Logu, jak se blokují dotazy, a užívej si web bez reklam a sledování.
Za notné pomoci AI - aistudio od google.com