Skip to main content

1 - DNS servery s DoH na Raspberry Pi: Kompletní průvodce bez unbound

Úvod do problematiky DNS a bezpečnosti

DNS (Domain Name System) je základní součást internetu, která překládá doménová jména (např. zelina.eu) na IP adresy (např. 192.168.54.2). Tradiční DNS komunikace však probíhá nešifrovaně, což představuje několik bezpečnostních rizik:

  1. Sniffing (odposlech) - Kdokoli s přístupem k síťovému provozu může vidět, jaké domény navštěvujete
  2. DNS Spoofing/hijacking - Útočník může přesměrovat DNS dotazy na podvržené servery
  3. Man-in-the-middle útoky - Zachycení a manipulace s DNS dotazy mezi klientem a serverem

Proto vznikly technologie jako DNS over HTTPS (DoH), které šifrují DNS komunikaci pomocí HTTPS protokolu. DoH nabízí:

  • Šifrování DNS provozu
  • Ochranu před odposlechem
  • Zvýšenou soukromost uživatelů
  • Odolnost proti DNS manipulacím

Poskytovatelé rekurzivních DoH serverů

Nejen Cloudflare nabízí DoH služby. Mezi významné poskytovatele patří:

  1. Cloudflare: https://cloudflare-dns.com/dns-query (1.1.1.1)
  2. Google: https://dns.google/dns-query (8.8.8.8, 8.8.4.4)
  3. Quad9: https://dns.quad9.net/dns-query (9.9.9.9) - zaměřený na bezpečnost
  4. AdGuard: https://dns.adguard.com/dns-query - s funkcí blokování reklam
  5. OpenDNS: https://doh.opendns.com/dns-query (208.67.222.222)
  6. NextDNS: https://dns.nextdns.io - nabízí mnoho konfiguračních možností

Implementace dvou nezávislých DNS serverů s DoH na Raspberry Pi 5

Vytvoříme řešení založené na dnscrypt-proxy v Dockeru, které nám umožní používat DoH s možností zálohy mezi poskytovateli.

Příprava pro první server (DNS1)

Připojte se k prvnímu Raspberry Pi a vytvořte adresářovou strukturu:

# Vytvořte adresáře pro DNS server
sudo mkdir -p /opt/docker/dns1/config
cd /opt/docker/dns1

Vytvořte soubor docker-compose.yml:

sudo nano docker-compose.yml

Vložte následující obsah:

version: '3'
services:
  dnscrypt-proxy:
    image: klutchell/dnscrypt-proxy:latest
    container_name: dns1_dnscrypt
    restart: always
    network_mode: host
    volumes:
      - ./config:/config
    environment:
      - TZ=Europe/Prague
    cap_add:
      - NET_ADMIN

Nyní vytvořte konfigurační soubor:

sudo nano config/dnscrypt-proxy.toml

Vložte tuto konfiguraci:

# Naslouchejte na lokální adrese a definovaném portu
listen_addresses = ['0.0.0.0:53']

# Použijte IPv4 i IPv6
ipv4_servers = true
ipv6_servers = false

# Povolte logování
log_level = 2
log_file = '/config/dnscrypt-proxy.log'

# Timeout a maximální počet pokusů
timeout = 5000
keepalive = 30

# Seznam serverů k použití, v preferovaném pořadí
server_names = ['cloudflare', 'google', 'quad9-recommended', 'adguard-dns']

# Pokud jeden server selže, zkusí automaticky další
fallback_resolvers = ['1.1.1.1:53', '8.8.8.8:53', '9.9.9.9:53']

# Cache konfigurace
cache = true
cache_size = 4096
cache_min_ttl = 2400
cache_max_ttl = 86400
cache_neg_min_ttl = 60
cache_neg_max_ttl = 600

# Anonymizované DNS (pro zvýšení soukromí)
routes = [
    { server_name='cloudflare', via=['anon-cs-usca', 'anon-cs-nl'] },
    { server_name='google', via=['anon-cs-de', 'anon-cs-fr'] }
]

# Blokování malwaru (volitelné)
block_malware = true
block_ads = false
block_undelegated = true

