La mascotte orso polare di NordBastion in piedi in una scura sala di pietra nordica accanto a un rack server, una zampa alzata verso una runa olografica ciano fluttuante che elenca nomi di dominio, con quattro fasci di query che si irradiano attraverso un arco runico verso tre monoliti server distanti e un quinto fascio fermato da uno scudo ambra a cerchio barrato, con l'aurora visibile dalla finestra sullo sfondo
Guida pratica · Rete·15 min di lettura · 40 min pratici

Un resolver DNS tutto suo.
L'unico log a cui nessuno pensa di spostare.

Ogni dominio che i suoi dispositivi cercano è una riga con timestamp nel file di qualcun altro — del suo ISP, o di un resolver pubblico gratuito. Sei passi per spostare quel file su una macchina che possiede lei: Unbound che risolve dalla radice, AdGuard Home che filtra davanti, DNS cifrato su un certificato reale, e una porta 53 che non è mai rivolta verso internet. La macchina costa $3.90 al mese. Testato su Debian 12.

I sei passaggi
  1. 01

    Forma

    Ricorsivo, non forwarding

  2. 02

    Chiudi

    Porta 53, prima che si apra

  3. 03

    Risolvere

    Unbound, che valida

  4. 04

    Filtrare

    AdGuard Home, DoH, DoT

  5. 05

    Raggiungere

    Prima il tunnel, poi i client

  6. 06

    Verifica

    Fughe, DNSSEC, uptime

Prima di iniziare · Cosa sta davvero trapelando

Il DNS è l'indice della sua vita. Per impostazione predefinita, non è lei a custodirlo.

Cifri il disco, incanali il traffico in un tunnel, paghi in Monero, si registri senza un'email — e poi lasci che il portatile chieda a un resolver a cui non ha mai pensato di tradurre ogni hostname che tocca, una query alla volta, in chiaro, tutto il giorno. Il lookup dei nomi è la parte dello stack che le persone proteggono per ultima, ed è la parte che produce il resoconto più pulito di ciò che qualcuno fa davvero.

Vale la pena essere precisi su cosa contenga davvero quel resoconto, perché "il DNS rivela la sua navigazione" è allo stesso tempo vero e pigro. Un log delle query è un elenco di nomi di dominio con timestamp, attribuiti all'indirizzo IP che ha fatto la richiesta. Non sono le pagine che legge, e di solito non è nemmeno l'URL esatto. È qualcosa di più silenzioso e, ai fini della profilazione, migliore: la forma di una vita. La banca. Il datore di lavoro. L'app di incontri che si aggiorna ogni quattro minuti. Il sito medico visitato una sola volta alle 02:00. I tre domini che compaiono sempre insieme solo perché appartengono allo stesso client di messaggistica. A nessuno servono i contenuti quando l'indice è così buono.

Quattro soggetti possono detenere quell'indice, e il self-hosting lo sposta dai primi due al quarto:

Configurazione Chi vede ogni query che fa Visibile sulla linea Insieme di anonimato
Resolver dell'ISP, in chiaro (l'opzione predefinita)Il suo ISP, per nome e accountTutto, a chiunque si trovi sul percorsoI loro abbonati
Resolver pubblico, cifrato (DoH/DoT)Quell'unica azienda, legata al suo IPNient'altro che la destinazioneMilioni
Il suo resolver, che inoltra a monteL'upstream che ha scelto — invariatoNient'altro che la destinazioneUno
Il suo resolver, che ricorre dalla radiceNessuno — ogni zona vede solo i propri nomiNient'altro che la destinazioneUno, su un IP che non è lei

La terza riga è quella che frega la gente. Installare un resolver sul proprio server e poi dirgli di inoltrare tutto a 1.1.1.1 cambia esattamente una cosa: le sue query ora arrivano a Cloudflare da un indirizzo IP diverso. Il log esiste ancora, appartiene ancora a qualcun altro, e lei ha aggiunto una macchina da mantenere in cambio di nulla.

L'ultima colonna è il costo onesto, e questa guida ci torna due volte. Un resolver usato da una sola famiglia è un resolver le cui query sono inequivocabilmente di quella famiglia. Ciò che rende lo scambio conveniente è che l'IP che fa le richieste è un server nordico noleggiato con nessun documento d'identità dietro di sé — non una linea domestica con un nome di abbonato, e non un account presso un hyperscaler con una carta registrata. L'insieme di anonimato si riduce; è il collegamento a una persona che davvero si spezza.

Passo 01 · Forma

Ricorsivo, o solo un relay? Solo uno dei due vale il server.

Ci sono due macchine completamente diverse che si nascondono dietro la frase "il mio server DNS", e quasi ogni tutorial costruisce quella sbagliata. Decida questo prima di installare qualsiasi cosa, perché è la differenza tra uno strumento di privacy e un proxy per la politica sulla privacy di qualcun altro.

Un forwarder prende la sua query e la passa a un altro resolver — tipicamente Cloudflare, Google, Quad9 o il suo ISP — poi mette in cache qualsiasi cosa torni indietro. È semplice, è veloce, e consegna l'intero flusso delle sue query a un'unica terza parte. Ogni guida che finisce con "ora imposti il suo upstream su 1.1.1.1" ne ha costruito uno di questi.

Un resolver ricorsivo fa il lavoro da solo. Per trovare mail.example.com chiede a un server radice chi gestisce .com, chiede ai server di .com chi gestisce example.com, poi chiede ai nameserver stessi di example.com il record. Tre o quattro brevi conversazioni con tre o quattro operatori diversi, nessuno dei quali sa nulla degli altri. Con la QNAME minimisation attivata va oltre: alla radice viene chiesto solo di .com, e ai server di .com solo di example.com. Il nome completo viene rivelato a esattamente una parte — quella che ospita il nome, e che avrebbe comunque ricevuto la sua connessione trenta millisecondi dopo.

