Tento tutoriál vám ukáže, jak nastavit vlastní DNS přes TLS (DoT) resolver na Ubuntu s Nginx, takže vaše dotazy DNS mohou být zašifrovány a chráněny před zvědavýma očima.
Co je to DNS přes TLS a proč je to důležité
DNS (Domain Name System) je zodpovědný za překlad doménových jmen na IP adresy. Byl navržen v roce 1987 bez ohledu na bezpečnost nebo soukromí. Ve výchozím nastavení nejsou dotazy DNS šifrovány. Jsou odesílány v prostém textu na drátě a mohou být využívány středními entitami. Například Great Firewall of China (GFW ) používá techniku zvanou Jed mezipaměti DNS cenzurovat čínský internet. (Používají také jiné metody, které jsou nad rámec tohoto článku.)
GFW kontroluje každý dotaz DNS odeslaný na server DNS mimo Čínu. Vzhledem k tomu, že protokol DNS ve formátu prostého textu je založen na UDP, což je protokol bez připojení, GFW může podvrhnout IP klienta i IP server. Když GFW nalezne název domény na svém seznamu blokovaných, změní odpověď DNS. Pokud chce například čínský uživatel internetu navštívit google.com, GFW vrátí IP adresu umístěnou v Číně namísto skutečné IP adresy Google do DNS resolveru uživatele. Potom DNS resolver vrátí falešnou IP adresu do počítače uživatele, takže uživatel nemůže navštívit google.com.
DNS over TLS znamená, že dotazy DNS jsou odesílány přes zabezpečené připojení šifrované pomocí TLS, stejné technologie, která šifruje provoz HTTP.
Proč provozovat svůj vlastní DoT Resolver?
Již existují některé veřejné překladače DNS, jako jsou 1.1.1.1 a 9.9.9.9, které podporují DNS přes TLS, takže je můžete použít, pokud nemáte dovednosti nebo čas na provozování vlastního. Někteří lidé však tvrdí, že to stále umožňuje velkým poskytovatelům služeb DNS shromažďovat informace o uživatelích. Zdá se, že více důvěřují svému ISP. Ale myslím, že pokud jste paranoidní ohledně soukromí, měli byste provozovat svůj vlastní DoT resolver, aby vás nemohli špehovat ani velcí poskytovatelé služeb DNS, ani váš ISP.
V současné době ne všechny DNS resolvery (BIND, Unbound, Knot resolver, PowerDNS recursor atd.) podporují DNS přes TLS. Namísto vytvoření průvodce pro konkrétní překladač vám ukážu, jak nastavit proxy Nginx TLS pro váš stávající překladač DNS, aby poskytoval službu DoT, takže bez ohledu na to, jaký překladač DNS používáte, můžete postupovat podle tohoto návodu.
Předpoklady
Předpokládá se, že na vašem serveru Ubuntu běží DNS resolver. Můžete použít jakýkoli DNS resolver (BIND, Unbound, Knot resolver…), já osobně používám BIND.
- Nastavte si svůj vlastní BIND9 DNS Resolver na Ubuntu 16.04/18.04
- Nastavte si svůj vlastní BIND9 DNS Resolver na Ubuntu 20.04
Potřebujete také název domény, protože klienti DNS budou muset vytvořit zabezpečené spojení TLS s naším DNS resolverem. Zaregistroval jsem si název domény u NameCheap, protože cena je nízká a poskytují ochranu soukromí whois doživotně zdarma.
Jakmile splníte výše uvedené požadavky, postupujte podle pokynů níže.
Krok 1:Nainstalujte Nginx na server Ubuntu
Je to velmi snadné. Jednoduše spusťte následující příkaz.
sudo apt install nginx
Krok 2:Získejte důvěryhodný certifikát TLS od společnosti Let’s Encrypt
DNS over TLS vyžaduje instalaci certifikátu TLS na straně serveru. Získáme a nainstalujeme certifikát Let’s Encrypt. Výhodou použití certifikátu Let’s Encrypt je, že je zdarma, snáze se nastavuje a je důvěryhodný pro klientský software.
Spuštěním následujících příkazů nainstalujte klienta Let’s Encrypt (certbot) z výchozího úložiště Ubuntu.
sudo apt install certbot
Chcete-li získat certifikát Let’s Encrypt TLS, můžeme pomocí následujícího příkazu vytvořit virtuálního hostitele Nginx. Repalce dot.example.com
s vlastním názvem domény. Nezapomeňte pro tuto subdoménu vytvořit záznam DNS A.
sudo nano /etc/nginx/conf.d/dot.example.com.conf
Zkopírujte následující text a vložte jej do souboru virtuálního hostitele.
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
Uložte a zavřete soubor. Znovu načtěte Nginx, aby se změny projevily.
sudo systemctl reload nginx
Jakmile je virtuální hostitel vytvořen a povolen, spusťte následující příkaz a získejte certifikát Let’s Encrypt pomocí pluginu webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
Krok 3:Vytvořte DNS přes TLS Proxy v Nginx
Upravte hlavní konfigurační soubor Nginx.
sudo nano /etc/nginx/nginx.conf
Přidejte následující řádky na konec tohoto souboru. Všimněte si, že musí být umístěny mimo http
kontextu.
stream { # DNS upstream pool upstream dns { zone dns 64k; server 127.0.0.1:53; } # DoT server for decryption server { listen 853 ssl; ssl_certificate /etc/letsencrypt/live/dot.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dot.example.com/privkey.pem; proxy_pass dns; } }
Ve výše uvedené konfiguraci zajistíme, aby Nginx ukončil TLS připojení na portu 853, poté přesměruje požadavky DNS na místní překladač DNS naslouchající na 127.0.0.1:53
.
Uložte a zavřete soubor. Poté otestujte konfiguraci Nginx a restartujte.
sudo nginx -t sudo systemctl restart nginx
Pokud je na serveru Ubuntu spuštěna brána firewall, musíte otevřít port TCP 853. Pokud například používáte bránu firewall UFW, spusťte následující příkaz.
sudo ufw allow 853/tcp
Protože používáme DNS přes TLS, není třeba se obávat útoku na zesílení DNS.
Krok 5:Konfigurace klienta Stubby DoT na ploše Ubuntu
Stubby je open-source DNS stub resolver vyvinutý týmem getdns. Překladač stub je malý klient DNS na počítači koncového uživatele, který přijímá požadavky DNS z aplikací, jako je Firefox, a předává požadavky rekurzivnímu překladači, jako je 1.1.1.1 nebo 8.8.8.8. Stubby je speciální v tom, že podporuje DNS přes TLS. Ve výchozím nastavení bude odesílat požadavky DNS pouze zašifrované.
Nainstalujte Stubby na plochu Ubuntu z výchozího úložiště.
sudo apt install stubby
Po instalaci stubby běží na pozadí. zkontrolujte jeho stav pomocí:
systemctl status stubby
Stubby naslouchá na TCP a UDP portu 53 localhost (127.0.0.1). Ve výchozím nastavení používá Stubby DNS třetích stran přes překladače TLS. Musíme jej nakonfigurovat, aby používal naše vlastní.
sudo nano /etc/stubby/stubby.yml
Přejděte dolů na upstream_recursive_servers:
a přidejte následující text nad ostatní servery DNS. Nahraďte 12.34.56.78 IP adresou vašeho DoT resolveru.
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
Poté najděte následující řádek:
round_robin_upstreams: 1
Změňte 1
na 0
. Díky tomu bude Stubby vždy používat váš vlastní překladač DNS přes TLS. Pokud není k dispozici, stubby použije jiné servery DNS. Uložte soubor a restartujte stubby, aby se změny projevily.
sudo systemctl restart stubby
Krok 6:Konfigurace Ubuntu Desktop pro použití Stubby
Přestože Stubby běží, operační systém jej nepoužívá. Klepněte na ikonu Správce sítě v pravém horním rohu pracovní plochy. Poté vyberte nastavení kabelového připojení. (Pokud používáte Wi-Fi, vyberte Nastavení Wi-Fi.)
Klikněte na tlačítko ozubeného kola.
Vyberte IPv4
a poté v nastavení DNS přepněte na Automatic
na OFF, což zabrání vašemu systému Ubuntu získat adresu serveru DNS z vašeho routeru. Zadejte 127.0.0.1
v poli DNS. Klikněte na Apply
pro uložení změn.
Poté restartujte NetworkManager, aby se změny projevily.
sudo systemctl restart NetworkManager
Jakmile se znovu připojíte, můžete vidět, že váš systém Ubuntu nyní používá jako DNS server 127.0.0.1 v Details
kartu.
Jak zkontrolovat, zda je váš provoz DNS šifrován
Ke sledování DNS provozu můžeme použít WireShark. Nainstalujte WireShark na plochu Ubuntu.
sudo apt install wireshark
Pokud budete dotázáni:„Měli by uživatelé, kteří nejsou superuživateli, moci zachytit pakety?“, odpovězte Ano. Po instalaci spusťte následující příkaz a přidejte svůj uživatelský účet do skupiny wireshark, abyste mohli zachycovat pakety.
sudo adduser your-username wireshark
Odhlaste se a znovu přihlaste, aby se změny projevily. Poté otevřete WireShark z nabídky aplikace a vyberte své síťové rozhraní ve WireShark. Například název mého rozhraní Ethernet je enp5s0. Poté zadejte port 853
jako zachytávací filtr. Díky tomu bude WireShark zachycovat provoz pouze na portu 853, což je port používaný DNS přes TLS.
Kliknutím na tlačítko v levém horním rohu zahájíte snímání. Poté v okně terminálu spusťte následující příkaz pro dotaz na název domény pomocí dig
užitečnost. Mohu se například dotázat na záznam A názvu mé domény.
dig A linuxbabe.com
Nyní můžete vidět zachycený provoz DNS ve WireShark. Spojení byla vytvořena přes TCP a šifrována pomocí TLS, což je to, co chceme. Měli byste zkontrolovat, zda sloupec Destination obsahuje IP adresu vašeho překladače DoT.
Pokud jsou dotazy DNS odesílány bez šifrování, počítač by kontaktoval server DNS na portu 53. Pakety můžete znovu zachytit pomocí port 53
jako filtr pro zachycení, ale ve WireShark neuvidíte žádné pakety, což znamená, že stubby šifruje vaše dotazy DNS.