DNS e cifratura

di Tino Privati

Ecco perché cifrare i DNS

Quando navighi, ogni dominio che digiti viene risolto tramite DNS. Se usi DNS “in chiaro”, queste richieste possono essere intercettate dal provider, da reti Wi-Fi pubbliche o da intermediari di rete. La cifratura DNS riduce tracciamento, filtraggio e manipolazione delle richieste (DNS spoofing / hijacking).

Le tecnologie oggi rilevanti sono due:

  • DoT (DNS over TLS) — cifrato su porta 853

  • DoH (DNS over HTTPS) — incapsulato in HTTPS su porta 443

Su Linux puoi implementarle in modo pulito con systemd-resolved, Unbound, dnscrypt-proxy o stubby. Questa guida copre le soluzioni solide e mantenute.

 

Verifica prima la situazione attuale

  1. Controlla se il sistema usa systemd-resolved:

  • systemctl is-active systemd-resolved
  • Vedi quali DNS stai usando:

  1. resolvectl status
  2. Verifica se le richieste passano in chiaro:

    • visita https://dnscheck.tools/ oppure https://browserleaks.com/dns

    • se vedi resolver del tuo ISP → DNS non cifrati

    • se vedi “DoH/DoT” o resolver della VPN → probabilmente già cifrati

Se la VPN ha opzione “block outside DNS / encrypted DNS”, abilitala e fermati qui.

 

Opzione 1 — systemd-resolved con DNS-over-TLS (soluzione semplice e integrata)

Funziona su Ubuntu, Debian recenti, Fedora, Arch e derivate.

1) Abilita la modalità stub locale

 
sudo systemctl enable --now systemd-resolved sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

2) Imposta resolver DoT affidabili

Apri il file di configurazione:

 
 
sudo nano /etc/systemd/resolved.conf

Dentro la sezione [Resolve] imposta ad esempio:

 
 
[Resolve] DNS=9.9.9.9#dns.quad9.net 149.112.112.112#dns.quad9.net FallbackDNS=1.1.1.1#cloudflare-dns.com 1.0.0.1#cloudflare-dns.com DNSOverTLS=yes DNSSEC=yes

Salva e riavvia:

 
sudo systemctl restart systemd-resolved

3) Verifica

 
resolvectl status

Dovresti vedere DNS Over TLS: yes.

Test online con i siti citati sopra. Se i DNS restano in chiaro, un browser o la VPN potrebbe sovrascrivere i resolver.


Opzione 2 — Unbound come resolver locale + DoT (più controllo, privacy avanzata)

Unbound risolve i domini direttamente dai root-servers (no forwarders), con validazione DNSSEC. Aggiungendo DoT verso forwarder selezionati ottieni un setup molto robusto.

1) Installa Unbound

Debian/Ubuntu:

sudo apt install unbound

Arch:

sudo pacman -S unbound

2) Configurazione base sicura

 
sudo nano /etc/unbound/unbound.conf.d/dot.conf

Inserisci:

 
 
server: verbosity: 1 interface: 127.0.0.1 port: 53 do-ip4: yes do-ip6: no do-udp: yes do-tcp: yes prefetch: yes qname-minimisation: yes harden-glue: yes harden-dnssec-stripped: yes use-caps-for-id: yes cache-min-ttl: 3600 cache-max-ttl: 86400 forward-zone: name: "." forward-tls-upstream: yes forward-addr: 9.9.9.9@853#dns.quad9.net forward-addr: 149.112.112.112@853#dns.quad9.net

Riavvia:

sudo systemctl enable --now unbound

3) Punta il sistema al resolver locale

Modifica /etc/resolv.conf (o usa NetworkManager) per usare:

 
nameserver 127.0.0.1

4) Test

 
dig @127.0.0.1 example.com

Poi verifica online se il traffico risulta cifrato (DoT).


Opzione 3 — dnscrypt-proxy (DoH + DoT + filtri opzionali)

Flexibile, supporta molteplici upstream e blacklist. Ideale se vuoi DoH.

1) Installazione

Debian/Ubuntu:

 
sudo apt install dnscrypt-proxy

2) Configurazione essenziale

File:

 
sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml

Impostazioni utili:

 
listen_addresses = ['127.0.0.1:53'] require_dnssec = true require_nofilter = true require_nolog = true # Se vuoi DoH specifico: server_names = ['cloudflare', 'quad9-doh']

Riavvia:

 
sudo systemctl enable --now dnscrypt-proxy

Imposta 127.0.0.1 come DNS del sistema e verifica.


Integrazione con NetworkManager

Se il desktop sovrascrive i DNS:

 
nmcli connection show nmcli connection modify "<nome-connessione>" ipv4.ignore-auto-dns yes nmcli connection modify "<nome-connessione>" ipv4.dns "127.0.0.1" nmcli connection up "<nome-connessione>"

Ripeti per IPv6 se necessario oppure disabilitalo se non lo usi.


Evitare perdite DNS (DNS leaks)

Controlla questi punti:

  • La VPN non forza propri DNS in parallelo.

  • Il browser non usa un DoH interno diverso (Firefox/Chrome possono farlo).

  • Nessun servizio locale bypassa il resolver (alcuni sandbox o container).

  • /etc/resolv.conf non viene rigenerato dal DHCP ad ogni connessione — se succede, configura ignore-auto-dns come sopra.

Per testare a riga di comando:

 
 
dig txt o-o.myaddr.l.google.com @resolver.dns

Oppure strumenti online di leak-test.


Scelta dei resolver: aspetti di privacy

Resolver raccomandati e noti per policy trasparenti:

  • Quad9 — sicurezza + privacy, no logging identificabile, basato in CH

  • Cloudflare 1.1.1.1 — privacy-first, audit esterni

  • Mullvad DNS — ideale se già usi Mullvad

  • NextDNS — configurabile (account opzionale)

Evita resolver opachi o senza policy pubblica.


Hardening opzionale

  • Blocca il traffico DNS in chiaro verso porta 53 (tranne localhost):

     
  • sudo iptables -A OUTPUT ! -d 127.0.0.1 -p udp --dport 53 -j REJECT sudo iptables -A OUTPUT ! -d 127.0.0.1 -p tcp --dport 53 -j REJECT
  • Abilita DNSSEC dove possibile.

  • Abilita qname-minimisation (già presente in Unbound).


Quando NON usare DNS cifrati separati

  • La tua VPN gestisce già DNS cifrati e blocca quelli esterni.

  • Usi una VPN aziendale con policy di sicurezza interne.

  • In contesti dove la risoluzione locale rompe servizi interni.

In questi casi lascia che sia la VPN a gestire tutto il percorso DNS.


Troubleshooting rapido

  • Risoluzione lenta → riduci cache-min-ttl, verifica latenza dei resolver.

  • Alcuni domini non risolvono → disabilita temporaneamente DNSSEC e riprova; se dipende dal dominio, è un errore di configurazione lato autoritativo.

  • Il browser ignora i DNS → disattiva DoH interno del browser o allinealo allo stesso resolver.

  • VPN + DoT in conflitto → rimuovi i resolver locali quando la VPN è attiva, oppure configura la VPN perché non sovrascriva /etc/resolv.conf.


Conclusione

Cifrare i DNS su Linux è una misura concreta di privacy di rete, ma ha senso solo quando la tua VPN non cifra o non gestisce lei stessa il traffico DNS. La soluzione più semplice è systemd-resolved con DoT; per maggiore controllo usa Unbound o dnscrypt-proxy. Dopo la configurazione, verifica sempre con test di leak che tutte le richieste DNS passino dal resolver cifrato scelto.