# Bezpečnostní nastavení
require_dnssec = true
require_nolog = true
require_nofilter = true

# Ukládání certifikátů a klíčů
cert_refresh_delay = 240
dnscrypt_ephemeral_keys = true
tls_disable_session_tickets = true

# Ověřování odezvy
reject_ttl_below = 10

Příprava pro druhý server (DNS2)

Připojte se k druhému Raspberry Pi a opakujte podobný postup:

sudo nano docker-compose.yml

Vložte podobný obsah jako u prvního serveru, jen změňte název kontejneru:

version: '3'
services:
  dnscrypt-proxy:
    image: klutchell/dnscrypt-proxy:latest
    container_name: dns2_dnscrypt
    restart: always
    network_mode: host
    volumes:
      - ./config:/config
    environment:
      - TZ=Europe/Prague
    cap_add:
      - NET_ADMIN

Vytvořte konfigurační soubor pro druhý server:

sudo nano config/dnscrypt-proxy.toml

Vložte podobnou konfiguraci, ale změňte pořadí serverů pro lepší redundanci:

# Naslouchejte na lokální adrese a definovaném portu
listen_addresses = ['0.0.0.0:53']

# Použijte IPv4 i IPv6
ipv4_servers = true
ipv6_servers = false

# Povolte logování
log_level = 2
log_file = '/config/dnscrypt-proxy.log'

# Timeout a maximální počet pokusů
timeout = 5000
keepalive = 30

# Seznam serverů k použití, v preferovaném pořadí
# Záměrně změněné pořadí oproti DNS1 pro lepší redundanci
server_names = ['quad9-recommended', 'adguard-dns', 'cloudflare', 'google']

# Pokud jeden server selže, zkusí automaticky další
fallback_resolvers = ['9.9.9.9:53', '1.1.1.1:53', '8.8.8.8:53']

# Cache konfigurace
cache = true
cache_size = 4096
cache_min_ttl = 2400
cache_max_ttl = 86400
cache_neg_min_ttl = 60
cache_neg_max_ttl = 600

# Anonymizované DNS (pro zvýšení soukromí)
routes = [
    { server_name='quad9-recommended', via=['anon-cs-de', 'anon-cs-fr'] },
    { server_name='cloudflare', via=['anon-cs-nl', 'anon-cs-usca'] }
]

# Blokování malwaru (volitelné)
block_malware = true
block_ads = false
block_undelegated = true

# Bezpečnostní nastavení
require_dnssec = true
require_nolog = true
require_nofilter = true

# Ukládání certifikátů a klíčů
cert_refresh_delay = 240
dnscrypt_ephemeral_keys = true
tls_disable_session_tickets = true

# Ověřování odezvy
reject_ttl_below = 10

Spuštění DNS serverů

Na obou Raspberry Pi spusťte kontejnery:

# Na prvním RPi
cd /opt/docker/dns1
sudo docker-compose up -d

# Na druhém RPi
cd /opt/docker/dns2
sudo docker-compose up -d

Automatické aktualizace

Vytvořte skripty pro automatickou aktualizaci každých 14 dní. Na každém Raspberry Pi vytvořte skript:

# Na prvním RPi
sudo nano /opt/update_dns1.sh

Vložte následující obsah:

#!/bin/bash
# Log file
LOG_FILE="/opt/dns_update.log"

echo "$(date) - Začátek aktualizace DNS1" >> $LOG_FILE

# Aktualizace systému
echo "Aktualizace systému..." >> $LOG_FILE
sudo apt update && sudo apt upgrade -y >> $LOG_FILE 2>&1

# Přejděte do adresáře DNS serveru
cd /opt/docker/dns1

# Aktualizace Docker image
echo "Aktualizace Docker image..." >> $LOG_FILE
sudo docker-compose pull >> $LOG_FILE 2>&1

# Restart kontejneru
echo "Restart služby..." >> $LOG_FILE
sudo docker-compose down >> $LOG_FILE 2>&1
sudo docker-compose up -d >> $LOG_FILE 2>&1

echo "$(date) - Aktualizace DNS1 dokončena" >> $LOG_FILE

