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:
- Sniffing (odposlech) - Kdokoli s přístupem k síťovému provozu může vidět, jaké domény navštěvujete
- DNS Spoofing/hijacking - Útočník může přesměrovat DNS dotazy na podvržené servery
- 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ří:
- Cloudflare:
https://cloudflare-dns.com/dns-query
(1.1.1.1) - Google:
https://dns.google/dns-query
(8.8.8.8, 8.8.4.4) - Quad9:
https://dns.quad9.net/dns-query
(9.9.9.9) - zaměřený na bezpečnost - AdGuard:
https://dns.adguard.com/dns-query
- s funkcí blokování reklam - OpenDNS:
https://doh.opendns.com/dns-query
(208.67.222.222) - 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í:
- DNSSEC - Zajišťuje autenticitu DNS odpovědí (už zahrnuto v konfiguraci)
- DNS Query Name Minimization - Zvyšuje soukromí tím, že posílá jen potřebné části doménového jména
- 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.
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.
No comments to display
No comments to display