Proprietà Unbound, ricorsivo Un forwarder qualsiasi AdGuard Home da solo
Un'unica parte vede ogni queryNoSìSì — il suo upstream
DNSSEC validato localmenteSìFidato dall'upstreamFidato dall'upstream
Blocklist e regole per dispositivoSolo tramite zone localiDipende dal daemonSì, con un'interfaccia web
Listener DoH / DoT per i clientDoT nativamente, DoH tramite un proxyDipende dal daemonEntrambi, integrati
Latenza di avvio a freddo3–4 andate e ritorno1 andata e ritorno1 andata e ritorno
Risposta correttaLa metà dello stack dedicata alla privacySolo come fallback deliberatoLa metà dedicata al filtraggio, davanti

Le due colonne di destra non sono concorrenti — sono le due metà della stessa costruzione. AdGuard Home possiede la porta 53, applica le blocklist e termina i trasporti cifrati; Unbound sta dietro di essa su loopback e fa la risoluzione. Nessuna delle due metà fa bene il lavoro dell'altra, e la catena occupa in totale circa un centinaio di megabyte di RAM.

Se deve portarsi via una sola cosa da questa pagina, sia questa: un resolver che inoltra a un provider DNS pubblico non ha reso il suo DNS privato. Ha solo spostato il log di un salto e aggiunto un server alla sua lista di manutenzione. La ricorsione è tutto il punto.

Passo 02 · Chiudere

Chiuda la porta 53 prima che qualcosa la apra. Questo non è il passo prudente. È quello necessario.

Ordini prima la macchina. Nel pannello: Ordina → VPS → Sentinel, immagine Debian 12, nel bastione più vicino ai dispositivi che lo useranno — Helsinki, Stockholm, Oslo o Reykjavík. Non serve alcun indirizzo email per aprire l'account e la fattura si salda in Monero, Bitcoin, Lightning o qualsiasi altro asset supportato, il che qui conta più del solito: l'intero valore di un resolver personale poggia sul fatto che l'indirizzo IP che fa le richieste non sia riconducibile a un nome.

Poi segua la checklist di hardening della prima ora — solo chiavi SSH, nessun login con password, aggiornamenti automatici — perché tutto ciò che segue presuppone una macchina non già compromessa.

Legga questo prima di avviare il daemon

Un resolver ricorsivo che risponde a tutto internet si chiama resolver aperto, e verrà trovato dagli scanner che perlustrano internet entro poche ore dall'apertura della porta. Il DNS funziona su UDP, gli indirizzi sorgente UDP sono banali da falsificare, e una query di 60 byte può produrre una risposta decine di volte più grande — quindi un resolver aperto è un amplificatore gratuito per un attacco denial-of-service contro terzi. La sequenza che segue è sempre la stessa: il traffico inizia, arrivano le segnalazioni di abuso, e l'IP viene sottoposto a null-route. È il modo più comune in assoluto in cui finisce un primo server DNS. Due regole lo impediscono del tutto: rifiuti per impostazione predefinita nella configurazione del resolver, e non consenta mai 53/udp da 0.0.0.0/0 nel firewall.

Quindi il firewall viene prima di tutto, mentre ancora nessuno è in ascolto. Le regole seguenti presuppongono un tunnel WireGuard su 10.8.0.0/24 — se non ne ha ancora costruito uno, la guida a WireGuard collegata in fondo a questa pagina è una deviazione di un quarto d'ora, ed è il trasporto con cui tutta questa architettura è più a suo agio.

ufw default deny incoming
ufw allow 22/tcp                      # or your moved SSH port
ufw allow 51820/udp                   # WireGuard
ufw allow in on wg0 to any port 53 proto udp
ufw allow in on wg0 to any port 53 proto tcp
ufw enable

# DNS is NOT opened to the world. Confirm it:
ufw status numbered | grep 53

Noti cosa manca deliberatamente: non c'è alcuna regola che apra la 53 sull'interfaccia pubblica. La porta 53 esiste solo su wg0 e su loopback. Se in seguito aggiunge DNS-over-TLS o DNS-over-HTTPS, quelle sono TCP 853 e TCP 443, sono autenticate da un certificato, e ottengono le proprie regole nel passo 05 — la porta UDP in chiaro resta comunque chiusa.

Ora liberi la porta. Su Ubuntu — e su qualsiasi Debian dove qualcuno l'ha abilitato — systemd-resolved è già in ascolto su 127.0.0.53:53, e Unbound si rifiuterà di avviarsi con un errore di bind che le persone passano venti minuti a fraintendere. Controlli prima, poi disabiliti solo lo stub listener, mantenendo systemd-resolved come interfaccia locale lato client:

ss -lunp 'sport = :53'                # who owns UDP/53 right now?

mkdir -p /etc/systemd/resolved.conf.d
cat > /etc/systemd/resolved.conf.d/no-stub.conf <<'EOF'
[Resolve]
DNSStubListener=no
EOF
systemctl restart systemd-resolved
ss -lunp 'sport = :53'                # should now be empty

Su un Debian 12 pulito il primo comando non stampa nulla e non c'è nulla da fare. Lo esegua comunque — richiede un secondo, e l'alternativa è diagnosticare "address already in use" contro un servizio di cui non sapeva l'esistenza.

Passo 03 · Risolvere

Unbound, dalla radice. Un pacchetto, un file di configurazione, nessun upstream.

Unbound è un resolver validante, ricorsivo e con cache, di NLnet Labs. È pacchettizzato ovunque, è ciò che gran parte di internet già esegue, e appena installato fa ricorsione — deve impegnarsi apposta per trasformarlo in un forwarder. Lo installi insieme al pacchetto dei root hints così che sappia dove si trovano i server radice senza doverne scaricare un elenco da nessuna parte:

apt update && apt install -y unbound dns-root-data
unbound -V | head -2

