Esporre AdGuard Home (DoH/DoT/DoQ) tramite Nginx Proxy Manager
Questa guida descrive passo-passo come esporre DNS-over-HTTPS (DoH), DNS-over-TLS (DoT) e DNS-over-QUIC (DoQ) di AdGuard Home all'esterno della tua rete usando Nginx Proxy Manager (NPM). È pensata per essere pubblicata su una wiki tecnica e usata come riferimento per chi vuole ottenere lo stesso risultato.
Sommario
* Obiettivo * Panoramica architetturale * Prerequisiti * Passaggi dettagliati
- Configurare AdGuard Home
- Installare e configurare Nginx Proxy Manager
- Certificati Let’s Encrypt e opzioni SSL
- Mappature porte sul router / firewall
- Configurare il client (esempi)
* Snippet di configurazione Nginx (dove incollare la tua configurazione) * Test e troubleshooting * Sicurezza, privacy e limitazioni * Vantaggi e svantaggi
Obiettivo
Permettere l'uso del tuo server DNS (AdGuard Home) da qualsiasi posto esterno alla rete locale, usando DoH/DoT/DoQ cifrati, senza aprire la porta HTTPS standard 443 sul router. Al posto di 443 useremo una porta esterna casuale (es. 24677) che sarà inoltrata verso Nginx Proxy Manager, il quale inoltra al servizio AdGuard che ascolta su porte non standard (es. HTTPS su 444, DoT su 853, DoQ su 853).
Panoramica architetturale
Internet
|
|----> Router ---> :24677 TCP (port forwarding)
|
v
Nginx Proxy Manager 24677 -> 444
|
Proxy_pass --> AdGuard Home (IP interno: e.g. 192.168.1.10)
| (HTTPS:444, DoT:853)
LAN devices
Nota: tutte le richieste DoH esterne risulteranno provenienti dall'IP pubblico del server che esegue Nginx Proxy Manager (e non dall'IP del client). Questo è normale quando si usa un reverse-proxy.
Prerequisiti
* AdGuard Home già funzionante sulla rete locale (HTTP/GUI e DNS funzionanti). * Accesso al DNS del tuo dominio per creare un record `sottodominio.tuodominio` (A/AAAA) puntato all'IP pubblico del router/host. * Nginx Proxy Manager installato su una macchina raggiungibile dall'esterno (container o VM). * Accesso al router per creare una regola di port forwarding: porta esterna casuale → Nginx Proxy Manager. * Certificato Let's Encrypt (gestito da NPM) per `sottodominio.tuodominio`.
1) Configurare AdGuard Home
1. Apri l'interfaccia web di AdGuard Home (es. [http://192.168.1.10:3000](http://192.168.1.10:3000)). 2. Vai in Settings → Encryption settings. 3. Abilita DNS-over-HTTPS, DNS-over-TLS e DNS-over-QUIC. 4. Per Server name usa il tuo `sottodominio.tuodominio` (necessario per SNI e validazione cert). 5. Imposta le porte locali come preferisci:
- DoH / HTTPS: `444` (esempio non standard così non confligge con GUI/router)
- DoT: `853`
- DoQ: `853`
6. Salva e verifica che AdGuard stia ascoltando su queste porte e risponda localmente.
2) Installare e configurare Nginx Proxy Manager (NPM)
1. Installa NPM (docker-compose o package). Segui la documentazione ufficiale.
2. Crea un nuovo Proxy Host in NPM con i seguenti parametri di esempio:
- Domain Names: `sottodominio.tuodominio`
- Scheme: `https`
- Forward Hostname / IP: indirizzo IP interno della macchina con AdGuard (es. `192.168.1.10`)
- Forward Port: `444` (la porta HTTPS configurata in AdGuard)
- Cache Assets: NO
- Websockets Support: NO
- Block Common Exploits: YES
3. SSL → scegli di usare Let's Encrypt e genera il certificato per `sottodominio.tuodominio`. Abilita le seguenti opzioni:
- Force SSL
- HSTS Enabled
- HTTP/2 Support
- HSTS subdomains (opzionale, usare con attenzione)
4. Nella sezione *Advanced* incolla la tua configurazione Nginx custom (vedi snippet sotto). Salvare.
Importante: NPM ascolterà sulle porte 80/443 interne del suo container; puoi esporre NPM su una porta pubblica non standard (es. 24677) effettuando il port-forwarding dal router verso la porta 80/443 del container o usando una mappatura Docker differente.
3) Port forwarding sul router
* Evita di aprire la 443 pubblica se non vuoi. Crea una regola di NAT/port-forwarding dal router:
- Porta pubblica: `24677` (Esempio)
- Porta interna: `443` (dove NPM riceve HTTPS)
- Destinazione: IP del server NPM
* Se NPM è esposto su una porta diversa all'interno della macchina, adatta la mappatura.
4) Client: come configurare DoH/DoT/DoQ usando la porta esterna
* DoH (URL): `https://sottodominio.tuodominio:24677/dns-query` * DoT (host + port): `sottodominio.tuodominio:24677` (NB: DoT normalmente usa 853 su TLS, quindi alcuni client non supportano DoT su porte non standard — preferisci DoH quando usi porte non standard)
Snippet Nginx da usare nella casella "Advanced" di NPM
Nel blocco Advanced del Proxy Host in Nginx Proxy Manager incolla lo snippet Nginx personalizzato. Se vuoi, nella wiki lascia un link o allega il file di configurazione Nginx completo che userai\
location /dns-query {
proxy_pass https://ipserverdns:444/dns-query;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 10M;
proxy_connect_timeout 5s;
proxy_read_timeout 10s;
# Se usi certificato self-signed su AdGuard, attiva questa riga:
# proxy_ssl_verify off;
}
Nota: controllare `if` in Nginx è delicato; testalo bene. In alternativa, usa `map` o `allow/deny` su base IP quando applicabile.
Vantaggi
* Puoi usare il tuo DNS cifrato (DoH/DoT/DoQ) da qualsiasi luogo senza VPN. * Eviti di aprire la porta 443 pubblica; usi una porta non standard per ridurre scansioni automatiche. * Maggiore sicurezza grazie all'uso di connessioni cifrate e protocolli moderni (TLS 1.3/QUIC). * Possibilità di filtrare e monitorare accessi attraverso Nginx Proxy Manager per una protezione aggiuntiva.
Svantaggi
* Tutte le richieste esterne risulteranno provenire dall'IP del proxy (meno identificazione del client). * Alcuni client DoT non supportano porte non standard (compatibilità limitata). * Esporre un servizio DNS all'esterno aumenta la superficie d'attacco: richiede monitoraggio e hardening.
Conclusione
Questa procedura è un buon compromesso se vuoi fornire DoH pubblico senza usare la porta 443 e senza mettere il servizio DNS direttamente esposto. Tuttavia, valuta i trade-off di privacy e sicurezza e considera l'uso di VPN o autenticazione aggiuntiva per casi sensibili.
Scritto in collaborazione con llm per fixare la sintassi sulla wiki (: