Skip to main content

Finální All-in-One Návod: Bezpečný a Vyladěný DNS Server Pi-hole, DoH, DNSSEC a SNI 2025-06-29

Tento návod je finální, odladěná verze pro instalaci na čistý systém (Raspberry Pi 5 s Raspberry Pi OS nebo Ubuntu Server). Obsahuje všechny optimalizace pro rychlost a bezpečnost.

Cílové Funkce:

  • Blokování reklam a trackerů (Pi-hole)

  • Šifrované DNS dotazy do internetu (DoH přes dnscrypt-proxy)

  • Ověřování pravosti odpovědí (DNSSEC)

  • Vysoký výkon díky optimalizované cache


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.2).


Čá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 projekt
sudo mkdir -p /opt/dns-server

# Vytvoření adresářů pro 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 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 preferovaných DoH serverů.
server_names = ['cloudflare', 'quad9-doh', 'adguard-dns']

# Naslouchat na všech rozhraních uvnitř kontejneru na portu 53.
listen_addresses = ['0.0.0.0:53']

# Vyžadovat na serverech podporu klíčových bezpečnostních funkcí.
require_dnssec = true
require_nolog = true
require_nofilter = true

# Definice zdrojů, odkud se stahuje seznam a parametry všech dostupných serverů.
[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'

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

Oprávnění: Nezapomeňte na problém s oprávněními z minula. Ujistěte se, že adresář /opt/dns-server a jeho podadresáře mají správná oprávnění, aby do nich kontejnery mohly zapisovat. Příkaz sudo chown -R $USER:$USER /opt/dns-server je dobrý start, ale někdy je potřeba explicitně nastavit ID uživatele, pod kterým proces v kontejneru běží. Pro jednoduchost často stačí:

sudo chmod -R 777 /opt/dns-server/dnscrypt-proxy 

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-performance-tuning.conf

Vlož do něj následující obsah:

# --- DNSSEC ---
# Zapnutí validace DNSSEC pro ověření pravosti DNS odpovědí.
#Nechte DNSSEC validaci pouze na dnscrypt-proxy a v Pi-hole ji vypněte.
##Odstraňte DNSSEC z konfigurace Pi-hole:
#Upravte soubor /opt/dns-server/pihole/etc-dnsmasq.d/99-performance-tuning.conf a smažte nebo zakomentujte tyto dva řádky:
#dnssec
#trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D

# --- CACHE & PERFORMANCE TUNING ---
# Výrazné zvětšení cache pro bleskové odpovědi.
cache-size=50000

# Nastavení minimální doby platnosti záznamu v cache na 5 minut (300s).
# Zabraňuje zbytečným dotazům ven i u domén s krátkým TTL.
min-cache-ttl=300

# Přednačítání záznamů v cache, které se blíží expiraci.
# Výsledkem je pocitově plynulejší procházení webu.
dns-forward-max=1000

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

version: "3.8"
services:
  # Služba pro šifrování DNS (DoH)
  dnscrypt-proxy:
    image: klutchell/dnscrypt-proxy:latest
    container_name: dnscrypt-proxy
    restart: unless-stopped
    
    # Explicitně říkáme kontejneru, aby použil náš konfigurační soubor
    command: -config /config/dnscrypt-proxy.toml
    
    volumes:
      - /opt/dns-server/dnscrypt-proxy:/config
    networks:
      dns_network:
        ipv4_address: 172.25.0.10

  # Služba pro blokování reklam a lokální DNS cache
  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    restart: unless-stopped
    ports:
      # Nahraď 192.168.54.2 IP adresou tvého serveru!
      - "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"  # HTTPS port pro Pi-hole
    environment:
      TZ: "Europe/Prague"
      WEBPASSWORD: "ZdeZadejSveNoveSuperSilneHeslo" # Změň si heslo!
      DNS1: "172.25.0.10#53"
      DNS2: ""
      DNSMASQ_LISTENING: all
      # NTP servery pro Pi-hole - tvůj server + záložní české
      PIHOLE_NTP_SERVERS: "ntp.zelina.eu,tik.cesnet.cz,tak.cesnet.cz,0.cz.pool.ntp.org,1.cz.pool.ntp.org,0.pool.ntp.org,1.pool.ntp.org"
    volumes:
      - /opt/dns-server/pihole/etc-pihole:/etc/pihole
      - /opt/dns-server/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    cap_add:
      - NET_ADMIN
      - SYS_TIME  # Přidáno pro lepší práci s časem
    depends_on:
      - dnscrypt-proxy
    networks:
      - dns_network

networks:
  dns_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.25.0.0/16

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 bonusy

1. Nastavení v Pi-hole GUI (Nezbytné!)

  1. Otevři http://TVOJE_IP_ADRESA/admin.

  2. Přihlas se.

  3. Jdi do Settings -> DNS.

  4. Upstream DNS Servers: Odškrtni všechny servery v levém sloupci. V pravém sloupci nech zaškrtnuté jen Custom 1 (IPv4) s hodnotou:

172.25.0.10#53

  1. Interface settings: Úplně dole vyber Permit all origins.

  2. Klikni na Save.

2. Bonus: Zvýšení bezpečnosti (Doporučeno)

Přidej do Pi-hole seznamy pro blokování malwaru a phishingu.

  1. Jdi do Adlists.

  2. Přidej následující URL (každou zvlášť):

https://phishing.army/download/phishing_army_blocklist_extended.txt
https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt
https://raw.githubusercontent.com/hagezi/dns-blocklists/main/lists/doh-vpn-proxy-bypass/pro/domains.txt
https://phishing.army/download/phishing_army_blocklist_extended.txt (Anti-phishing)

https://osint.digitalside.it/Threat-Intel/lists/latestdomains.txt (Malware a C&C servery)

https://raw.githubusercontent.com/hagezi/dns-blocklists/main/lists/doh-vpn-proxy-bypass/pro/domains.txt (Blokování služeb, které se snaží obejít tvé DNS)

Jdi do Tools -> Update Gravity a klikni na Update.

Po přidání seznamů nezapomeň jít do Tools -> Update Gravity a kliknout na Update, aby si Pi-hole seznamy stáhl a zpracoval.

3. Nastavení sítě

V administraci svého routeru nastav jako DHCP DNS server IP adresu tvého nového serveru.

4. Ověření funkčnosti (Test pravdy)

Jak jsi sám zjistil, na čerstvém serveru chybí dig a nslookup. Nainstalujeme je.

sudo apt update
sudo apt install dnsutils -y

 Test ze serveru na sebe sama:

dig @192.168.54.2 www.google.com

Tímto testujeme, jestli je služba dostupná na své vnější IP adrese.

Test komunikace mezi kontejnery (pokud krok 'a' selže):
Tímto se dostaneme PŘÍMO do Pi-hole kontejneru a zkusíme se zeptat dnscrypt-proxy na jeho interní IP adrese.

# Spusť příkazový řádek uvnitř běžícího pihole kontejneru
docker exec -it pihole bash

# Teď jsi uvnitř kontejneru. Zkus se zeptat dnscryptu:
nslookup google.com 172.25.0.10

# Pro opuštění kontejneru napiš
exit

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

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