Il pacchetto dns-root-data installa i root hints in /usr/share/dns/root.hints e il trust anchor radice DNSSEC in /usr/share/dns/root.key, e mantiene entrambi aggiornati tramite il normale canale dei pacchetti. Questo è il modo noioso ma corretto di ottenerli; scaricare root.hints da un URL in un cron job è il modo che prima o poi fallisce in silenzio.

/etc/unbound/unbound.conf.d/nb-resolver.conf

server:
    # ---- Who may ask. Deny first, allow narrowly.
    interface: 127.0.0.1@5335
    interface: 10.8.0.1
    access-control: 0.0.0.0/0 refuse
    access-control: ::0/0 refuse
    access-control: 127.0.0.0/8 allow
    access-control: 10.8.0.0/24 allow

    # ---- Privacy of the recursion itself.
    qname-minimisation: yes
    qname-minimisation-strict: no
    hide-identity: yes
    hide-version: yes
    rrset-roundrobin: yes

    # ---- DNSSEC. The anchor is maintained by the dns-root-data package.
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    root-hints: "/usr/share/dns/root.hints"
    harden-dnssec-stripped: yes
    harden-glue: yes
    harden-below-nxdomain: yes
    harden-large-queries: yes
    harden-short-bufsize: yes
    aggressive-nsec: yes
    val-clean-additional: yes

    # ---- Do not be a reflector, even by accident.
    refuse-any: yes
    ratelimit: 1000
    ip-ratelimit: 200
    edns-buffer-size: 1232

    # ---- Cache. This is where the 4 GB actually earns its keep.
    msg-cache-size: 128m
    rrset-cache-size: 256m
    cache-min-ttl: 60
    cache-max-ttl: 86400
    prefetch: yes
    prefetch-key: yes
    serve-expired: yes
    serve-expired-ttl: 3600

    # ---- Never chase a name that has no business being on the internet.
    private-address: 10.0.0.0/8
    private-address: 172.16.0.0/12
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: fd00::/8
    private-address: fe80::/10

    num-threads: 2
    so-reuseport: yes
    verbosity: 0
    logfile: ""

remote-control:
    control-enable: yes
    control-interface: /run/unbound.ctl

Quattro di quelle righe fanno il lavoro vero e meritano una frase ciascuna.

  • 01access-control: 0.0.0.0/0 refuse — la risposta predefinita a internet è "no". Tutto ciò che viene dopo è un'eccezione che ha scritto di proposito. Questa singola riga è ciò che ferma la storia dell'amplificazione del passo 02 ancora prima che debba intervenire il firewall.
  • 02qname-minimisation: yes — ai server radice viene chiesto solo di .com, non dell'hostname completo. RFC 9156, attivo per impostazione predefinita nelle versioni recenti di Unbound, ed è il motivo per cui un resolver ricorsivo rivela meno di quanto suggerisca il diagramma. Lasci disattivata la modalità strict: un piccolo numero di zone mal configurate si rompe ancora con essa attiva.
  • 03refuse-any: yes — le query ANY restituiscono la risposta più grande possibile per la domanda più piccola possibile, che è esattamente ciò che vuole un attacco di amplificazione. Nulla di legittimo ne ha bisogno.
  • 04serve-expired: yes — quando un server autoritativo non è raggiungibile, distribuisce la risposta scaduta e la aggiorna in background invece di fallire. Questa è l'impostazione che impedisce a un'interruzione lontana di sembrare, a tutti in casa, come se internet fosse down.

Noti i due listener. Il loopback sulla porta 5335 è quello che AdGuard Home userà nel prossimo passo; 10.8.0.1 è l'indirizzo del tunnel, così i client sulla VPN possono interrogare Unbound direttamente se decide di saltare il livello di filtraggio. Se non sta ancora eseguendo WireGuard, per ora rimuova quella seconda riga dell'interfaccia — Unbound non si avvierà con un indirizzo che non esiste sulla macchina.

Lo avvii e dimostri che funziona:

unbound-checkconf
systemctl restart unbound && systemctl enable unbound

apt install -y dnsutils
dig @127.0.0.1 -p 5335 nordbastion.com +short

# DNSSEC: the first must come back with the "ad" flag set,
# the second must FAIL — its signatures are deliberately broken.
dig @127.0.0.1 -p 5335 dnssec-tools.org +dnssec | grep -E 'flags:|status:'
dig @127.0.0.1 -p 5335 dnssec-failed.org  | grep 'status:'

Il flag ad sulla prima risposta significa che Unbound ha controllato la catena di firme dalla radice fino al record e ha retto. SERVFAIL sulla seconda significa che la validazione ha respinto una risposta manomessa invece di passargliela. Se la seconda restituisce invece un indirizzo, la validazione non è attiva e il trust anchor è la prima cosa da controllare.

Passo 04 · Filtrare

AdGuard Home davanti. Blocklist, regole per dispositivo, e i listener cifrati.

Questo passo è opzionale in senso stretto — Unbound da solo è già un resolver privato — e quasi tutti lo vogliono comunque. AdGuard Home offre blocklist, policy per singolo client, un log delle query leggibile mentre esegue il debug, e, cosa più utile, listener nativi DNS-over-TLS e DNS-over-HTTPS così che telefoni e browser possano parlare con il suo resolver da reti dove una VPN non è praticabile.

La disposizione è una catena, e ottenere le porte giuste è tutto il trucco: AdGuard Home possiede la 53 ed è rivolta verso i client, Unbound sta su 127.0.0.1:5335 ed è rivolta verso internet. Nient'altro sulla macchina è in ascolto sulla 53.

curl -fsSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
# Web interface: http://<vps>:3000 — reach it over the SSH tunnel below,
# never by opening 3000 to the internet.
ssh -N -L 3000:127.0.0.1:3000 root@<vps>

