Installazione AdGuard Home
![]()
1. Cos'è AdGuard Home?
AdGuard Home non è un vero e proprio dns anche se gli somiglia tanto. È un proxy/forwarder dns focalizzato sulla privacy, sul blocco di pubblicità e sul controllo parentale.
- 1. Cos’è AdGuard Home?
- 2. Descrizione dello scenario
- 3. Installazione AdGuard Home
- 4. Configurazione
- 5. Creazione certificati
- 6. Configurazione nginx per accesso webui (mtls) e DoH
- 7. Configurazione firewall locale
- 8. Conclusione
AdGuard offre diverse soluzioni per la tutela della privacy. Dalle vpn, alle estensioni anti-tracker/ads per browser, a livello di host, a livello di rete, con delle soluzioni basate sul dns.
Rispetto a tutte le altre soluzioni, quella basata su dns è molto più pervasiva visto che non è limitata ai soli browser o ai singoli host sui quali è installata.
AdGuard Home è una soluzione anti-tracker/ads on-prem a livello di rete per qualunque applicazione di qualunque dispositivo connesso alla nostra lan.
Il suo scopo è quello di intercettare la richiesta dns dei client, terminarne la connessione, applicare le proprie regole e creare, quando necessario, una seconda connessione verso un upstream dns che risolve realmente la richiesta e fa il percorso inverso verso il client.
Le regole che Adguard Home applica, servono per eliminare tracker e ads ed eventualmente anche negare l'iintera richiesta dns prima di inoltrarla verso gli upstream se il dominio risulta bloccato dalle liste di Adguard.
AdGuard Home supporta la modalità piana (classica porta 53) o crittografata (DoH-DoT-DoQ, resolver DNSCrypt tramite DNS stamp) sia verso l'esterno (upstream) che verso i client della LAN (downstream).
Non bisogna pensare ad AdGuard Home come al surrogato di una vpn.
Il suo scopo non è quello di anonimizzare il traffico ma di eliminare tracker e ads del traffico web, eventualmente superare i blocchi sulla raggiungibilità delle risorse web imposte dal provider attraverso i SUOI dns e, solo se l'upstream è cifrato, impedire al provider stesso di esaminare le query DNS che vengono fatte. Tutto il resto del traffico web rimane comunque esposto.
Se installato su un singolo host, AdGuard Home agisce da cleaner ed eventualmente da resolver dns locale.
Se installato sulla periferia della rete (che è lo scenario che ci interessa), a ridosso di un router domestico o su un VPS esterno, che AdGuard Home da il meglio di sè perché è in grado di intercettare tutto il traffico dns di qualunque dispositivo della LAN, ripulirlo da tracker e ads e rimetterlo in circolo. E questo, in un ambiente come quello domestico, ormai zeppo di IoT e di dispositivi collegati in rete (tv, frigoriferi, lavastoviglie, ipcam ecc..) su cui non si ha alcun controllo, è un'ottima cosa.
AdGuard Homepermette di definire delle regole puntuali per singolo client in modo che una politica di privilegio minimo sia facile da realizzare. Possiamo avere un controllo di base molto restrittivo con le eccezioni per i client specifici. In più, può fare da DHCP per l'intera rete.
2. Descrizione dello scenario
I passi da fare:
- installazione AdGuard Home
- Inizializzazione
- configurazione AdGuard Home
- abilitazione e configurazione DoT, DoQ, DNSCrypt
- creazione certificati self-signed server e client
- configurazione nginx per accesso webui (mtls) e DoH
- configurazione firewall locale
L'installazione e la messa in opera di AdGuard Home è veramente semplice ed immediata.
Basterebbe piazzarlo su un host dedicato, fare in modo che il router dichiari come dns per la lan l'ip dell'host AdGuard Home, così che tutti i device connessi alla lan ricevano AdGuard Home come dns di default.
Ovviamente è fondamentale dichiarare degli upstream decenti che possono essere scelti per es. fra:
Non c'è bisogno d'altro affinché la lan riceva i benefici di AdGuard Home.
Nel caso in esame, ho reso l'installazione un po' più articolata.
Il posizionamento di AdGuard Home come “dns” della lan indirizzato dal router è un “must have”.
AdGuard Home farà il suo mestiere nell'occuparsi di trackers, ads e link malevoli oltre che inoltrare le richieste di risoluzione esterne verso i server upstream come sappiamo.
Allo stesso tempo fungerà da semplice risolutore diretto per i nomi locali attraverso le regole di riscrittura. La risoluzione inversa, grazie alla quale AdGuard Home può registrare nel log i device col loro nomi, sarà delegata al router.
Nel mio laboratorio ho abilitato la crittografia TLS più come esercizio di stile che come necessità effettiva. In un ambito domestico, su un selfhosting, è una configurazione sostanzialmente inutile perché posso fidarmi della mia rete.
Le query in chiaro non costituirebbero un problema tanto più che l'host sarebbea anche sgravato dalla necessità di crittografare le richieste dei client della lan.
Potrebbe essere comprensibile se dovessi esporre AdGuard Home su internet, ad es. nel caso di un'installazione su un VPS esterno.
Ad ogni modo l'esposizione di DoH, DoT, DoQ e il resolver DNSCrypt da parte di AdGuard Home funziona egregiamente.
Come protezione ulteriore, l'accesso alla webui di amministrazione di AdGuard Home e al DoH viene mediato da un reverse proxy nginx che gira sullo stesso host. Nel caso della webui, nginx è configurato in modalità mTLS, dove i certificati client validano sia l'accesso che l'autorizzazione al servizio. Se non si possiede un certificato client o se lo si possiede ma nginx non lo riconosce valido per l'accesso a quel determinato servizio, la richiesta viene negata.
Estremizzando, ho provato ad applicare il reverse proxing a qualunque richiesta dns facendo si che AdGuard Home girasse completamente sull'interfaccia di loopback, ma per quanto fossi affascinato questa prospettiva, ho desistito perché il reverse proxy di uno stream ha come effetto collaterale che la registrazione dei client nel log di AdGuard Home sia falsata (ip di nginx invece che del client).
Inoltre, immaginando che la mia lan sia raggiungibile anche da vpn, ho fatto in modo che AdGuard Home sia anche il dns della rete vpn.
![]()
3. Installazione AdGuard Home
Scaricare da qui l'ultima versione (ad oggi la 0.109.79) per la propria architettura: https://github.com/AdguardTeam/AdGuardHome/releases/latest
ARCH="amd64"
VERSION="0.109.79"
wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v"${VERSION}""/AdGuardHome_linux_"${ARCH}".tar.gz
tar -xzf AdGuardHome_linux_"${ARCH}".tar.gz -C /opt/
++IMPORTANTE++
Controllare che sull'host le porte:
- 3000 (init da webui)
- 53 (dns)
- 80 (http)
siano aperte perché la prima esecuzione servirà ad inizializzare il servizio.
3.1. Inizializzazione
sudo /opt/AdGuardHome/AdGuardHome
Completare l'inizializzazione sulla webui alla porta 3000, basta indicare la listen interface http per la webui, quella per il dns e la password di amministrazione.
Installo AdGuard Home come servizio in modo che possa avviarlo/stopparlo/riavviarlo via systemd invece che con la cli di AdGuard Home
sudo /opt/AdGuardHome/AdGuardHome -s install
In questo modo avrò:
# Avvio
sudo systemctl AdGuardHome start
# equivalente a sudo /opt/AdGuardHome/AdGuardHome -s start
# Stop
sudo systemctl AdGuardHome stop
# equivalente a sudo /opt/AdGuardHome/AdGuardHome -s stop
# Riavvio
sudo systemctl AdGuardHome restart
# equivalente a sudo /opt/AdGuardHome/AdGuardHome -s restart
# Status
sudo systemctl AdGuardHome status
# equivalente a sudo /opt/AdGuardHome/AdGuardHome -s statuts
4. Configurazione
Nonostante l'interfaccia web (http://adguard.mylab.home:8080) sia molto completa (a meno della configurazione DNSCrypt), per comodità editerò direttamente il file yaml.
Cominciamo con la webui.
http:
pprof:
port: 6060
enabled: false
doh:
routes:
- GET /dns-query
- POST /dns-query
- GET /dns-query/{ClientID}
- POST /dns-query/{ClientID}
insecure_enabled: true
address: 127.0.0.1:8080
session_ttl: 30d
...
Il servizio sarà in ascolto sull'interfaccia di loopback sulla porta 8080 perché sarà nginx a raccogliere le richieste, processarle e inoltrarle. Per questo motivo insecure_enabled: true (e non false come sarebbe il default) perché non sarà l'host AdGuard Home ad esporre la porta https.
...
dns:
bind_hosts:
- 192.168.100.2
- 10.180.92.1
- 127.0.53.53
port: 53
...
Qua vanno indicati gli ip su cui AdGuard Home è in ascolto per le richieste dns che, nel mio caso, corrisponderanno a lan, vpn e loopback. Se avessi voluto reverseproxare le richieste dns, avrei solo loopback su una porta di backend a caso.
...
upstream_dns:
- sdns://AQMAAAAAAAAAETk0LjE0MC4xNS4xNTo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20
- tls://dns.adguard-dns.com
- https://dns.adguard-dns.com/dns-query
- quic://dns.adguard-dns.com
upstream_dns_file: ""
bootstrap_dns:
- 1.1.1.1
- 9.9.9.10
- 8.8.8.8
- 149.112.112.10
- 2620:fe::10
- 2620:fe::fe:10
fallback_dns:
- tls://dns.quad9.net
- https://dns9.quad9.net/dns-query
- https://dns.quad9.net/dns-query
upstream_mode: load_balance
...
Sempre sotto dns, 3 sezioni critiche.
upstream_dns: server dns, possibilmente cifrati, a cui AdGuard Home gira la risoluzione;bootstrap_dns: server dns critici altamente affidabili a cui è assegnato il compito di risolvere inizialmente i nomi dei dns upstream cifrati, alrtimenti AdGuard Home non saprebbe come utilizzarli;fallback_dns: server dns che subentrano agli upstream qualora non fossero raggiungibili.
Negli upstream cifrati, ho usato quelli di AdGuard che sono specifici nell'individuare e bloccare tracker e ads.
Quad9 per es. è più orientato al blocco di malware e phishing (li ho scelti come fallback). In quelli di OpenNIC c'è un po' dell'uno e un po' dell'altro. Ottimi ma ogni tanto bisogna controllarne lo status.
Per la modalità di scelta upstream ho lasciato il default (load_balance).
...
trusted_proxies:
- 127.0.0.1
...
I trusted proxies sono dei server intermedi, come i reverse proxy, considerati attendibili da AdGuard Home nel richiedere risoluzioni. Nel mio caso, sarà Il reverse proxy nginx che gira sullo stesso host e che medierà l'accesso alla webui e al DoH.
...
local_ptr_upstreams:
- 192.168.100.1
...
Con local_ptr_upstream posso indicare chi deve occuparsi delle risoluzioni inverse della mia lan. Potrebbe essere lo stesso AdGuard Home (127.0.0.1) ma decido di delegare il compito al router (192.168.100.1) per fare si che l'elenco delle risoluzioni interne gestite da AdGuard Home nella sezione filtering non sia troppo affollato.
...
filtering:
rewrites:
- domain: adguard.mylab.home
answer: 192.168.100.2
enabled: true
- domain: dns-doh.mylab.home
answer: adguard.mylab.home
enabled: true
...
La sezione filtering conterrà tutte le risoluzioni della mia lan, sia dirette che inverse. In questo laboratorio ho scelto di popolare questa sezione solo con le risoluzioni dirette e i CNAME. Quelle inverse, come detto in precedenza, le affido al router puntato da local_ptr_upstreams).
Notare la presenza di un cname, dns-doh.mylab.home, necessario per la configurazione DoH su nginx e per la creazione del relativo certificato.
4.1. Abilitazione DoT, DoQ, DNSCrypt
...
tls:
enabled: true
server_name: adguard.mylab.home
force_https: false
port_https: 0
port_dns_over_tls: 853
port_dns_over_quic: 853
port_dnscrypt: 5443
dnscrypt_config_file: /opt/AdGuardHome/dnscrypt.yaml
certificate_chain: ""
private_key: ""
certificate_path: /opt/AdGuardHome/ssl/adguard.crt
private_key_path: /opt/AdGuardHome/ssl/adguard.key
strict_sni_check: false
...
La sezione TLS è una zona meritevole di considerazioni.
Per gli scopi del laborotorio, come descritto nello scenario, l'ho attivata affinché AdGuard Home esponga nella lan anche DoT, DoQ e DNSCrypt. Dal momento che DoH viene reverseproxato insieme alla webui, non ha bisogno dell'abilitazione TLS.
Questo spiega perché le porte per DoT, DoQ e DNSCrypt siano esplicitate, la porta https no.
Il TLS richiede inoltre la specifica della chiave e del certificato server legato all'host name.
⚠️⚠️⚠️ ATTENZIONE ⚠️⚠️⚠️
Avere il tls abilitato NON implica che le query dns siano magicamente crittografate.
Se il client chiede ad AdGuard Home delle risoluzioni in chiaro, rimarranno in chiaro.
4.2. Configurazione DNSCrypt
Affinché AdGuard Home funzioni come server DNSCrypt, oltre a specificare la porta, occorre generare un apposito file di configurazione.
Si scarica l'ultima versione dell'utility dnscrypt (attualmente la 2.4.0) e si genera il file di configurazione.
VER="2.4.0"
OS=linux
ARCH="amd64"
# scarica
wget https://github.com/ameshkov/dnscrypt/releases/download/v"${VER}"/dnscrypt-"${OS}"-"${ARCH}"-v"${VER}".tar.gz
# scompatta
tar -vxzf ./dnscrypt-"${OS}"-"${ARCH}"-v"${VER}".tar.gz
cd ./"${OS}"-"${ARCH}"/
# genera il file di configurazione dnscrypt
./dnscrypt generate --provider-name '2.dnscrypt-adguard.mylab.home' --out ./dnscrypt.yaml
Questo file andrà posizionato in una cartella e riferito nel file di configurazione di AdGuard Home (dalla webui non è possibile), nel nostro caso: /opt/AdGuardHome/dnscrypt.yaml
provider_name: 2.dnscrypt-cert.2.dnscrypt-adguard.mylab.home
public_key: 1C41B1DC9E12469B5969247A134006A0EE0948B8333C1785706AF24626C156B1
private_key: FFF3162F0C0489C735665C68B3CA14F7504B8AA505A016F9989F44525B7114BA1C41B1DC9E12469B5969247A134006A0EE0948B8333C1785706AF24626C156B1
resolver_secret: ECE213E9A5D25C5C94B289A7FA8A12C56AEB3BEE87DB8AAA5B3D6FEE7DE0AA2E
resolver_public: 11ED1EAFC96BE7F87BB1D4F2D5E3B62BE1EC7DA2C550435D671F3D4D73217842
es_version: 1
certificate_ttl: 0s
La chiave pubblica generata, va data in pasto all'utility ufficiale di creazione degli stamps DNSCrypt, https://dnscrypt.info/stamps/.
Verrà generato un riferimento come questo: sdns://AQcAAAAAAAAADTE5Mi4xNjguMTAwLjIgHEGx3J4SRptZaSR6E0AGoO4JSLgzPBeFcGryRibBVrEiMi5kbnNjcnlwdC1jZXJ0LmFkZ3VhcmQubXlsYWIuaG9tZQ che andrà consegnato ai client affinché interroghino AdGuard Home in modalità DNSCrypt.
5. Creazione certificati
Trattandosi di un self-hosting, creerò una CA interna per firmare i certificati server e client che mi permetteranno di esporre in https sia la webui in mTLS, sia DoH.
In un ambito domestico un approccio del genere è accettabile. Se il servizio fosse esposto all'esterno, meglio affidarsi a Let's Encrypt (o chi per lui, che fra l'altro risolve strutturalmente anche il problema della distribuzione della CA sui device.
I file di configurazione e i comandi openssl sono coerenti, a meno dei path, delle password dei p12 e degli elementi descrittivi (i certificati client sono stati generati per simbolicamente per Alice e Bob, gli unici a poter accedere alla webui) del certificato che andranno personalizzati.
N.B. Affinché la magia funzioni, ricordo che è necessario distribuire manualmente la CA generata sui vari device.
5.1. CA
###############
# ca_cert.cnf #
###############
[ v3_ca ]
basicConstraints = critical,CA:true
keyUsage = critical, cRLSign, keyCertSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
nsCertType = sslCA
nsComment = "OpenSSL Generated CA Root Certificate"
######
# CA #
######
openssl req -config $HOME/certificati/conf/ca_cert.cnf -extensions v3_ca -x509 -days 1825 -sha512 -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -subj "/C=IT/ST=Italia/CN=My RootCA" -keyout $HOME/certificati/certs/myroot_ca.key -out $HOME/certificati/certs/myroot_ca.crt
5.2. Certificati server
##################
# server_req.cnf #
##################
[ req ]
req_extensions = v3_server_req
[ v3_server_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
nsCertType = server
nsComment = "OpenSSL Generated Server Request Certificate"
###################
# server_cert.cnf #
###################
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
##########
# SERVER #
##########
# adguard.crt
openssl req -config $HOME/certificati/conf/server_req.cnf -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -subj "/C=IT/ST=Italia/L=my City/O=My Organization/CN=adguard.mylab.home/emailAddress=<indirizzo email>" -keyout $HOME/certificati/certs/adguard.key -out $HOME/certificati/certs/adguard.csr
openssl x509 -extfile $HOME/certificati/conf/server_cert.cnf -req -in $HOME/certificati/certs/adguard.csr -days 365 -sha512 -CA $HOME/certificati/certs/myroot_ca.crt -CAkey $HOME/certificati/certs/myroot_ca.key -CAcreateserial -out $HOME/certificati/certs/adguard.crt -extfile <(echo "subjectAltName=DNS:adguard.mylab.home")
# dns-doh.crt
openssl req -config $HOME/certificati/conf/server_req.cnf -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -subj "/C=IT/ST=Italia/L=my City/O=My Organization/CN=dns-doh.mylab.home/emailAddress=<indirizzo email>" -keyout $HOME/certificati/certs/dns-doh.key -out $HOME/certificati/certs/dns-doh.csr
openssl x509 -extfile $HOME/certificati/conf/server_cert.cnf -req -in $HOME/certificati/certs/dns-doh.csr -days 365 -sha512 -CA $HOME/certificati/certs/myroot_ca.crt -CAkey $HOME/certificati/certs/myroot_ca.key -CAcreateserial -out $HOME/certificati/certs/dns-doh.crt -extfile <(echo "subjectAltName=DNS:dns-doh.mylab.home")
5.3. Certificati client
##################
# client_req.cnf #
##################
[ req ]
req_extensions = v3_client_req
[ v3_client_req ]
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = clientAuth
nsCertType = client
nsComment = "OpenSSL Generated Client Request Certificate"
###################
# client_cert.cnf #
###################
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = clientAuth
nsCertType = client
nsComment = "OpenSSL Generated Client Certificate"
##########
# CLIENT #
##########
# Bob
openssl req -config $HOME/certificati/conf/client_req.cnf -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -subj "/C=IT/ST=Italia/L=my City/O=my Organization/OU=Admin AdGuard/CN=Bob" -keyout $HOME/certificati/certs/bob.key -out $HOME/certificati/certs/bob.csr
openssl x509 -extfile $HOME/certificati/conf/client_cert.cnf -req -in $HOME/certificati/certs/bob.csr -days 365 -sha512 -CA $HOME/certificati/certs/myroot_ca.crt -CAkey $HOME/certificati/certs/myroot_ca.key -CAcreateserial -out $HOME/certificati/certs/bob.crt
openssl pkcs12 -export -inkey $HOME/certificati/certs/bob.key -in $HOME/certificati/certs/bob.crt -passout pass:password_di_bob-out $HOME/certificati/certs/bob.p12
# Alice
openssl req -config $HOME/certificati/conf/client_req.cnf -nodes -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -subj "/C=IT/ST=Italia/L=my City/O=my Organization/OU=Admin AdGuard/CN=Alice" -keyout $HOME/certificati/certs/alice.key -out $HOME/certificati/certs/alice.csr
openssl x509 -extfile $HOME/certificati/conf/client_cert.cnf -req -in $HOME/certificati/certs/alice.csr -days 365 -sha512 -CA $HOME/certificati/certs/myroot_ca.crt -CAkey $HOME/certificati/certs/myroot_ca.key -CAcreateserial -out $HOME/certificati/certs/alice.crt
openssl pkcs12 -export -inkey $HOME/certificati/certs/alice.key -in $HOME/certificati/certs/alice.crt -passout pass:password_di_alice -out $HOME/certificati/certs/alice.p12
6. Configurazione nginx per accesso webui (mtls) e DoH
Nginx sarà configurato per esporre webui e DoH.
La possibilità di aggiungere intestazioni http contenenti l'ip del client (a differenza di uno stream udp), mi permetterà di far conoscere ad AdGuard Home gli ip reali dei client che fanno richiesta.
L'accesso alla webui avverrà solo se si è in possesso di un certificato client per il quale nginx controllerà anche che quel certificato sia autorizzato ad usare il servizio stesso tramite il fingerprint del certificato.
Le configurazioni per webui e DoH sono state separate perché nel primo deve essere presente anche la mutua autenticazione. Allo scopo, sono stati generati due certificati server differenti per due server name distinti (adguard.mylab.home e dns-doh.mylab.home)
1. default.conf: rifiuta tutte le richieste che non sono specificate nei vari server name, niente accesso attraverso ip o altri cname.
server {
listen 80 default_server;
listen [::]:80 default_server;
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#
# Nginx 1.19.4+ rifiuta l'handshake SSL per gli IP/domini non validi senza bisogno di un certificato reale
ssl_reject_handshake on;
#
server_name _;
#
# Rifiuta la connessione senza restituire alcuna risposta (chiusura socket)
return 444;
}
2. redirect_default.conf: force redirect 80-443.
server {
listen 80;
listen [::]:80;
#
server_name adguard.mylab.home;
#
return 301 https://$host$request_uri;
}
3. mtls-access.conf: autorizzazione su nginx tramite fingerprint (solo Bob e Alice, in lan o in vpn, possono accedere).
map $ssl_client_fingerprint $allow_webui {
default 0;
# bob
"54251c232b367d8b5d5b70927ba262558b6cf4dd" 1;
# alice
"bc8c8385c81fd86c335e2e17fe9e5578eb9c34f0" 1;
...
}
4. adguard-webui.conf: Accesso alla webui con mTLS.
server {
listen 443 ssl;
server_name adguard.mylab.home;
ssl_certificate /etc/nginx/certs/adguard.crt;
ssl_certificate_key /etc/nginx/certs/adguard.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_client_certificate /etc/ssl/certs/myroot_ca.pem;
ssl_verify_client on;
ssl_verify_depth 1;
if ($allow_webui = 0) {
return 403;
}
# Consenti LAN e VPN
allow 192.168.100.0/24;
allow 10.180.92.0/24;
deny all;
# Configurazione per la WebUI di AdGuard (es. in HTTP sulla porta 8080 interna)
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
5. adguard-doh.conf: Stessa configurazione di webui a meno di mtls, solo teminazione ssl. Tutti gli utenti della lan/vpn possono accedere a DoH.
server {
listen 443 ssl;
server_name dns-doh.mylab.home;
http2 on;
ssl_certificate /etc/nginx/certs/dns-doh.crt;
ssl_certificate_key /etc/nginx/certs/dns-doh.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Consenti LAN e VPN
allow 192.168.100.0/24;
allow 10.180.92.0/24;
deny all;
location = /dns-query {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
7. Configurazione firewall locale
Una volta che tutto è stato messo a punto, configuriamo il firewall locale sull'host adguard/nginx che, se presente, consentirà il traffico per tutte le porte che espone AdGuard Home (o Nginx) affinché siano raggiungibili solo dalla lan e dalla vpn.
Le porte da aprire verso la lan e verso la vpn (ripeto, non verso internet) saranno:
- 53/tcp, 53/udp (dns)
- 80/tcp, 443/tcp (http(s) e DoH)
- 853/tcp (DoT)
- 853/udp (DoQ)
- 5443/tcp, 5443/udp (DNSCrypt)
cat -> /etc/ufw/applications.d/dns.ufw << EOF
[DNS]
title=Internet Domain Name Server
description=DNS plain
ports=53
EOF
cat -> /etc/ufw/applications.d/dot.ufw << EOF
[DNS DoT]
title=DNS DoT
description=DNS over TCP
ports=853/tcp
EOF
cat -> /etc/ufw/applications.d/doq.ufw << EOF
[DNS DoQ]
title=DoQ
description=DNS over QUIC
ports=853/udp
EOF
cat -> /etc/ufw/applications.d/dnscrypt.ufw << EOF
[DNSCrypt]
title=DNSCrypt
description=DNSCrypt
ports=5443
EOF
cat -> /etc/ufw/applications.d/fullweb.ufw << EOF
[Nginx Full Web]
title=Web Server (HTTP,HTTPS)
description=Web Server (HTTP,HTTPS)
ports=80,443/tcp
EOF
ufw allow in on eth0 to 0.0.0.0/0 app "DNS" from 192.168.100.0/24 comment "DNS via lan"
ufw allow in on eth0 to 0.0.0.0/0 app "DNS DoT" from 192.168.100.0/24 comment "DNS DoT via lan"
ufw allow in on eth0 to 0.0.0.0/0 app "DNS DoQ" from 192.168.100.0/24 comment "DNS Doq via lan"
ufw allow in on eth0 to 0.0.0.0/0 app "DNSCrypt" from 192.168.100.0/24 comment "DNSCrypt via lan"
ufw allow in on eth0 to 0.0.0.0/0 app "Nginx Full Web" from 192.168.100.0/24 comment "AdGuard Home webui e DoH via lan"
ufw allow in on wg0 to 0.0.0.0/0 app "DNS" from 10.180.92.0/24 comment "DNS via vpn"
ufw allow in on wg0 to 0.0.0.0/0 app "DNS DoT" from 10.180.92.0/24 comment "DNS DoT via vpn"
ufw allow in on wg0 to 0.0.0.0/0 app "DNS DoQ" from 10.180.92.0/24 comment "DNS Doq via vpn"
ufw allow in on wg0 to 0.0.0.0/0 app "DNSCrypt" from 10.180.92.0/24 comment "DNSCrypt via vpn"
ufw allow in on wg0 to 0.0.0.0/0 app "Nginx Full Web" from 10.180.92.0/24 comment "AdGuard Home webui e DoH via vpn"
8. Conclusione
Tirando le somme, alla fine di questo percorso, avremo il nostro AdGuard Home pronto per filtrare tutto ciò che non va e risolvere esternamente, attraverso gli upstream che abbiamo definito, tutto il traffico proveniente dalla nostra lan domestica e dalla vpn, se c'è.
La webui di AdGuard Home non è esposta direttamente visto che il suo accesso è gestito da nginx ed è autenticata e autorizzata da mTLS. L'esposizione attraverso reverse proxy, ci consegna gratis anche il DoH.
Se AdGuard Home stesse su un VPS esterno, abbiamo visto come attivare DoT, DoQ e DNSCrypt in modo che anche le query che viaggiano verso AdGuard Home siano cifrate (una volta fatto, si potrebbe addirittura disabilitare la risoluzione piana per lasciare solo quella cifrata).
Riferimenti:
- https://adguard.com/it/welcome.html/
- https://adguard-dns.io/kb/it/adguard-home/overview/
- https://dnscrypt.info/implementations
- https://dnscrypt.info/public-servers
- https://dnscrypt.info/faq
- https://dnscrypt.info/stamps
#adguard #dns #nginx #mtls #crittografia #x509 #dot #doq #doh #dnscrypt