109.4 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
109 Fondamenti di Networking |
Obiettivo: |
109.4 Configurare un client DNS |
Lezione: |
1 di 1 |
Introduzione
Questa lezione si concentra sulla configurazione della risoluzione dei nomi lato client e sull’uso di alcuni strumenti CLI per la risoluzione dei nomi.
Ricordarsi e mantenere a memoria indirizzi IP, UID e GID e altri numeri è una strada decisamente impraticabile. I servizi di risoluzione dei nomi traducono nomi facili da ricordare in numeri e viceversa. Questa lezione si concentra sulla risoluzione dei nomi degli host, ma un processo simile avviene per i nomi degli utenti, i nomi dei gruppi, i numeri delle porte e molto altro ancora.
Il Processo di Risoluzione dei Nomi
I programmi che risolvono i nomi in numeri usano quasi sempre funzioni fornite da una specifica libreria C standard, che sui sistemi Linux è la glibc
del progetto GNU. La prima cosa che queste funzioni fanno è leggere il file /etc/nsswitch.conf
per avere istruzioni su come risolvere un certo tipo di nome. Questa lezione è focalizzata sulla risoluzione dei nomi host, ma lo stesso processo si applica anche ad altri tipi di risoluzione dei nomi. Una volta che il processo legge /etc/nsswitch.conf
, cerca il nome nel modo specificato. Poiché /etc/nsswitch.conf
supporta i plugin, ciò che segue potrebbe essere particolarmente specifico. Dopo che la funzione ha finito di cercare il nome o il numero, restituisce il risultato al processo chiamante.
Le Classi DNS
DNS ha tre classi di record: IN, HS e CH. In questa lezione, tutte le query DNS saranno di tipo IN. La classe IN è per gli indirizzi Internet che usano lo stack TCP/IP. CH sta per ChaosNet, che è una tecnologia di rete che ha avuto vita breve e non è più in uso. La classe HS corrisponde a Hesiod. Hesiod è un modo per memorizzare elementi quali voci di passwd e di group nel DNS. Hesiod va oltre lo scopo di questa lezione.
Comprendere /etc/nsswitch.conf
Il modo migliore per conoscere questo file è leggere la pagina man
che fa parte del progetto Linux man-pages e che è disponibile sulla maggior parte delle distribuzioni. Vi si può accedere con il comando man nsswitch.conf
. In alternativa, può essere trovato su https://man7.org/linux/man-pages/dir_section_5.html
Ecco di seguito un semplice esempio di /etc/nsswitch.conf
dalla sua pagina man:
passwd: compat group: compat shadow: compat hosts: dns [!UNAVAIL=return] files networks: nis [NOTFOUND=return] files ethers: nis [NOTFOUND=return] files protocols: nis [NOTFOUND=return] files rpc: nis [NOTFOUND=return] files services: nis [NOTFOUND=return] files # This is a comment. It is ignored by the resolution functions.
Il file è organizzato in colonne. La colonna all’estrema sinistra è il tipo di database dei nomi. Il resto delle colonne riporta i metodi che le funzioni di risoluzione dovrebbero usare per cercare un nome. I metodi sono seguiti dalle funzioni, da sinistra a destra. Le colonne con []
sono usate per fornire una logica condizionale limitata alla colonna immediatamente a sinistra.
Supponiamo che un processo stia cercando di risolvere il nome host learning.lpi.org
con una chiamata appropriata alla libreria C (molto probabilmente gethostbyname
). Questa funzione leggerà poi /etc/nsswitch.conf
. Poiché il processo sta cercando un nome di host, troverà la linea che inizia con hosts
. Quindi tenterà di usare il DNS per risolvere il nome. La colonna successiva, [!UNAVAIL=return]
significa che se il servizio non è indisponibile, allora non proverà metodi ulteriori. Se il DNS non è disponibile, allora continua con la fonte successiva. In questo caso, la fonte successiva è files
.
Quando vedi una colonna nel formato [result=action]
, significa che quando una ricerca del resolver della colonna a sinistra di essa è result
, allora viene eseguita action
. Se result
è preceduto da un !
, significa che se il risultato non è result
, allora viene eseguita action
. Per le descrizioni dei possibili risultati e azioni, vedi la pagina man
.
Supponiamo ora che un processo stia cercando di risolvere un numero di porta in un nome di servizio: leggerà la linea services
. La prima fonte elencata è NIS. NIS sta per Network Information Service (a volte ci si riferisce al NIS come alle yellow pages, le pagine gialle). È un vecchio servizio che permetteva la gestione centrale di oggetti come per esempio gli utenti. Viene usato raramente a causa della sua scarsa sicurezza. La prossima colonna [NOTFOUND=return]
indica se la ricerca ha avuto successo ma il servizio non è stato trovato, si deve smettere di cercare. Se la condizione di cui sopra non si applica, usa i file locali.
Qualsiasi cosa a destra di #
è un commento e viene ignorato.
Il File /etc/resolv.conf
Il file /etc/resolv.conf
è usato per configurare la risoluzione degli host tramite DNS. Alcune distribuzioni hanno script di avvio, demoni e altri strumenti che scrivono su questo file. Tienilo a mente quando lo modifichi manualmente. Controlla la documentazione della distribuzione e di qualsiasi strumento di configurazione di rete. Alcuni strumenti, come Network Manager, lasceranno un commento nel file per farti sapere che le modifiche manuali saranno sovrascritte.
Come per /etc/nsswitch.conf
, c’è una pagina man
associata al file. Vi si può accedere con il comando man resolv.conf
o su https://man7.org/linux/man-pages/man5/resolv.conf.5.html.
Il formato del file è piuttosto semplice. Nella colonna all’estrema sinistra c’è l’opzione name
. Il resto delle colonne sulla stessa linea è il valore dell’opzione.
L’opzione più comune è l’opzione nameserver
. È usata per specificare l’indirizzo IPv4 o IPv6 di un server DNS. A oggi è possibile specificare fino a tre server di nomi. Se il tuo /etc/resolv.conf
non ha un’opzione nameserver
, il tuo sistema userà di default il name server della macchina locale.
Qui sotto c’è un semplice file di esempio che è rappresentativo delle configurazioni più comuni:
search lpi.org nameserver 10.0.0.53 nameserver fd00:ffff::2:53
L’opzione search
è usata per permettere ricerche in forma breve. Nell’esempio, è configurato un singolo dominio di ricerca di lpi.org
. Questo significa che ogni tentativo di risolvere un nome host senza una porzione di dominio avrà .lpi.org
aggiunto prima della ricerca. Per esempio, se dovessi provare a cercare un host chiamato learning
, il resolver cercherà learning.lpi.org
. Puoi avere fino a sei domini di ricerca configurati.
Un’altra opzione comune è l’opzione domain
. Questa è usata per impostare il tuo nome di dominio locale. Se questa opzione non è presente, il default è tutto ciò che segue dopo il primo .
nel nome host della macchina. Se il nome dell’host non contiene un .
, si presume che la macchina faccia parte del dominio principale. Come search
, domain
può essere usato per ricerche di nomi brevi.
Tieni presente che domain
e search
si escludono a vicenda. Se entrambi sono presenti, viene usata l’ultima opzione dichiarata nel file.
Ci sono diverse opzioni che possono essere impostate per influenzare il comportamento del resolver. Per impostarle, usa la parola chiave options
, seguita dal nome dell’opzione da impostare e, se applicabile, da un :
seguito dal valore. Qui sotto c’è un esempio di impostazione dell’opzione timeout, che è la quantità di tempo in secondi che il resolver aspetterà dopo aver contattato un server di nomi prima di rinunciare:
option timeout:3
Ci sono altre opzioni in resolv.conf
, ma queste sono le più comuni.
Il FIle /etc/hosts
Il file /etc/hosts
è usato per risolvere i nomi in indirizzi IP e viceversa. Sono supportati sia IPv4 che IPv6. La colonna di sinistra è l’indirizzo IP, il resto sono nomi associati a quell’indirizzo. L’uso più comune di /etc/hosts
è per gli host e gli indirizzi dove il DNS non è possibile, come gli indirizzi di loopback. Nell’esempio qui sotto, sono definiti gli indirizzi IP di componenti di infrastrutture critiche.
Ecco un esempio realistico di un file /etc/hosts
:
127.0.0.1 localhost 127.0.1.1 proxy ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters 10.0.0.1 gateway.lpi.org gateway gw fd00:ffff::1 gateway.lpi.org gateway gw 10.0.1.53 dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org 10.0.2.53 dns2.lpi.org fd00:ffff::2:53 dns2.lpi.org
systemd-resolved
Systemd fornisce un servizio chiamato systemd-resolved
. Fornisce mDNS, DNS e LLMNR. Quando è in esecuzione, ascolta le richieste DNS su 127.0.0.53
. Non fornisce un server DNS completo. Qualsiasi richiesta DNS che riceve viene cercata interrogando i server configurati in /etc/systemd/resolv.conf
o /etc/resolv.conf
. Se lo vuoi utilizzare, usa resolve
per hosts
in /etc/nsswitch.conf
. Tieni presente che il pacchetto del sistema operativo che ha la libreria systemd-resolved
potrebbe non essere installato di default.
Strumenti per la Risoluzione dei Nomi
Ci sono molti strumenti disponibili agli utenti Linux per la risoluzione dei nomi. Questa lezione ne tratta tre. Uno, getent
, è utile per vedere come le richieste del mondo reale vengono risolte. Un altro è il comando host
, che è utile per semplici query DNS. Il terzo strumento è un programma chiamato dig
, utile per operazioni DNS complesse che possono aiutare nella risoluzione delle problematiche relative ai server DNS.
Il Comando getent
L’utilità getent
è usata per visualizzare le voci dai database del servizio dei nomi. Può recuperare record da qualsiasi fonte configurabile in /etc/nsswitch.conf
.
Per usare getent
, segui il comando con il tipo di nome che vuoi risolvere; come opzione puoi aggiungere una voce specifica da cercare. Se si specifica solo il tipo di nome, getent
tenterà di visualizzare tutte le voci di quel tipo di dati:
$ getent hosts 127.0.0.1 localhost 127.0.1.1 proxy 10.0.1.53 dns1.lpi.org 10.0.2.53 dns2.lpi.org 127.0.0.1 localhost ip6-localhost ip6-loopback $ getent hosts dns1.lpi.org fd00:ffff::1:53 dns1.lpi.org
A partire dalla versione 2.2.5 di glibc, puoi forzare getent
a usare una specifica sorgente di dati tramite l’opzione -s
. L’esempio qui sotto lo dimostra:
$ getent -s files hosts learning.lpi.org ::1 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
Il Comando host
host
è un semplice programma per cercare voci DNS. Senza opzioni, se viene dato un nome a host
, restituisce i record A, AAAA e MX. Se viene dato un indirizzo IPv4 o IPv6, restituisce il record PTR se disponibile:
$ host wikipedia.org wikipedia.org has address 208.80.154.224 wikipedia.org has IPv6 address 2620:0:861:ed1a::1 wikipedia.org mail is handled by 10 mx1001.wikimedia.org. wikipedia.org mail is handled by 50 mx2001.wikimedia.org. $ host 208.80.154.224 224.154.80.208.in-addr.arpa domain name pointer text-lb.eqiad.wikimedia.org.
Se stai cercando un tipo di record specifico, puoi usare host -t
:
$ host -t NS lpi.org lpi.org name server dns1.easydns.com. lpi.org name server dns3.easydns.ca. lpi.org name server dns2.easydns.net. $ host -t SOA lpi.org lpi.org has SOA record dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
host
può anche essere usato per interrogare uno specifico name server se non si desidera usare quelli in /etc/resolv.conf
. Aggiungi semplicemente l’indirizzo IP o il nome dell’host del server che vuoi usare come ultimo argomento:
$ host -t MX lpi.org dns1.easydns.com Using domain server: Name: dns1.easydns.com Address: 64.68.192.10#53 Aliases: lpi.org mail is handled by 10 aspmx4.googlemail.com. lpi.org mail is handled by 10 aspmx2.googlemail.com. lpi.org mail is handled by 5 alt1.aspmx.l.google.com. lpi.org mail is handled by 0 aspmx.l.google.com. lpi.org mail is handled by 10 aspmx5.googlemail.com. lpi.org mail is handled by 10 aspmx3.googlemail.com. lpi.org mail is handled by 5 alt2.aspmx.l.google.com.
Il Comando dig
Un altro strumento per interrogare i server DNS è dig
. Questo comando è molto più verboso di host
. Per impostazione predefinita, dig
interroga i record A. Probabilmente è anche troppo verboso per cercare semplicemente un indirizzo IP o un nome host. dig
funzionerà per semplici ricerche, ma è più adatto per la risoluzione dei problemi di configurazione dei server DNS:
$ dig learning.lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> learning.lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63004 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: ca7a415be1cec45592b082665ef87f3483b81ddd61063c30 (good) ;; QUESTION SECTION: ;learning.lpi.org. IN A ;; ANSWER SECTION: learning.lpi.org. 600 IN A 208.94.166.198 ;; AUTHORITY SECTION: lpi.org. 86400 IN NS dns2.easydns.net. lpi.org. 86400 IN NS dns1.easydns.com. lpi.org. 86400 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 172682 IN A 64.68.192.10 dns2.easydns.net. 170226 IN A 198.41.222.254 dns1.easydns.com. 172682 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 170226 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 135 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 07:29:56 EDT 2020 ;; MSG SIZE rcvd: 266
Come puoi vedere, dig
fornisce molte informazioni. L’output è diviso in sezioni. La prima sezione mostra informazioni sulla versione di dig
installata e sulla query inviata, insieme a qualsiasi opzione usata per il comando. Poi mostra informazioni sulla query e sulla risposta.
La prossima sezione mostra le informazioni sulle estensioni EDNS utilizzate e la query. Nell’esempio, viene usata l’estensione cookie. dig
sta cercando un record A per learning.lpi.org
.
La sezione successiva mostra il risultato della query. Il numero nella seconda colonna è il TTL della risorsa in secondi.
Il resto dell’output fornisce informazioni sui name server del dominio, compresi i record NS per il server insieme ai record A e AAAA dei server nel record NS del dominio.
Come host
puoi specificare un tipo di record con l’opzione -t
:
$ dig -t SOA lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> -t SOA lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16695 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 6 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 185c67140a63baf46c4493215ef8906f7bfbe15bdca3b01a (good) ;; QUESTION SECTION: ;lpi.org. IN SOA ;; ANSWER SECTION: lpi.org. 600 IN SOA dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300 ;; AUTHORITY SECTION: lpi.org. 81989 IN NS dns1.easydns.com. lpi.org. 81989 IN NS dns2.easydns.net. lpi.org. 81989 IN NS dns3.easydns.ca. ;; ADDITIONAL SECTION: dns1.easydns.com. 168271 IN A 64.68.192.10 dns2.easydns.net. 165815 IN A 198.41.222.254 dns3.easydns.ca. 107 IN A 64.68.196.10 dns1.easydns.com. 168271 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 165815 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 94 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Sun Jun 28 08:43:27 EDT 2020 ;; MSG SIZE rcvd: 298
dig
ha molte opzioni per mettere a punto sia l’output sia la query inviata al server. Queste opzioni iniziano con +
. Una tra queste è l’opzione short
, che sopprime tutti gli output tranne il risultato:
$ dig +short lpi.org 65.39.134.165 $ dig +short -t SOA lpi.org dns1.easydns.com. zone.easydns.com. 1593109612 3600 600 1209600 300
Ecco un esempio di disattivazione dell’estensione cookie EDNS:
$ dig +nocookie -t MX lpi.org ; <<>> DiG 9.11.5-P4-5.1+deb10u1-Debian <<>> +nocookie -t MX lpi.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47774 ;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 3, ADDITIONAL: 5 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;lpi.org. IN MX ;; ANSWER SECTION: lpi.org. 468 IN MX 0 aspmx.l.google.com. lpi.org. 468 IN MX 10 aspmx4.googlemail.com. lpi.org. 468 IN MX 10 aspmx5.googlemail.com. lpi.org. 468 IN MX 10 aspmx2.googlemail.com. lpi.org. 468 IN MX 10 aspmx3.googlemail.com. lpi.org. 468 IN MX 5 alt2.aspmx.l.google.com. lpi.org. 468 IN MX 5 alt1.aspmx.l.google.com. ;; AUTHORITY SECTION: lpi.org. 77130 IN NS dns2.easydns.net. lpi.org. 77130 IN NS dns3.easydns.ca. lpi.org. 77130 IN NS dns1.easydns.com. ;; ADDITIONAL SECTION: dns1.easydns.com. 76140 IN A 64.68.192.10 dns2.easydns.net. 73684 IN A 198.41.222.254 dns1.easydns.com. 76140 IN AAAA 2400:cb00:2049:1::a29f:1835 dns2.easydns.net. 73684 IN AAAA 2400:cb00:2049:1::c629:defe ;; Query time: 2 msec ;; SERVER: 192.168.1.20#53(192.168.1.20) ;; WHEN: Mon Jun 29 10:18:58 EDT 2020 ;; MSG SIZE rcvd: 389
Esercizi Guidati
-
Qual è l’esito del comando seguente?
getent group openldap
-
Qual è la più grande differenza tra
getent
e gli altri strumenti trattati,host
edig
? -
Quale opzione di
dig
ehost
è usata per specificare il tipo di record che vuoi recuperare? -
Quale delle seguenti è una voce corretta di
/etc/hosts
?::1 localhost
localhost 127.0.0.1
-
Quale opzione di
getent
è usata per specificare quale fonte di dati deve essere usata per eseguire una ricerca?
Esercizi Esplorativi
-
Come opereresti per modificare il seguente
/etc/resolv.conf
con un editor di testo?# Generated by NetworkManager nameserver 192.168.1.20
Le modifiche saranno sovrascritte da NetworkManager.
NetworkManager aggiornerà la sua configurazione con le tue modifiche.
Le tue modifiche non influenzeranno il sistema.
NetworkManager sarà disabilitato.
-
Che cosa significa la seguente linea in
/etc/nsswitch.conf
?hosts: files [SUCCESS=continue] dns
-
Considerando il seguente
/etc/resolv.conf
, perché il sistema non risolve i nomi tramite DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
-
Qual è l’esito del comando
dig +noall +answer +question lpi.org
? -
Come si possono sovrascrivere i valori predefiniti di
dig
senza specificarli sulla linea di comando?
Sommario
Il comando getent
è un ottimo strumento per vedere i risultati delle chiamate al resolver. Per semplici query DNS, host
è facile da usare e produce un output diretto. Se hai bisogno di informazioni dettagliate o di mettere a punto una query DNS, dig
è molto probabilmente la scelta migliore.
Grazie all’abilità di aggiungere plugin di librerie condivise e configurare il comportamento del resolver, Linux ha un eccellente supporto per la risoluzione di nomi e numeri di vari tipi. Il programma getent
può essere usato per risolvere i nomi usando le librerie resolver. host
e dig
possono essere usati per interrogare i server DNS.
Il file /etc/nsswitch.conf
è usato per configurare il comportamento del resolver. Sei in grado di cambiare le fonti di dati e aggiungere una semplice logica condizionale per i tipi di nome con fonti multiple.
Il DNS è configurato modificando /etc/resolv.conf
. Molte distribuzioni hanno strumenti che gestiscono questo file per te, quindi assicurati di controllare la documentazione del tuo sistema se le modifiche manuali non persistono.
Il file /etc/hosts
è usato per risolvere i nomi degli host in IP e viceversa. È tipicamente usato per definire nomi, come localhost
, che non sono disponibili tramite DNS.
È possibile lasciare commenti nei file di configurazione trattati in questa lezione. Qualsiasi testo a destra di #
viene ignorato dal sistema.
Risposte agli Esercizi Guidati
-
Qual è l’esito del comando seguente?
getent group openldap
Leggerà
/etc/nsswitch.conf
, cercherà il gruppoopenldap
dalle fonti elencate e mostrerà informazioni su di esso se viene trovato. -
Qual è la più grande differenza tra
getent
e gli altri strumenti trattati,host
edig
?getent
cerca i nomi usando le librerie resolver, gli altri si limitano a interrogare il DNS.getent
può essere usato per risolvere i problemi del tuo/etc/nsswitch.conf
e la configurazione delle librerie di risoluzione dei nomi che il tuo sistema è configurato per usare.host
edig
sono usati per cercare i record DNS. -
Quale opzione di
dig
ehost
è usata per specificare il tipo di record che vuoi recuperare?Entrambi i programmi usano
-t
per specificare il tipo di record che vuoi cercare. -
Quale delle seguenti è una voce corretta di
/etc/hosts
?::1 localhost
X
localhost 127.0.0.1
::1 localhost
è la linea corretta. La colonna di sinistra è sempre un indirizzo IPv4 o IPv6. -
Quale opzione di
getent
è usata per specificare quale fonte di dati deve essere usata per eseguire una ricerca?L’opzione
-s
è usata per specificare l’origine dei dati. Per esempio:$ getent -s files hosts learning.lpi.org 192.168.10.25 learning.lpi.org $ getent -s dns hosts learning.lpi.org 208.94.166.198 learning.lpi.org
Risposte agli Esercizi Esplorativi
-
Come opereresti per modificare il seguente
/etc/resolv.conf
con un editor di testo?# Generated by NetworkManager nameserver 192.168.1.20
Le modifiche saranno sovrascritte da NetworkManager.
X
NetworkManager aggiornerà la sua configurazione con le tue modifiche.
Le tue modifiche non influenzeranno il sistema.
NetworkManager sarà disabilitato.
-
Che cosa significa la seguente linea in
/etc/nsswitch.conf
?hosts: files [SUCCESS=continue] dns
La ricerca dei nomi degli host controllerà prima il file
/etc/hosts
e poi i DNS. Se una voce trovata si trova sia nei file che nel DNS, verrà usata la voce nel DNS. -
Considerando il seguente
/etc/resolv.conf
perché il sistema non risolve i nomi tramite DNS?search lpi.org #nameserver fd00:ffff::1:53 #nameserver 10.0.1.53
Entrambi i server DNS sono commentati e non c’è alcun server DNS in esecuzione sull’host locale.
-
Qual è l’esito del comando
dig +noall +answer +question lpi.org
?Cerca il record A per
lpi.org
e mostra solo la query e la risposta. -
Come si possono sovrascrivere i valori predefiniti di
dig
senza specificarli sulla linea di comando?Crei un file
.digrc
nella tua home directory.