Esegua la configurazione guidata iniziale attraverso quel tunnel. Imposti il listener di amministrazione su 127.0.0.1 o sull'indirizzo del tunnel, mai su 0.0.0.0, e gli assegni una password lunga — questa interfaccia può riscrivere ogni nome che la sua rete risolve, il che la rende sensibile quanto il resolver stesso.

Poi imposti esattamente un upstream: in Impostazioni → Impostazioni DNS, svuoti l'elenco predefinito e inserisca la sua istanza di Unbound. Una riga, nient'altro. Se in quella casella resta un resolver pubblico, tutto quanto fatto nel passo 01 è stato vanificato.

127.0.0.1:5335

Lasci disattivato "Richieste parallele" — con un solo upstream non fa altro che duplicare il traffico — e disattivi "Usa resolver DNS inversi privati" a meno che non gestisca davvero una zona interna. Imposti i server di bootstrap su qualcosa di cui si fida; vengono usati solo per risolvere gli hostname dei server upstream, e con un upstream a IP semplice non verranno mai consultati.

Blocklist: inizi con poco. L'istinto è attivare tutto nella pagina degli elenchi e godersi il contatore. Resista alla tentazione. Ogni lista è un insieme di scelte discrezionali fatte da qualcun altro su cosa i suoi dispositivi possano raggiungere, e i guasti sono silenziosi e confusi — una pagina caricata a metà, un pulsante che non fa nulla, un'app bancaria che si rifiuta di aprirsi. Inizi con il filtro DNS predefinito di AdGuard, o con un unico aggregato ben mantenuto come OISD, lo tenga attivo per una quindicina di giorni, e solo allora ne aggiunga altri. Mantenga un'allowlist e la usi senza sensi di colpa.

Il log delle query è la parte scomoda

Ha appena costruito una macchina il cui scopo è impedire a qualcun altro di tenere un elenco di ogni nome che i suoi dispositivi risolvono — e la prima cosa che fa AdGuard Home è tenere esattamente quell'elenco, per impostazione predefinita, per novanta giorni. È genuinamente utile mentre sta calibrando le blocklist, ed è il file più sensibile in assoluto sul server. Decida deliberatamente: 24 ore bastano per rispondere a "cosa ha appena chiesto questo dispositivo?", zero è l'impostazione onesta una volta finita la calibrazione, e novanta giorni è una decisione che nessuno dovrebbe prendere semplicemente lasciando un valore predefinito. Impostazioni → Generale → Log delle query, e imposti anche la conservazione delle statistiche mentre è lì.

Punti il firewall verso la nuova disposizione — AdGuard Home ora possiede la porta 53 sull'interfaccia del tunnel, e Unbound è raggiungibile solo su loopback. Nulla cambia riguardo all'interfaccia pubblica: continua a non avere alcun DNS su di essa.

Passo 05 · Raggiungere

Due modi per entrare. Il tunnel è quello buono; il DNS cifrato è quello portatile.

Un resolver che nessuno può raggiungere non è utile, e un resolver che tutti possono raggiungere è la modalità di guasto del passo 02. Ci sono esattamente due buone risposte, e la maggior parte delle persone finisce per usarle entrambe — il tunnel a casa e sul portatile, il DNS cifrato sul telefono e sulle reti dove l'UDP viene filtrato.

Opzione A — su WireGuard. La migliore delle due, ed è il motivo per cui questa guida continua a rimandare alla guida a WireGuard. La porta 53 resta invisibile a internet, la query stessa non attraversa mai in alcuna forma una rete non fidata, e non c'è alcun certificato da rinnovare. Se il VPS è già la sua uscita VPN, questa è una riga nella configurazione di ogni peer:

# On the client, in the [Interface] section of the peer config:
DNS = 10.8.0.1

Una sottigliezza che inganna molti: su Linux, wg-quick imposta quell'indirizzo tramite resolvconf o systemd-resolved, e se nessuno dei due è installato non fa nulla in silenzio mentre il tunnel si avvia perfettamente. Controlli con resolvectl status o leggendo /etc/resolv.conf dopo che il tunnel è attivo — un tunnel funzionante con ancora configurato il vecchio resolver è esattamente la fuga di cui parla tutto questo esercizio.

Opzione B — DNS-over-TLS e DNS-over-HTTPS. Necessaria quando il dispositivo non può essere sempre sul tunnel. Entrambi sono autenticati da un certificato, il che significa un hostname: punti un record A verso il VPS, poi lasci che AdGuard Home detenga il certificato direttamente, oppure lo metta dietro un reverse proxy che termina già il TLS per lei. I listener sono 853/tcp per DoT e 443/tcp per DoH.

ufw allow 853/tcp                     # DNS-over-TLS
ufw allow 443/tcp                     # DNS-over-HTTPS
# 53/udp is still NOT open on the public interface. It never will be.
ufw status

Assegni all'endpoint DoH un percorso non indovinabile — AdGuard Home le permette di servirlo sotto /dns-query/<random>, e un percorso diverso per ogni persona significa che l'accesso può essere revocato a una persona alla volta senza dover ruotare nulla per tutti gli altri. Non è un'autenticazione in senso forte, ma impedisce che un listener pubblico sia un resolver aperto con qualche passaggio in più.

Client Dove si trova l'impostazione Trasporto che parla
Android 9 e successiviImpostazioni → Rete → DNS privato → hostnameSolo DNS-over-TLS
iOS e macOSUn profilo DNS .mobileconfig firmatoDoH o DoT, a livello di sistema
Windows 11Impostazioni → Rete → Assegnazione server DNSDoH, per adattatore
FirefoxImpostazioni → Privacy → DNS over HTTPS → PersonalizzatoDoH, solo browser
Router (intera rete)DNS del WAN, o opzione DHCP 6DNS in chiaro — quindi lo incanali in un tunnel

