Questo tutorial ti mostrerà come impostare il tuo DNS su TLS (DoT) su Ubuntu con Nginx, così le tue query DNS possono essere crittografate e protette da occhi indiscreti.
Cos'è il DNS su TLS e perché è importante
Il DNS (Domain Name System) è responsabile della traduzione dei nomi di dominio in indirizzi IP. È stato progettato nel 1987 senza alcuna sicurezza o privacy in mente. Per impostazione predefinita, le query DNS non sono crittografate. Vengono inviati in chiaro sul filo e possono essere sfruttati da entità intermedie. Ad esempio, il Great Firewall cinese (GFW ) utilizza una tecnica chiamata DNS cache poison censurare Internet cinese. (Usano anche altri metodi, che esulano dallo scopo di questo articolo.)
GFW controlla ogni query DNS inviata a un server DNS al di fuori della Cina. Poiché il protocollo DNS in testo normale si basa su UDP, che è un protocollo senza connessione, GFW può falsificare sia l'IP del client che l'IP del server. Quando GFW trova un nome di dominio nella sua lista di blocco, cambia la risposta DNS. Ad esempio, se un utente Internet cinese desidera visitare google.com, GFW restituisce un indirizzo IP situato in Cina anziché l'indirizzo IP reale di Google al risolutore DNS dell'utente. Quindi il resolver DNS restituisce l'indirizzo IP falso al computer dell'utente, quindi l'utente non può visitare google.com.
DNS su TLS significa che le query DNS vengono inviate tramite una connessione protetta crittografata con TLS, la stessa tecnologia che crittografa il traffico HTTP.
Perché eseguire il proprio risolutore DoT?
Esistono già alcuni resolver DNS pubblici come 1.1.1.1 e 9.9.9.9 che supportano DNS su TLS, quindi puoi usarli se non hai le competenze o il tempo per eseguirne uno. Tuttavia, alcune persone sostengono che ciò consente ancora ai grandi fornitori di servizi DNS di raccogliere informazioni sugli utenti. Sembrano avere più fiducia nel loro ISP. Ma penso che se sei paranoico sulla privacy, dovresti eseguire il tuo risolutore DoT, quindi né i grandi fornitori di servizi DNS né il tuo ISP possono spiarti.
Attualmente, non tutti i resolver DNS (BIND, Unbound, Knot resolver, PowerDNS recursor, ecc.) supportano DNS su TLS. Invece di creare una guida per un risolutore specifico, ti mostrerò come configurare il proxy Nginx TLS per il tuo risolutore DNS esistente per fornire il servizio DoT, quindi indipendentemente dal risolutore DNS che stai utilizzando, puoi seguire questo tutorial.
Prerequisiti
Si presume che tu abbia un risolutore DNS in esecuzione sul tuo server Ubuntu. Puoi usare qualsiasi risolutore DNS (BIND, Unbound, Knot resolver...) Io personalmente uso BIND.
- Configura il tuo risolutore DNS BIND9 su Ubuntu 16.04/18.04
- Configura il tuo risolutore DNS BIND9 su Ubuntu 20.04
Hai anche bisogno di un nome di dominio, perché i client DNS dovranno stabilire una connessione TLS sicura con il nostro risolutore DNS. Ho registrato il mio nome di dominio da NameCheap perché il prezzo è basso e offrono protezione della privacy di Whois gratuita per tutta la vita.
Una volta soddisfatti i requisiti di cui sopra, segui le istruzioni di seguito.
Passaggio 1:installa Nginx su Ubuntu Server
È molto facile da fare. Basta eseguire il comando seguente.
sudo apt install nginx
Passaggio 2:ottieni un certificato TLS affidabile da Let's Encrypt
DNS su TLS richiede l'installazione di un certificato TLS sul lato server. Otterremo e installeremo il certificato Let's Encrypt. Il vantaggio dell'utilizzo del certificato Let's Encrypt è che è gratuito, più facile da configurare e considerato affidabile dal software client.
Esegui i seguenti comandi per installare il client Let's Encrypt (certbot) dal repository Ubuntu predefinito.
sudo apt install certbot
Per ottenere un certificato Let's Encrypt TLS, possiamo creare un host virtuale Nginx con il seguente comando. Sostituisci dot.example.com
con il tuo nome di dominio. Non dimenticare di creare un record DNS A per questo sottodominio.
sudo nano /etc/nginx/conf.d/dot.example.com.conf
Copia il testo seguente e incollalo nel file dell'host virtuale.
server { listen 80; server_name dot.example.com; root /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
Salva e chiudi il file. Ricarica Nginx per rendere effettive le modifiche.
sudo systemctl reload nginx
Una volta creato e abilitato l'host virtuale, esegui il comando seguente per ottenere il certificato Let's Encrypt utilizzando il plug-in webroot.
sudo certbot certonly --webroot --agree-tos --email [email protected] -d dot.example.com -w /usr/share/nginx/html/
Passaggio 3:crea DNS su proxy TLS in Nginx
Modifica il file di configurazione principale di Nginx.
sudo nano /etc/nginx/nginx.conf
Aggiungi le seguenti righe in fondo a questo file. Nota che devono essere posizionati al di fuori di http
contesto.
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; } }
Nella configurazione precedente, facciamo in modo che Nginx termini la connessione TLS sulla porta 853, quindi reindirizzerà le richieste DNS al resolver DNS locale in ascolto su 127.0.0.1:53
.
Salva e chiudi il file. Quindi prova la configurazione di Nginx e riavvia.
sudo nginx -t sudo systemctl restart nginx
Se c'è un firewall in esecuzione sul server Ubuntu, devi aprire la porta TCP 853. Ad esempio, se usi il firewall UFW, esegui il comando seguente.
sudo ufw allow 853/tcp
Poiché utilizziamo DNS su TLS, non è necessario preoccuparsi dell'attacco di amplificazione DNS.
Passaggio 5:Configura il client Stubby DoT su Ubuntu Desktop
Stubby è un risolutore stub DNS open source sviluppato dal team getdns. Un risolutore stub è un piccolo client DNS sul computer dell'utente finale che riceve richieste DNS da applicazioni come Firefox e inoltra le richieste a un risolutore ricorsivo come 1.1.1.1 o 8.8.8.8. Stubby è speciale in quanto supporta DNS su TLS. Per impostazione predefinita, invierà solo richieste DNS crittografate.
Installa Stubby sul desktop di Ubuntu dal repository predefinito.
sudo apt install stubby
Una volta installato, stubby viene eseguito in background. controlla il suo stato con:
systemctl status stubby
Stubby è in ascolto sulla porta TCP e UDP 53 di localhost (127.0.0.1). Per impostazione predefinita, Stubby utilizza DNS di terze parti su risolutori TLS. Dobbiamo configurarlo per utilizzare il nostro.
sudo nano /etc/stubby/stubby.yml
Scorri verso il basso fino a upstream_recursive_servers:
sezione e aggiungi il testo seguente sopra altri server DNS. Sostituisci 12.34.56.78 con l'indirizzo IP del tuo risolutore DoT.
# My Own DNS over TLS resolver - address_data: 12.34.56.78 tls_auth_name: "dot.example.com"
Quindi trova la seguente riga:
round_robin_upstreams: 1
Modifica 1
a 0
. Questo farà sì che Stubby utilizzi sempre il tuo DNS su TLS. Se non è disponibile, stubby utilizzerà altri server DNS. Salva il file e riavvia stubby per rendere effettive le modifiche.
sudo systemctl restart stubby
Passaggio 6:Configura Ubuntu Desktop per utilizzare Stubby
Sebbene Stubby sia in esecuzione, non viene utilizzato dal sistema operativo. Fare clic sull'icona Network Manager nell'angolo in alto a destra del desktop. Quindi seleziona le impostazioni cablate. (Se utilizzi il Wi-Fi, seleziona Impostazioni Wi-Fi.)
Fai clic sul pulsante a forma di ingranaggio.
Seleziona IPv4
scheda, quindi nelle impostazioni DNS, cambia Automatic
su OFF, che impedirà al tuo sistema Ubuntu di ottenere l'indirizzo del server DNS dal tuo router. Inserisci 127.0.0.1
nel campo DNS. Fai clic su Apply
pulsante per salvare le modifiche.
Quindi riavvia NetworkManager per rendere effettive le modifiche.
sudo systemctl restart NetworkManager
Una volta riconnesso, puoi vedere che il tuo sistema Ubuntu ora sta usando 127.0.0.1 come server DNS in Details
scheda.
Come verificare se il tuo traffico DNS è crittografato
Possiamo usare WireShark per monitorare il traffico DNS. Installa WireShark sul desktop Ubuntu.
sudo apt install wireshark
Se ti viene chiesto "I non superutenti dovrebbero essere in grado di acquisire pacchetti?", rispondi Sì. Una volta installato, esegui il comando seguente per aggiungere il tuo account utente al gruppo wireshark in modo da poter acquisire i pacchetti.
sudo adduser your-username wireshark
Esci e riconnettiti per rendere effettive le modifiche. Quindi apri WireShark dal menu dell'applicazione, seleziona la tua interfaccia di rete in WireShark. Ad esempio, il nome della mia interfaccia Ethernet è enp5s0. Quindi inserisci port 853
come filtro di acquisizione. Ciò consentirà a WireShark di acquisire solo il traffico sulla porta 853, che è la porta utilizzata da DNS su TLS.
Fare clic sul pulsante nell'angolo in alto a sinistra per avviare l'acquisizione. Dopodiché, nella finestra del terminale, esegui il seguente comando per interrogare il nome di dominio usando il dig
utilità. Ad esempio, posso interrogare il record A del mio nome di dominio.
dig A linuxbabe.com
Ora puoi vedere il traffico DNS catturato in WireShark. Le connessioni sono state effettuate su TCP e crittografate con TLS, che è quello che vogliamo. Dovresti controllare se la colonna Destinazione include l'indirizzo IP del tuo risolutore DoT.
Se le query DNS vengono inviate senza crittografia, il computer contatterà il server DNS sulla porta 53. Puoi acquisire nuovamente i pacchetti con port 53
come filtro di acquisizione, ma non vedrai alcun pacchetto in WireShark, il che significa che stubby sta crittografando le tue query DNS.