Nastavte spouštěcí práva:

sudo chmod +x /opt/update_dns1.sh

Podobně na druhém Raspberry Pi:

sudo nano /opt/update_dns2.sh

S podobným obsahem (upravte cesty pro DNS2):

#!/bin/bash
# Log file
LOG_FILE="/opt/dns_update.log"

echo "$(date) - Začátek aktualizace DNS2" >> $LOG_FILE

# Aktualizace systému
echo "Aktualizace systému..." >> $LOG_FILE
sudo apt update && sudo apt upgrade -y >> $LOG_FILE 2>&1

# Přejděte do adresáře DNS serveru
cd /opt/docker/dns2

# Aktualizace Docker image
echo "Aktualizace Docker image..." >> $LOG_FILE
sudo docker-compose pull >> $LOG_FILE 2>&1

# Restart kontejneru
echo "Restart služby..." >> $LOG_FILE
sudo docker-compose down >> $LOG_FILE 2>&1
sudo docker-compose up -d >> $LOG_FILE 2>&1

echo "$(date) - Aktualizace DNS2 dokončena" >> $LOG_FILE

Nastavte spouštěcí práva:

sudo chmod +x /opt/update_dns2.sh

Nakonec přidejte cronjob pro automatické spouštění:

# Na prvním RPi
sudo crontab -e

Přidejte řádek (spouští se každých 14 dní ve 2:00 ráno):

0 2 1,15 * * /opt/update_dns1.sh

Na druhém RPi (spouští se každých 14 dní ve 3:00 ráno - o den později než první server):

0 3 2,16 * * /opt/update_dns2.sh

Ověření funkčnosti

Pro ověření, že DNS servery fungují správně, můžete použít:

# Test pomocí dig
dig @192.168.54.2 example.com
dig @192.168.54.3 example.com

# Kontrola logů
sudo docker logs dns1_dnscrypt
sudo docker logs dns2_dnscrypt

Další zabezpečení DNS serverů

Kromě použití DoH doporučuji tyto další bezpečnostní opatření:

  1. DNSSEC - Zajišťuje autenticitu DNS odpovědí (už zahrnuto v konfiguraci)
  2. DNS Query Name Minimization - Zvyšuje soukromí tím, že posílá jen potřebné části doménového jména
  3. IP Tables pravidla - Pokud chcete omezit, kdo může používat vaše DNS servery:
sudo iptables -A INPUT -p udp --dport 53 -s 192.168.54.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 53 -s 192.168.54.0/24 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j DROP
sudo iptables -A INPUT -p tcp --dport 53 -j DROP

Monitoring - Můžete přidat monitoring pomocí Prometheus a Grafana:

# Přidejte do docker-compose.yml
  prometheus-exporter:
    image: prom/node-exporter
    container_name: dns_prometheus
    restart: always
    ports:
      - "9100:9100"

Zálohování mezi DNS servery

Když máte nastavené dva DNS servery, zálohování funguje přirozeně na úrovni klienta. Když klientská zařízení nakonfigurujete tak, aby používala oba servery (192.168.54.2 a 192.168.54.3), budou automaticky využívat druhý server, pokud první nereaguje.

Navíc, každý ze serverů má vlastní záložní mechanismus - pokud primární DoH poskytovatel (např. Cloudflare na prvním serveru) není dostupný, přepne se na další v seznamu (Google, Quad9 atd.).

Závěrem

Tento návod ti umožní vytvořit dva nezávislé, redundantní DNS servery s DoH na Raspberry Pi 5 s použitím adresáře /opt/ pro umístění všech souborů. Díky kombinaci různých poskytovatelů DoH a jejich různému pořadí na každém serveru získáš maximální dostupnost a bezpečnost.

DoH významně zlepšuje soukromí a bezpečnost tím, že šifruje DNS provoz, zatímco dnscrypt-proxy nabízí pokročilé funkce jako redundance, blokování malwaru a DNSSEC. Konfigurace je nastavena tak, aby servery byly pravidelně aktualizovány a mohly bezpečně sloužit tvé interní síti.