La riga del router è quella su cui riflettere. Distribuire il suo resolver tramite DHCP copre ogni dispositivo in casa in una volta sola, compresi quelli senza una schermata di impostazioni — ma il salto dal router al VPS è a quel punto DNS in chiaro attraverso l'internet aperto, che è proprio ciò che si era proposto di fermare. Esegua il tunnel direttamente sul router, oppure accetti che l'ultimo miglio non sia cifrato e lasci che la ricorsione sia comunque il guadagno.

Un'ultima configurazione che vale la pena conoscere: un browser con DNS-over-HTTPS abilitato userà il proprio resolver e ignorerà silenziosamente l'impostazione di sistema, tunnel o no. Sia Firefox che Chrome lo attivano per impostazione predefinita in alcune regioni. O punti anche il browser verso il suo endpoint, oppure disattivi il suo DoH così che segua il sistema operativo.

Passo 06 · Verificare

Quattro controlli. Tre di questi falliscono alla prima build di qualcuno.

1. È aperto verso internet? Lo esegua da una macchina che non è sul tunnel — un telefono con i dati mobili, un altro VPS, qualsiasi cosa. Un timeout è la risposta corretta e desiderabile. Una risposta effettiva significa che ogni scanner su internet lo troverà a sua volta, e dovrebbe tornare immediatamente al passo 02.

dig @<public-ip-of-vps> +timeout=3 example.com
# Expected: ";; connection timed out; no servers could be reached"

2. Il dispositivo lo sta davvero usando? Questo è il controllo che fallisce più spesso, e il guasto è invisibile: il tunnel è attivo, l'impostazione sembra corretta, e il sistema operativo sta ancora interrogando il resolver che il bar gli ha assegnato via DHCP. Chieda al resolver stesso chi pensa che lei sia, poi confermi dall'altro lato.

# On the client — which resolver is the system actually using?
resolvectl status | grep -A2 'Current DNS'        # Linux
scutil --dns | grep nameserver                    # macOS

# On the server — does the query actually arrive?
tail -f /var/log/syslog | grep -i unbound &
unbound-control stats_noreset | grep total.num.queries

Poi carichi dal dispositivo una delle pagine pubbliche di test per le fughe DNS e legga il risultato. Se indica il suo provider VPS, il percorso è corretto. Se indica il suo ISP o un grande resolver pubblico, qualcosa a monte del tunnel sta ancora rispondendo.

3. La validazione è davvero attiva? Ripeta questa volta i due comandi dig del passo 03 attraverso l'intera catena — client, AdGuard Home, Unbound — invece che direttamente contro Unbound. Un nome con firma compromessa deve fallire anche qui. Se ad AdGuard Home è rimasto un secondo upstream da qualche parte nelle sue impostazioni, è qui che si vede.

4. La cache sta facendo il suo lavoro? Dopo un giorno di uso normale, l'hit rate dovrebbe collocarsi tra il settanta e il novanta per cento. Un valore molto più basso di solito significa che la cache è troppo piccola o che cache-min-ttl viene ignorato perché tutto ciò che sta a monte ha un TTL molto breve; un valore molto più alto su una rete trafficata è un segno positivo che il prefetch sta funzionando.

unbound-control stats_noreset | grep -E 'total.num.(queries|cachehits)'
# hit rate = cachehits / queries

E poi le due decisioni operative. Primo: cosa succede quando questa macchina si riavvia. Ogni dispositivo puntato su di essa perde la risoluzione dei nomi, cosa che tutti in famiglia segnaleranno come internet rotto. Imposti il servizio per riavviarsi in caso di guasto e per partire all'avvio, poi riavvii il VPS una volta di proposito e osservi che torni attivo. Secondo: un fallback. O elenchi un resolver pubblico come secondario sui suoi client e accetti che quelle query escano dal suo controllo durante un'interruzione, oppure esegua una seconda istanza su un secondo VPS in un bastione diverso. Entrambe le scelte sono difendibili. Scoprire la domanda alle 23:00 di una domenica non lo è.

systemctl enable unbound AdGuardHome
systemctl show unbound -p Restart -p RestartUSec
reboot        # then, from a client: dig nordbastion.com +short
La parte onesta · Cosa non fa

Chiude un canale. Altri quattro restano aperti.

Un resolver privato è un miglioramento reale e non è un mantello invisibile. Chiunque glielo venda come tale sta vendendo qualcos'altro. Ecco l'elenco di ciò che resta visibile una volta fatto tutto quanto sopra, perché conoscere la forma dell'esposizione residua è la differenza tra una difesa e una coperta di Linus.

La connessione avviene comunque. Un millisecondo dopo il lookup, il suo dispositivo apre una connessione TCP verso l'indirizzo che ha appena appreso. Chiunque osservi la sua linea vede quell'indirizzo. Per un sito sul proprio IP dedicato, l'indirizzo è il sito. Il DNS cifrato rimuove la domanda; non rimuove la risposta.

L'handshake TLS di solito rivela il nome del sito. Il Server Name Indication viene inviato in chiaro all'inizio di quasi ogni connessione HTTPS, quindi un osservatore passivo legge comunque l'hostname. L'Encrypted Client Hello risolve questo problema ed è distribuito in modo disomogeneo — dove sia il browser sia il sito lo supportano il nome è nascosto, e dove non lo supportano non lo è. Non dia per scontato che sia attivo.

L'operatore del resolver ora è lei, ed è una sola persona. Ogni server autoritativo con cui il suo resolver parla vede un unico indirizzo IP chiedere della propria zona. Attraverso molte zone, quell'IP ha uno schema distintivo, e lo schema è una famiglia. Questo è il costo in termini di insieme di anonimato del primo capitolo, e l'unica cosa che lo attenua è che l'IP non sia riconducibile a un nome — un VPS KYC-free pagato in crypto — e, idealmente, che sia lo stesso IP da cui esce già il suo traffico.

