Skip to main content

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

  1. Otevři si webové rozhraní Portaineru.

  2. V menu vlevo klikni na Stacks.

  3. Vpravo nahoře klikni na + Add stack.

  4. Zadej Název stacku, například dns-server.

  5. Ujisti se, že je vybrána volba Web editor.

  6. Zkopíruj celý YAML kód uvedený výše a vlož ho do textového pole.

  7. NEZAPOMEŇ změnit ZdeZadejSveNoveSuperSilneHeslo na své vlastní, bezpečné heslo.

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

  1. Otevři administraci Pi-hole: http://192.168.54.7/admin

  2. Přihlas se svým novým heslem.

  3. V menu vlevo jdi do Settings -> záložka DNS.

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

  5. 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ě.

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