Come impostare un risolutore DNS locale con Unbound su Debian
Unbound è un software server DNS gratuito e open source che può essere utilizzato per la convalida, la ricorsione e la memorizzazione nella cache dei risolutori DNS. È un server DNS ricco di funzionalità che supporta DNS-over-TLS (DoT), DNS-over-HTTPS (DoH), minimizzazione dei nomi delle query, uso aggressivo della cache convalidata DNSSEC e supporto per le zone di autorità. Unbound si concentra sulla privacy e sulla sicurezza del DNS, ma senza sacrificare la velocità e le prestazioni.
Unbound è sviluppato principalmente da NLnet Labs e distribuito con licenza BSD e supporta funzionalità moderne su standard aperti del server DNS. Unbound è stato rigorosamente controllato e può essere eseguito su Linux, BSD e macOS. Unbound è disponibile per la maggior parte di questi sistemi operativi e può essere installato tramite il gestore pacchetti di sistema.
In questa guida imparerai come configurare un server DNS privato con Unbound su un server Debian 11 e Debian 12. Configurerai Unbound come server DNS locale con alcune funzionalità come un server DNS autorevole, abiliterai la cache DNS, imposterai l'indirizzo IP locale e gli elenchi di controllo degli accessi (ACL), configurerai i nomi di dominio locali, quindi configurerai Unbound come DNS risolutore con DNS-over-TLS (DoT) abilitato.
Oltre a ciò, configurerai anche la registrazione per il servizio Unbound tramite Rsyslog e Logrotate.
Prerequisiti
Per completare questa guida è necessario possedere i seguenti requisiti.
- Un sistema che esegue un server Debian 11 o un server Debian 12.
- Un account utente con privilegi di amministratore sudo/root.
Questo è tutto. Ora puoi iniziare a installare Unbound come server DNS locale.
Installazione di Unbound
Per impostazione predefinita, il pacchetto Unbound è disponibile nel repository Debian. Puoi installarlo tramite APT. In questo primo passaggio installerai il pacchetto Unbound, che include "dns-root-data" sul tuo server Debian.
Prima di iniziare, aggiorna e aggiorna l'indice del tuo pacchetto Debian tramite il comando apt di seguito.
sudo apt update
Ora esegui il comando apt seguente per controllare il pacchetto 'unbound' disponibile nel repository Debian.
sudo apt info unbound
L'output seguente conferma che il pacchetto Unbound è disponibile per impostazione predefinita sul repository del server Debian con la versione corrente 1.13.
Ora esegui il comando apt seguente per installare non associato al tuo sistema Debian. Quando richiesto, inserire y per confermare e premere INVIO per procedere.
sudo apt install unbound
Produzione :
Una volta installato Unbound, esegui il comando systemctl seguente per verificare il servizio Unbound e assicurarti che il servizio sia abilitato e in esecuzione.
sudo systemctl is-enabled unbound
sudo systemctl status unbound
Il servizio Unbound è abilitato e verrà avviato automaticamente all'avvio del sistema. E lo stato del servizio Unbound è in esecuzione.
Nota aggiuntiva: se hai disabilitato IPv6 sul tuo server Debian, Unbound non potrà avviarsi. Per risolvere questo problema, puoi aggiungere il parametro 'do-ip6: no' alla sezione 'server' nel file di configurazione non associato '/etc/unbound/ unbound.conf'.
Con Unbound installato, inizierai a configurare Unbound sul tuo sistema.
Configurazione del server DNS non associato
La configurazione Unbound predefinita si trova in "/etc/unbound/unbound.conf". In questo passaggio, modificherai il file di configurazione principale di Unbound "/etc/unbound.conf" tramite il tuo editor preferito.
Ora imparerai la configurazione di base di un server DNS non associato.
Configurazione di base
Apri il file di configurazione Unbound predefinito '/etc/unbound/unbound.conf' utilizzando il tuo editor preferito. Questo esempio utilizza nano per modificare il file di configurazione '/etc/unbound/unbound.conf'.
sudo nano /etc/unbound/unbound.conf
Aggiungi le seguenti righe al file. Puoi impostare configurazioni di base non associate nella sezione "server". In questo esempio, eseguirai Unbound sull'indirizzo IP locale '192.168.5.20' con la porta predefinita 53. Inoltre, configurerai la registrazione sui messaggi Syslog e disabiliterai IPv6. Infine, configurerai Unbound per interrogare ricorsivamente qualsiasi nome host dai server DNS root tramite il file "root-hints".
#Adding DNS-Over-TLS support
server:
use-syslog: yes
username: "unbound"
directory: "/etc/unbound"
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
do-ip6: no
interface: 192.168.5.20
port: 53
prefetch: yes
root-hints: /usr/share/dns/root.hints
harden-dnssec-stripped: yes
Parametri di dettaglio:
- use-syslog: abilita la registrazione sui messaggi Syslog.
- nome utente: esegui come utente non associato, che è l'utente predefinito.
- directory: la directory di lavoro predefinita per Unbound è la directory '/etc/unbound'.
- tls-cert-bundle: certificati utilizzati per autenticare le connessioni effettuate a monte. Nella distribuzione basata su Debian, il file del certificato si trova in '/etc/ssl/certs/ca-certificates.crt'.
- do-ip6: utilizza "sì" per eseguire Unbound con IPv6 o imposta "no" per disabilitare IPv6.
- interfaccia: l'interfaccia di rete o l'indirizzo IP non associato verrà eseguito. Puoi utilizzare un indirizzo IP o il nome dell'interfaccia come "eth0". Inoltre, puoi eseguire l'esecuzione in una porta specifica aggiungendo un formato come questo "INDIRIZZO IP@PORTA".
- porta: specifica la porta su cui verrà eseguito Unbound e le connessioni del client verranno gestite da questa porta. La porta DNS predefinita è 53.
- prelettura: imposta su "sì" per abilitare la prelettura delle voci della cache dei messaggi quasi scaduti.
- root-hints: un file che contiene i dettagli del server DNS root. Il file '/usr/share/dns/root.hints' è fornito dal pacchetto 'dns-root-data'. Inoltre, puoi scaricare il file root-hints da qui "https://www.internic.net/domain/named.cache".
- harden-dnssec-stripped: impostalo su "sì" per rafforzare la protezione contro la ricezione di dati privati di DNSsec.
Abilita cache DNS
Successivamente, aggiungi le seguenti righe per abilitare la query della cache DNS sull'installazione non associata.
cache-max-ttl: 14400
cache-min-ttl: 1200
Parametri di dettaglio:
- cache-max-ttl: TTL o Time To Live per RRSets e messaggi nella cache DNS. Il formato è in secondi.
- cache-min-ttl: Time To Live minimo per la cache. Il valore predefinito è 0, ma puoi modificarlo a tuo piacimento, ad esempio "1200" secondi. Non impostarlo per più di 1 ora o potresti avere problemi a causa di dati non aggiornati.
Privacy e sicurezza illimitate
Ora puoi aggiungere le seguenti righe per configurare la privacy e la sicurezza di base per Unbound.
aggressive-nsec: yes
hide-identity: yes
hide-version: yes
use-caps-for-id: yes
Parametri di dettaglio:
- aggressive-nsec: impostato su "yes" per abilitare NSEC aggressivo, che utilizza la catena NSEC DNSSEC per sintetizzare NXDOMAIN e altri rifiuti. Controlla la pagina web IETF su 'NSEC' https://www.ietf.org/archive/id/draft-ietf-dnsop-nsec-ttl-00.html.
- hide-identity: imposta su sì per disabilitare le risposte dalle query di associazione su id.server o hostname.bind.
- hide-version: imposta su sì per disabilitare le query version.server e version.bind.
- use-caps-for-id: imposta su sì per abilitare l'uso di "0x20-encoded" nella query per sventare i tentativi di spoofing.
Definire la rete privata e gli elenchi di controllo degli accessi (ACL)
Successivamente, devi definire l'indirizzo privato delle tue reti e gli ACL (Elenchi di controllo degli accessi). Modifica la sottorete locale nelle righe seguenti con il tuo attuale ambiente di rete.
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
#control which clients are allowed to make (recursive) queries
access-control: 127.0.0.1/32 allow_snoop
access-control: ::1 allow_snoop
access-control: 127.0.0.0/8 allow
access-control: 192.168.5.0/24 allow
Parametri di dettaglio:
- indirizzo-privato: definisci le sottoreti della rete privata sulla tua infrastruttura. Solo i nomi "dominio-privato" e "dati-locali" possono avere questi indirizzi privati.
- controllo degli accessi: definisce il controllo degli accessi in cui i client possono effettuare query (ricorsive) al server non associato. Il parametro "allow" abiliterà il ricorsivo, mentre "allow_snoop" abiliterà sia il ricorsivo che il non ricorsivo.
Imposta dominio locale
Dopo aver configurato gli elenchi di indirizzi privati e di controllo degli accessi, definirai ora la zona locale per il tuo nome di dominio locale. Questo è molto utile, soprattutto se hai più applicazioni self-hosted sulla tua rete locale. Puoi facilmente definire il tuo nome di dominio o sottodomini e puntare all'indirizzo IP di destinazione specifico.
In questo esempio creerai la zona per il dominio 'garden.lan' con il tipo 'static', quindi creerai più sottodomini tramite il metodo 'local-data 'parametro. Ogni sottodominio verrà indirizzato a un indirizzo IP specifico e inoltre creerai record PTR tramite il parametro "local-data-ptr".
# local zone
local-zone: "garden.lan." static
local-data: "firewall.garden.lan. IN A 10.0.0.1"
local-data: "vault.garden.lan. IN A 10.0.0.2"
local-data: "media.garden.lan. IN A 10.0.0.3"
local-data: "docs.garden.lan. IN A 10.0.0.4"
local-data: "wiki.garden.lan. IN A 10.0.0.5"
local-data-ptr: "10.0.0.1 firewall.garden.lan"
local-data-ptr: "10.0.0.2 vault.garden.lan"
local-data-ptr: "10.0.0.3 media.garden.lan"
local-data-ptr: "10.0.0.4 docs.garden.lan"
local-data-ptr: "10.0.0.5 wiki.garden.lan"
Parametri di dettaglio:
- local-zone: definisci qui il dominio locale.
- local-data: definisce un record per i sottodomini e quale indirizzo IP locale verrà risolto.
- local-data-ptr: definisci il record ptr per i tuoi sottodomini.
Ottimizzazione e modifica delle prestazioni illimitate
Aggiungi le seguenti righe per ottenere maggiori prestazioni. Puoi regolare i parametri seguenti con il tuo ambiente attuale.
num-threads: 4
msg-cache-slabs: 8
rrset-cache-slabs: 8
infra-cache-slabs: 8
key-cache-slabs: 8
rrset-cache-size: 256m
msg-cache-size: 128m
so-rcvbuf: 8m
Parametri di dettaglio:
- num-thread: il numero di thread che verranno creati. Il valore deve corrispondere ai core della CPU del server.
- msg-cache-slabs: il numero di plates da utilizzare per la cache dei messaggi. Impostalo su 8 per ottimizzare Unbound per utilizzare più memoria per la memorizzazione nella cache.
- rrset-cache-slabs: il numero di plates da utilizzare per la cache RRset. Impostarlo su 8 per ottimizzare Unbound per utilizzare più memoria per la cache RRSet.
- infra-cache-slabs: il numero di lastre da utilizzare per la cache dell'infrastruttura. Impostalo su 8 per ottimizzare Unbound per utilizzare più memoria per la cache dell'infrastruttura.
- key-cache-slabs: il numero di plates da utilizzare per la cache delle chiavi. Impostalo su 8 per ottimizzare Unbound per utilizzare più memoria per la cache delle chiavi.
- rrset-cache-size: specifica la quantità di memoria per la cache RRSet. Questo esempio utilizza 256 MB, mentre il valore predefinito è solo 4 MB.
- msg-cache-size: specifica la quantità di memoria per la cache dei messaggi. Questo esempio utilizza 128 MB, mentre il valore predefinito è solo 4 MB.
- so-rcvbuf: imposta la dimensione del buffer per la porta DNS 53/udp su 8 MB.
Configurazione non associata come risolutore DNS con DNS-over-TLS (DoT)
Infine, aggiungi una nuova sezione "forward-zone" per configurare Unbound come risolutore DNS per le tue reti locali. In questo esempio vengono utilizzati server DNS Quad9 con DoT (DNS-over-TLS) abilitato.
forward-zone:
name: "."
forward-ssl-upstream: yes
## Also add IBM IPv6 Quad9 over TLS
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 149.112.112.112@853#dns.quad9.net
Dettagli parametri:
- forward-zone: definisce la zona forward per Unbound.
- nome: imposta su "." per inoltrare tutte le query DNS.
- forward-addr: utilizza un forwarder specifico per inoltrare tutte le query DNS. In questo esempio viene utilizzato Quad9 DNS con DNS-over-TLS (DoT) abilitato.
Una volta terminato, salvare ed uscire dal file '/etc/unbound/unbound.conf'. Con il file di configurazione Unbound modificato, ora puoi riavviare il servizio Unbound e applicare le modifiche.
Esegui il comando seguente e verifica la configurazione non associata. In caso di successo, dovresti ottenere un output come 'unbound-checkconf: no error in /etc/unbound/unbound.conf'.
sudo unbound-checkconf
Successivamente, esegui il comando systemctl riportato di seguito per riavviare il servizio Unbound e applicare le modifiche.
sudo systemctl restart unbound
Ora che hai terminato le configurazioni non associate, configurerai il firewall UFW e aprirai la porta DNS predefinita 53.
Configurazione del firewall UFW
In questo passaggio configurerai il firewall UFW sul server Debian e aprirai la porta DNS 53/udp. Ma prima devi installare i pacchetti UFW dal repository Debian tramite APT.
Esegui il comando apt seguente per installare il firewall UFW sul tuo server Debian. Immettere y quando richiesto e premere INVIO per procedere.
sudo apt install ufw
Produzione :
Una volta installato UFW, devi aprire il servizio OpenSSH su UFW tramite il comando seguente. Quindi puoi aggiungere la porta DNS53/udp al firewall UFW.
sudo ufw allow OpenSSH
sudo ufw allow 53/udp
Successivamente, esegui il comando seguente per avviare e abilitare il servizio firewall UFW. Quando richiesto, inserire y per confermare e premere INVIO per procedere.
sudo ufw enable
L'output 'Il firewall è attivo e abilitato all'avvio del sistema' conferma che il firewall UFW è in esecuzione ed è abilitato, il che significa che il firewall UFW si avvia automaticamente all'avvio del sistema.
Produzione :
Ora esegui il comando ufw seguente per verificare lo stato del firewall UFW. Dovresti ricevere un output che indica che lo stato UFW è 'attivo' con il servizio OpenSSH e la porta DNS53/udp abilitata.
sudo ufw status
Produzione :
Log non associato tramite Rsyslog e Logrotate
Dopo aver configurato il firewall UFW, imposterai ora un file di registro per Unbound tramite rsyslog e logrotate. Il servizio rsyslog creerà un file di registro specifico per Unbound e il logrotate ruoterà il file di registro Unbound in un determinato periodo di tempo.
Crea un nuovo file di configurazione Rsyslog '/etc/rsyslog.d/unbound.conf' utilizzando il comando dell'editor nano riportato di seguito.
sudo nano /etc/rsyslog.d/unbound.conf
Aggiungi le seguenti righe al file. In questo modo, i log non associati verranno archiviati in '/var/log/unbound.log'.
# Log messages generated by unbound application
if $programname == 'unbound' then /var/log/unbound.log
# stop processing it further
& stop
Salvare il file e uscire dall'editor una volta terminato.
Ora esegui l'utilità di comando systemctl seguente per riavviare il servizio "rsyslog" e applicare le modifiche.
sudo systemctl restart rsyslog
Successivamente, imposterai la rotazione dei log per il file di log non associato '/var/log/unbound.log'. E puoi raggiungere questo obiettivo tramite il servizio logrotate.
Crea un nuovo file di configurazione logrotate '/etc/logrotate.d/unbound' utilizzando il comando dell'editor nano riportato di seguito.
sudo nano /etc/logrotate.d/unbound
Aggiungi le seguenti righe al file. Ciò creerà una rotazione giornaliera del log per il file di log non associato '/var/log/unbound.log'.
/var/log/unbound.log {
daily
rotate 7
missingok
create 0640 root adm
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Salvare il file e uscire dall'editor una volta terminato.
Ora esegui l'utilità di comando systemctl seguente per riavviare il servizio logrotate e applicare le modifiche.
sudo systemctl restart logrotate
Con questo, ora hai installato e configurato con successo il server DNS non associato e configurato la registrazione tramite Rsyslog e Logrotate. I log non associati verranno salvati nel file '/var/unbound/unbound.log'.
Impostazione del risolutore DNS sul client Linux
In questo passaggio imparerai come configurare un risolutore DNS sui computer client. Questo ti mostrerà due metodi per diverse distribuzioni Linux.
Per i client Ubuntu: la rete su Ubuntu è gestita da NetworkManager. Per impostare un risolutore DNS, puoi combinare NetworkManager con systemd-resolved come backend.
Per i client Debian: sui sistemi Debian (versione minima), la rete è gestita dal tradizionale file di configurazione '/etc/network/ interfaccia'. È possibile definire la directory del risolutore DNS nel file '/etc/network/interface' o utilizzare il servizio risolto da systemd, che è disponibile per impostazione predefinita sul server Debian.
Per client Ubuntu con NetworkManager e risoluzione Systemd
Questo è per gli utenti Ubuntu che utilizzano NetworkManager come configurazione di rete predefinita. Configurerai systemd-resolved come backend per il server DNS su NetworkManager.
Apri il file '/etc/NetworkManager/NetworkManager.conf' utilizzando il comando dell'editor nano riportato di seguito.
sudo nano /etc/NetworkManager/NetworkManager.conf
Togli il commento dal parametro "dns" e aggiungi il backend come "risolto da systemd".
dns=systemd-resolved
Salvare ed uscire dal file una volta terminato.
Ora esegui il comando systemctl seguente per riavviare il servizio NetworkManager e applicare le modifiche.
sudo systemctl restart NetworkManager
Successivamente, definirai il DNS locale non associato in systemd-resolved.
Apri il file di configurazione risolto da systemd '/etc/systemd/resolved.conf' utilizzando il comando dell'editor nano riportato di seguito.
sudo nano /etc/systemd/resolved.conf
Nella sezione "[Risolvi]", rimuovi il commento dal parametro "DNS" e inserisci l'indirizzo IP del tuo server DNS non associato.
[Resolve]
DNS= 192.168.5.20
Salvare ed uscire dal file una volta terminato.
Successivamente, esegui il comando systemctl riportato di seguito per avviare e abilitare il servizio 'systemd-resolved'.
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolved
Ora verifica lo stato del servizio 'systemd-resolved' tramite il comando seguente. Dovresti vedere che systemd-resolved è abilitato e verrà eseguito automaticamente all'avvio del sistema. E lo stato del servizio 'systemd-resolved' è ora in esecuzione.
sudo systemctl status systemd-resolved
Puoi anche verificare la configurazione del tuo risolutore DNS tramite il comando 'resolvectl' di seguito. Dovresti vedere che il risolutore predefinito è il tuo server DNS non associato con indirizzo IP "192.168.5.20".
resolvectl status
Per i client Debian
Per il sistema Debian, puoi anche utilizzare il servizio systemd-resolved per impostare un risolutore DNS.
Apri il file di configurazione risolto da systemd '/etc/systemd/resolved.conf' utilizzando il nano editor riportato di seguito.
sudo nano /etc/systemd/resolved.conf
Aggiungi il parametro 'DNS' seguito dall'indirizzo IP del server non associato alla sezione '[Resolver]'.
[Resolve]
DNS=192.168.5.20
Salvare il file e uscire dall'editor una volta terminato.
Ora esegui il comando systemctl seguente per avviare e abilitare il servizio risolto da systemd.
sudo systemctl start systemd-resolved
sudo systemctl enable systemd-resolved
Produzione :
Quindi, verifica lo stato del servizio risolto da systemd per assicurarti che sia in esecuzione. L'output 'active (running)' conferma che systemd-resolved è in esecuzione e l'output 'loaded ../../../systemd-resolved.service; abilitato;..' conferma che il servizio è abilitato.
sudo systemctl status systemd-resolved
Produzione :
Puoi verificare la configurazione del tuo risolutore DNS tramite il comando 'resolvectl' di seguito. Dovresti vedere che il risolutore predefinito è il tuo server DNS non associato con indirizzo IP "192.168.5.20".
resolvectl status
Produzione :
Test del server DNS non associato
Esegui il comando dig riportato di seguito per assicurarti che il DNS non associato funzioni come un risolutore DNS. Il parametro '@192.168.5.20' garantisce che stai utilizzando un server DNS non associato che viene eseguito sull'indirizzo IP "192.168.5.20".
dig @192.168.5.20
In caso di successo, riceverai una risposta dal server DNS root come l'output seguente. Inoltre, noterai il flag "annuncio" (dati autentici) nell'output dell'intestazione, il che significa che DNSSEC è abilitato.
Successivamente, esegui il comando seguente per assicurarti che i clienti possano accedere ai nomi di dominio online.
dig github.com
dig duckduckgo.com
In caso di esito positivo, dovresti ricevere un record DNS con i dettagli di output per il dominio "github.com" e "duckduckgo.com". Puoi vedere che il risolutore DNS che risponde alla query è '127.0.0.53#53', che è il risolutore systemd che utilizza Unbound come risolutore predefinito. Inoltre, puoi vedere il "Tempo della query" per ciascuna query, il "Tempo della query" per il dominio "github.com" è "1367" e "duckduckgo.com" è "1059".
Output per github.com:
Uscita per duckduckgo.com:
Se esegui nuovamente il comando dig in alto, il 'Tempo di query' dovrebbe essere ridotto. E questo conferma che le tue query sono state memorizzate nella cache e che la cache DNS funziona.
dig github.com
dig duckduckgo.com
Produzione :
Successivamente, verifica il dominio locale o il sottodominio tramite il comando dig riportato di seguito. In caso di successo, ogni sottodominio verrà indirizzato all'indirizzo IP corretto come configurato nel file di configurazione Unbound '/etc/unbound/unbound.conf'.
dig firewall.garden.lan +short
dig vault.garden.lan +short
dig media.garden.lan +short
Produzione :
Ora esegui il comando dig riportato di seguito per assicurarti che i record PTR puntino al nome di dominio corretto.
dig -x 10.0.0.1 +short
dig -x 10.0.0.2 +short
dig -x 10.0.0.3 +short
Produzione :
Infine, puoi anche verificare DoT (DNS su TLS) tramite tcpdump. Installa il pacchetto 'tcpdump' sul tuo server non associato.
sudo apt install tcpdump
Immettere y quando richiesto e premere INVIO per procedere.
Ora esegui il comando tcpdump riportato di seguito per monitorare i traffici sull'interfaccia 'eth0' con la porta DoT 853. In questo esempio, il DNS non associato viene eseguito sull'indirizzo IP "192.168.5.20" con l'interfaccia "eth0".
tcpdump -vv -x -X -s 1500 -i eth0 'port 853'
Passare al computer client ed eseguire il comando seguente per accedere ai nomi di dominio esterni/Internet tramite il comando dig riportato di seguito.
dig google.com
Produzione :
Successivamente, torna al server Unbound e ora dovresti ottenere un output simile a questo sull'output tcpdump.
Con questo, ora hai installato e configurato il server DNS locale tramite Unbound. Inoltre, hai configurato un risolutore DNS sui client Ubuntu tramite systemd-resolved e NetworkManager e sui client Debian tramite systemd-resolved.
Conclusione
In questa guida hai installato il server DNS locale non associato su un server Debian 11. Hai abilitato la cache DNS, DNSSEC (abilitato per impostazione predefinita), configurato l'indirizzo privato e gli ACL, aggiunto il dominio locale tramite zona locale, quindi configurato Unbound come risolutore DNS con DoT (DNS-over-TLS).
In aggiunta a ciò, hai configurato la privacy e la sicurezza DNS di base, ottimizzato Unbound e configurato i log Unbound tramite rsyslog e logrotate.
Alla fine di questa guida, hai anche imparato come impostare un risolutore DNS su macchine Ubuntu e Debian tramite NetworkManager e systemd-resolved. E ho anche imparato l'utilizzo di base del comando dig per controllare il server DNS.