Il provider può vedere i pacchetti, come sempre. Il VPS gira sull'hardware di qualcuno, nel datacenter di qualcuno. NordBastion non ispeziona il traffico dei clienti, e il transparency report e il warrant canary descrivono cosa accadrebbe se venisse richiesto — ma l'affermazione onesta dal punto di vista architetturale è che una macchina che noleggia è una macchina che qualcun altro può fisicamente raggiungere. Ciò che cambia con il self-hosting è che non esiste un log delle query a livello di prodotto, nessuna pipeline di analytics e nessuna privacy policy che possa essere modificata; c'è solo un processo che tiene una cache in RAM, configurato da lei, in una giurisdizione scelta apposta da lei.

Ciò che ha effettivamente comprato, con precisione: la fonte più ricca ed economica in assoluto di dati comportamentali su di lei non viene più raccolta da un soggetto il cui modello di business consiste nel raccoglierla. È un'affermazione circoscritta, ed è vera. Nulla in questa pagina sostituisce Tor quando il modello di minaccia richiede Tor — e per quello, la guida ai servizi onion qui sotto è l'onesta lettura successiva.

Dimensionamento · Cosa ordinare

Il DNS è piccolo. Ordini in base a cos'altro vive sulla macchina.

Livello Mensile Risorse Cosa fa girare comodamente
Sentinel$3.902 vCPU · 4 GB · 120 GBResolver + WireGuard per una famiglia. La risposta giusta.
Garrison$7.904 vCPU · 8 GB · 240 GBLo stesso, più un Vaultwarden, un SearXNG e una destinazione di backup
Ravelin$16.908 vCPU · 16 GB · 480 GBUn piccolo team, venticinque peer del tunnel, oltre ad altri servizi
Un secondo Sentinel$3.90In un altro bastioneIl resolver di fallback, così un'interruzione non è un'interruzione di internet

Niente in questa tabella è scelto per il DNS. Un resolver per trenta dispositivi usa poche centinaia di megabyte di cache e una frazione di un core, e muove poche centinaia di megabyte di traffico al mese. Scelga il livello in base ai peer WireGuard, agli altri servizi e al disco — poi lasci che il resolver viaggi gratis.

Note dal campo · Sei trappole

Sei modi in cui questo va storto. Cinque di essi sono silenziosi.

Trappola 01 · Rumorosa

Il resolver aperto, e il null-route una settimana dopo

Una regola del firewall di troppo, oppure una riga di access-control lasciata su allow. Gli scanner trovano la porta in poche ore, il traffico di amplificazione inizia, arriva la segnalazione di abuso, l'IP si spegne. Rifiuti per impostazione predefinita, consenta solo il tunnel, e testi da fuori rete.

Trappola 02 · Inutile

Un resolver privato che inoltra a uno pubblico

AdGuard Home installato, upstream lasciato sull'elenco predefinito, tutto funziona magnificamente — e il log delle query continua ad accumularsi presso un'azienda il cui nome è nella casella delle impostazioni. Imposti un solo upstream, e sia il suo Unbound.

Trappola 03 · Invisibile

Il tunnel è attivo e il dispositivo non gliel'ha mai chiesto

wg-quick non è riuscito a impostare il DNS perché resolvconf non è installato, oppure un browser sta facendo il proprio DNS-over-HTTPS. Tutto sembra corretto e ogni ricerca finisce comunque sulla rete su cui si trova. Verifichi dal lato del resolver, non dalla schermata delle impostazioni del client.

Trappola 04 · Confusa

La blocklist ha rotto l'app bancaria, tre settimane dopo

Nulla si annuncia come un guasto DNS — una pagina si carica a metà, un pulsante non fa nulla. Sei liste aggressive abilitate il primo giorno rendono la cosa intracciabile. Inizi con una sola, ne aggiunga altre lentamente, mantenga un'allowlist, e tenga abbastanza log delle query da poter rispondere alla domanda.

Trappola 05 · Ironica

Novanta giorni di log delle query, conservati per impostazione predefinita

L'intera costruzione esiste per impedire a qualcuno di tenere questo elenco, e il livello di filtraggio lo tiene proprio lì, sulla macchina, su disco, per tre mesi. Imposti la conservazione di proposito — 24 ore mentre calibra, zero in seguito — e ricordi che riguarda chiunque sia sulla rete, non solo lei.

Trappola 06 · Improvvisa

Un riavvio, e la casa resta senza internet

Un resolver è infrastruttura nel momento in cui altre persone fanno affidamento su di esso. Abiliti entrambi i servizi all'avvio, imposti Restart=on-failure, riavvii una volta di proposito per dimostrarlo, e decida il fallback prima di averne bisogno, non durante.

FAQ · DNS privato

Domande, con risposta.

Undici domande che emergono costruendo tutto questo — comprese le due che decidono se valga la pena costruirlo.

Gestire un resolver proprio è davvero più privato che usare Quad9 o Cloudflare?

È diverso, ed è migliore nel modo che conta di più — ma la risposta onesta ha due metà. Cosa guadagna: con un resolver ricorsivo, nessuna singola parte vede mai il suo flusso di query completo. I server radice apprendono che qualcuno ha chiesto di .com, i server di .com apprendono che qualcuno ha chiesto di example.com, e solo l'operatore di example.com apprende il nome completo — e nessuno di loro vede le prossime mille ricerche che farà. Un resolver pubblico, al contrario, le vede tutte, una per una, in ordine, con timestamp, per sempre, e la sua privacy policy è l'unica cosa che si frappone tra quell'elenco e qualcun altro. Cosa perde: un resolver personale ha un insieme di anonimato pari a uno. Le query che escono da un grande resolver pubblico si mescolano con quelle di milioni di altre persone; le query che escono dal suo sono inequivocabilmente sue. Questo scambio vale la pena quando l'IP del resolver non è legato alla sua identità — che è esattamente ciò che le offre un VPS KYC-free pagato in crypto, e esattamente ciò che un hyperscaler con la sua carta registrata non offre. Metta il resolver dietro lo stesso VPS da cui esce già la sua VPN e l'insieme di anonimato non si riduce affatto, perché quell'IP stava già gestendo la sua navigazione.

Fare self-hosting del DNS renderà la sua navigazione più veloce?

Leggermente più lento alla prima ricerca di un nome, sensibilmente più veloce a ogni ripetizione, e nel complesso più o meno un pareggio. Un resolver ricorsivo che parte a freddo deve percorrere la catena di delega — radice, TLD, autoritativo — cioè tre o quattro andate e ritorno invece dell'unica andata e ritorno verso un resolver pubblico che aveva già la risposta in cache dalla query di qualcun altro. Una volta che la sua cache è calda, il che per una famiglia richiede circa un giorno, i nomi più comuni vengono serviti dalla RAM in ben meno di un millisecondo ed è lei ad essere avvantaggiato. Attivi prefetch in modo che i record più popolari vengano aggiornati prima di scadere, e il caso di avvio a freddo scompare quasi del tutto. L'unico punto in cui può davvero perdere prestazioni è la geolocalizzazione per i CDN: i grandi resolver pubblici passano una versione troncata della sua posizione di rete al server autoritativo (EDNS Client Subnet) in modo che il CDN possa scegliere un nodo edge vicino. Unbound non la invia, per progettazione. Se il suo resolver si trova nella stessa regione in cui si trova lei, questo non cambia nulla di misurabile. Se il resolver è a Reykjavík e lei è a Singapore, alcuni CDN le assegneranno un nodo edge europeo e lo sentirà.

Serve un nome di dominio per questo?

Solo per il trasporto cifrato. Il DNS in chiaro su un tunnel WireGuard non richiede alcun dominio, alcun certificato e nessuna esposizione pubblica — il resolver ascolta su un indirizzo privato come 10.8.0.1 e risponde solo ai peer sul tunnel. Questa configurazione è al tempo stesso la più semplice e la più privata di questa guida. Le serve un dominio nel momento in cui vuole DNS-over-TLS o DNS-over-HTTPS, perché entrambi sono autenticati da un certificato e un certificato viene rilasciato per un nome. È la configurazione da scegliere quando i dispositivi non possono essere sempre sulla VPN — un laptop di lavoro, un telefono su una rete che blocca l'UDP, un familiare che non manterrà un tunnel. Se registra un dominio, lo registri in un posto che non richiede la stessa identità a cui ha fatto attenzione altrove, e mantenga attiva la privacy WHOIS.

Unbound o AdGuard Home — servono entrambi?

Risolvono problemi diversi e l'abbinamento non è ridondante. Unbound è il resolver: percorre il DNS a partire dalla radice, valida le firme DNSSEC e mette in cache i risultati. AdGuard Home non è affatto un resolver — è un front-end di filtraggio con un'interfaccia web e listener cifrati, e inoltra a un upstream tutto ciò che non blocca. Esegua AdGuard Home da solo e il suo upstream sarà un resolver pubblico, il che riporta l'intero flusso delle sue query nel log di qualcun altro. Esegua Unbound da solo e ottiene un resolver genuinamente privato, senza blocklist, senza regole per dispositivo e senza interfaccia. Concatenati — AdGuard sulla 53, Unbound su 127.0.0.1:5335 come suo unico upstream — ottiene filtraggio e trasporto cifrato davanti a un resolver che risponde a partire dalla radice. Se vuole la superficie di attacco più piccola possibile e non le importa del blocco della pubblicità, Unbound da solo è una risposta del tutto rispettabile, ed è la metà dello stack che garantisce davvero la privacy.

Cos'è un resolver aperto, e perché è un problema così grande?

Un resolver aperto è un resolver ricorsivo che risponde a query provenienti da qualsiasi indirizzo sorgente su internet. È un problema grande perché il DNS funziona su UDP, gli indirizzi sorgente UDP sono banalmente falsificabili, e una piccola query può produrre una risposta grande. Un attaccante invia al suo server una query di 60 byte con l'indirizzo di una vittima falsificato come sorgente; il suo server invia diligentemente alla vittima una risposta decine di volte più grande. Moltiplichi per migliaia di resolver aperti ed è un DDoS di riflessione e amplificazione, e il suo server è una delle armi. In pratica la sequenza è rapida e prevedibile: gli scanner che perlustrano tutto internet trovano una porta 53 appena aperta entro poche ore, il traffico inizia, arrivano le segnalazioni di abuso, e il provider applica un null-route all'IP per proteggere la propria rete. Non è un'ipotesi, e non è raro — è il modo più comune in assoluto in cui un primo server DNS finisce male. La correzione costa una regola del firewall e una riga di configurazione: rifiuti per impostazione predefinita, consenta solo il suo tunnel.

Il DNS cifrato nasconde al suo ISP quali siti web visita?

Nasconde la ricerca, non la visita. DNS-over-TLS e DNS-over-HTTPS significano che il suo ISP non vede più una domanda in chiaro che dice example.com. Ciò che vede ancora è la connessione che lei fa un millisecondo dopo: l'indirizzo IP di destinazione e — a meno che entrambe le estremità supportino l'Encrypted Client Hello — il nome del server nell'handshake TLS, in chiaro. Per un sito su un IP dedicato, l'indirizzo da solo lo identifica; per un sito dietro un grande CDN l'indirizzo è condiviso e l'SNI lo tradisce. Quindi il DNS cifrato alza il costo della sorveglianza passiva e rimuove la superficie di sorveglianza più facile ed economica che esiste, ma non rende la sua navigazione invisibile. Se il modello di minaccia è il suo ISP o una rete ostile che vede tutto, lo strumento adatto è il tunnel — il DNS cifrato chiude la fuga che una VPN da sola può ancora avere, quando il sistema operativo continua a usare il resolver dell'ISP fuori dal tunnel.

Quanto deve essere grande il VPS?

Molto più piccolo di quanto ci si aspetti. Le risposte DNS sono di poche centinaia di byte e il lavoro per query è una ricerca in hash, quindi il resolver per una famiglia o un piccolo team è inattivo quasi tutto il tempo. Un Sentinel — 2 vCPU, 4 GB, $3.90 al mese — servirà decine di dispositivi senza che il load average si allontani da zero, e la maggior parte di quei 4 GB è disponibile da destinare alla cache, che è l'unica risorsa che migliora davvero l'esperienza. Dia a Unbound qualche centinaio di megabyte di cache per messaggi e RRset e il suo hit rate si assesterà nell'intervallo tra l'ottanta e il novanta per cento. Il motivo per dimensionare più in grande non è mai il DNS: è che la stessa macchina sta anche terminando il suo tunnel WireGuard, o eseguendo un Vaultwarden, o custodendo un repository di backup. La banda non è un problema — un resolver domestico impegnato muove poche centinaia di megabyte al mese.

Cosa succede quando il VPS si riavvia o il resolver muore?

Ogni dispositivo configurato per usarlo smette di risolvere i nomi, cosa che le persone che li usano descriveranno come "internet non funziona". Questo è il vero costo operativo del self-hosting del DNS e merita una decisione, non una scoperta. Tre difese, in ordine di sforzo crescente. Configuri un resolver secondario sui suoi client — uno pubblico come Quad9 o dns0.eu — e accetti che durante un'interruzione quelle query escano dal suo controllo; è quello che dovrebbero fare la maggior parte delle persone. Oppure esegua una seconda istanza su un secondo VPS in un altro bastione ed elenchi entrambi, il che mantiene tutto in casa al prezzo di una seconda macchina da $3.90. Oppure, sul tunnel, esegua una piccola cache locale su ogni client così che una breve interruzione sia invisibile. Qualunque cosa scelga, imposti Restart=on-failure sull'unit, la abiliti all'avvio, e testi il riavvio una volta di proposito — un resolver che non torna da solo sceglierà sempre il momento peggiore per dimostrarlo.

Le blocklist romperanno qualcosa?

Sì, occasionalmente, e il modo in cui lo gestisce è la differenza tra una configurazione che dura e una che viene smantellata entro due settimane. Le blocklist sono mantenute da persone che fanno scelte discrezionali, e ogni tanto una di queste scelte blocca qualcosa di cui ha bisogno: l'endpoint antifrode di una banca, un widget di tracciamento delle consegne, un flusso di login che reindirizza tramite un dominio di analytics. Il guasto è confuso perché non sembra un problema di DNS — la pagina si carica a metà, o un pulsante non fa nulla. Tre abitudini lo risolvono. Inizi con un'unica lista prudente invece di sei aggressive. Mantenga un'allowlist e vi aggiunga elementi senza sensi di colpa. E tenga il log delle query attivo abbastanza a lungo da poter rispondere a "cosa ha chiesto questo dispositivo, e cosa abbiamo rifiutato?" — che è il momento in cui scopre che un resolver filtrante è a sua volta un dispositivo che registra tutto, e che la sua impostazione di conservazione è una decisione sulla privacy che sta prendendo per chiunque sia sulla rete.

Può condividere il resolver con la famiglia o gli amici?

Sì, ed è una delle migliori ragioni per costruirlo — una sola macchina da $3.90 può ripulire il DNS per un'intera famiglia o per un gruppo di amici. Due regole lo rendono sicuro. Primo, lo condivida tramite il tunnel o tramite un endpoint cifrato autenticato, mai aprendo la porta 53 al mondo; con DNS-over-HTTPS può dare a ogni persona un percorso distinto così che l'accesso possa essere revocato individualmente, e AdGuard Home può poi applicare filtraggi diversi per client. Secondo, sia chiaro con sé stesso su cosa si sta assumendo: ora detiene il log delle query di chiunque lo usi. Imposti la conservazione a zero o a un giorno, dica loro qual è l'impostazione, e ricordi che se è mai la sua stessa privacy quella che sta proteggendo, un resolver usato da cinque persone è anche un resolver in cui una singola query è più difficile da attribuire a una di loro in particolare.

A NordBastion importa se esegue un resolver DNS su un VPS?

Per nulla — un resolver privato e ad accesso controllato è un carico di lavoro normale e la politica di uso accettabile non ha nulla da dire in merito. Ciò di cui la politica si preoccupa, e di cui si preoccupa ogni rete seria, è un resolver aperto usato come riflettore di amplificazione contro terzi, perché il traffico d'attacco lascia la nostra rete e finisce su quella di qualcun altro. Segua il passo 02 e questo non accadrà mai: rifiuti per impostazione predefinita, consenta il tunnel, limiti la velocità del resto. Se vuole eseguire deliberatamente un resolver pubblico come servizio per altri, è una conversazione che vale la pena avere in anticipo piuttosto che dopo la prima segnalazione di abuso — i requisiti tecnici (limitazione della velocità di risposta, niente ANY, monitoraggio) sono ben compresi, ed è farlo per errore il problema, non farlo di proposito.

Ottenere il server

Un resolver tutto suo, su un IP che non porta il suo nome. KYC-free, pagamento in crypto.

Sentinel — 2 vCPU e 4 GB per $3.90 al mese, a Helsinki, Stockholm, Oslo o Reykjavík. Sufficiente per il resolver, per il tunnel WireGuard dietro cui dovrebbe stare, e per qualsiasi altra cosa decida di smettere di noleggiare da altri. Nessuna email alla registrazione, nessun documento d'identità, e nessun log a livello di prodotto di qualsiasi cosa cerchi.

Ultima revisione · 2026-10-12 · Fonti · Documentazione di Unbound e AdGuard Home, RFC 9156 (QNAME minimisation), RFC 7858 (DNS-over-TLS), RFC 8484 (DNS-over-HTTPS), systemd-resolved(8) · Cadenza · annuale

Hosting privato, costruito nel Nord.