Bind: differenze tra le versioni
Wtf (discussione | contributi) mNessun oggetto della modifica |
Wtf (discussione | contributi) |
||
(18 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
{{Versioni compatibili}}{{Gateway-Router}} | {{Versioni compatibili}}{{Gateway-Router}} | ||
{{Box|Info|Questa guida è essenzialmente la parte dedicata a ''Bind'' della vecchia guida "''[[Un server DNS e DHCP su Debian]]''", ma privata delle istruzioni relative a Lenny e dei riferimenti a Squeeze}} | |||
== Introduzione == | == Introduzione == | ||
Riga 11: | Riga 13: | ||
: ''BIND (Berkeley Internet Name Domain, in precedenza Berkeley Internet Name Daemon) è il server DNS più usato su Internet, specialmente sui sistemi Unix e derivati, sui quali è lo standard di fatto'' | : ''BIND (Berkeley Internet Name Domain, in precedenza Berkeley Internet Name Daemon) è il server DNS più usato su Internet, specialmente sui sistemi Unix e derivati, sui quali è lo standard di fatto'' | ||
In poche parole un server dns è ciò che permette di contattare un qualsiasi server web digitando un indirizzo invece che il suo corrispondente indirizzo IP. | In poche parole un server dns è ciò che permette di contattare un qualsiasi server web digitando un indirizzo invece che il suo corrispondente indirizzo IP.<br> | ||
Lo scopo di questa guida è spiegare come configurare un proprio server DNS attraverso bind al fine di risolvere automaticamente gli indirizzi IP della propria LAN, non di tutto il web. | Lo scopo di questa guida è spiegare come configurare un proprio server DNS attraverso bind al fine di risolvere automaticamente gli indirizzi IP '''della propria LAN''', non di tutto il web. | ||
L'utilità di configurare un server DNS per una LAN è evidente quando ci sono più macchine da amministrare e/o servizi di rete nella lan il cui IP non è eterno, ma cambia quantomeno sporadicamente. In tali situazioni dover aggiornare manualmente i file <code>hosts</code> di ogni macchina potrebbe essere troppo gravoso, o comunque troppo fastidioso ...<br> | |||
Inoltre in ambito ''SoHo'' è infrequente avere un router che supporti tale funzionalità, pertanto l'uso di ''Bind'' permette di superare tale limite, oltre a garantire la possibilità di aggiornamenti continui e rapidi, diversamente dai prodotti consumer che spesso ricevono aggiornamenti in grande ritardo, ammesso che ne ricevano del tutto.<br> | |||
Nel caso di indirizzi dinamici è però bene ricordare che ''Bind'' può non bastare, infatti anche se tramite un server l'aggiornamento degli indirizzi avviene una sola volta per tutte le macchine, è comunque di tipo di manuale e in caso di molteplici macchine sarà ancora un problema.<br> | |||
'''La soluzione completa prevede quindi l'uso in tandem sia di un server DNS che di uno DHCP''', dove quest'ultimo si occupa di tenere traccia delle variazioni degli indirizzi IP e di aggiornare automaticamente i record DNS di ''Bind''. Per l'installazione e configurazione di un server DHCP si veda la guida dedicata a [[ISC DHCP]] server. | |||
=== Importante === | |||
L'ordine di risoluzione dei nomi è sempre: | |||
# Lettura del file <code>/etc/hosts</code> (o <code>C:\Windows\System32\Drivers\etc\hosts</code> in windows). | |||
# Se al precedente punto non si è ottenuto quanto desiderato segue un interrogazione del server DNS primario, che ai fini di questa guida non potrà che essere il server privato dell'utente. Si noti che qualora il server primario fosse non raggiungibile verrà contattato quello secondario ove specificato; a tal proposito val la pena specificare che se il secondario è un altro server privato dell'utente, ovvero uno slave, allora sarà possibile risolvere qualsiasi nome, viceversa se pubblico evidentemente non sarà possibile risolvere nomi associati alla propria LAN (o comunque non correttamente in caso di omonimia). | |||
# Se anche al punto due non è stato possibile risolvere il nome, per esempio perché non associato ad un IP della propria LAN (ipotizzato naturalmente di aver configurato correttamente il tutto), allora il proprio server DNS privato inoltrerà la richiesta ad altri server DNS pubblici (opportunamente specificati nel file di configurazione). | |||
Dalla sequenza appena descritta risulta evidente che se un utente vuole impedire la risoluzione corretta di un certo specifico nome su una certa macchina, allora è sufficiente specificare nel file <code>hosts</code> di quel PC una corrispondenza errata IP/NOME.<br /> | |||
Un ultima nota: mentre in debian qualsiasi cambiamento del file <code>hosts</code> è istantaneo, in windows potrebbe non esserlo, come nel sottostante esempio. | |||
Si supponga che sul server DNS sia fatta l'associazione (corretta) 'IP/NOME1' e che un utente tramite il proprio file <code>hosts</code> la modifichi in 'IP/NOME2' (fittizia); se dopo tale modifica quest'utente esegue il comando <code>ping NOME2</code> egli raggiungerà correttamente e immediatamente IP. Ipotizzando ora che tale utente elimini dal proprio file <code>hosts</code> l'associazione fittizia 'IP/NOME2' e che successivamente esegua il comando <code>ping NOME1</code>, potrebbe accadere che IP risulti irraggiungibile per diverso tempo, anche mezz'ora. | |||
== Installazione == | |||
Il primo passo per organizzare questa architettura di rete è quello di installare Bind9 sul server Linux e le relative utilità, col comando: | |||
<pre> | |||
# apt-get install bind9 dnsutils | |||
</pre> | |||
== Configurazione == | |||
A questo punto va configurato Bind in modo che possa risolvere i nomi host per il dominio che andremo a creare. Il primo passo, consiste nel dire al server Linux che la risoluzione dei nomi dev'essere delegata a se stesso, editando opportunamente il file <code>/etc/resolv.conf</code>.<br /> | |||
Successivamente bisogna modificare il file principale di configurazione di Bind, ovvero <code>/etc/bind/named.conf.local</code>. È tramite questi file che si definisce dove sono posizionati i file in cui sono definite le zone corrispondenti ai vari domini che si vogliono configurare nonché i diversi parametri in generale.<br /> | |||
Si ipotizzi quindi di avere un dominio <code>test.lan</code> sulla rete 192.168.1.0: dovremo configurare due file di zona, uno chiamato <code>/etc/bind/db.test</code> ed uno chiamato <code>/etc/bind/db.192.168.1</code>, che rappresenta il file in cui inserire i record PTR ("Domain Name Pointer", quelli di ricerca inversa). Di seguito vediamo come impostare il file <code>/etc/resolv.conf</code>, dopodiché vedremo il contenuto del file di configurazione generico di Bind9 <code>/etc/bind/named.conf</code>, ed infine esamineremo i file di zona <code>/etc/bind/db.test</code> e <code>/etc/bind/db.192.168.1</code>, che rappresentano la zona che descrive la nostra rete LAN: | |||
=== /etc/resolv.conf === | |||
Per quanto riguarda il server: | |||
<pre> | |||
search test.lan | |||
nameserver 127.0.0.1 | |||
</pre> | |||
Nel caso delle macchine client dipende, infatti per PC linux con connessioni di rete gestite attraverso 'network-manager' non è necessario effettuare alcuna modifica in quanto è lo stesso applicativo ad alterarlo in base alla configurazione della connessione in uso (si veda una guida di 'network-manager' per sapere come configurarlo). Men che meno evidentemente nel caso di client windows, dove è sufficiente editare le impostazioni della scheda di rete indicando come DNS primario il proprio server privato.<br /> | |||
Nel caso di macchine linux prive di 'network-manager' (o altro applicativo equivalente) allora sarà necessario modificare <code>/etc/resolv.conf</code> manualmente come indicato sopra, ma indicando al posto di <code>127.0.0.1</code> l'indirizzo LAN del server (<code>192.168.1.1</code> nel caso di questa guida). | |||
=== /etc/bind/named.conf.local === | |||
<pre> | |||
zone "test.lan" { | |||
type master; | |||
file "/etc/bind/db.test"; | |||
}; | |||
zone "1.168.192.in-addr.arpa" { | |||
type master; | |||
file "/etc/bind/db.192.168.1"; | |||
}; | |||
</pre> | |||
=== /etc/bind/db.test === | |||
Descrive la zona della nostra rete LAN. Non è presente nella directory <code>/etc/bind</code>, ma va creato con un editor di testo. | |||
<pre> | |||
$ORIGIN . | |||
; ---Area 1--- | |||
$TTL 86400 ; 1 day | |||
; ---Area 2--- | |||
test.lan IN SOA ns1.test.lan. hostmaster.test.lan. ( | |||
2007081501 ; serial | |||
86400 ; refresh (1 giorno) | |||
28800 ; retry (8 ore) | |||
604800 ; expire (1 settimana) | |||
86400 ; minimum (1 giorno) | |||
); | |||
; ---Area 3--- | |||
IN NS ns1.test.lan. | |||
; ---Area 4--- | |||
$ORIGIN test.lan. | |||
;NOTA: ns1 è il nome del server che funge da DNS server | |||
ns1 IN A 192.168.1.1 | |||
; Qui potete inserire gli IP dei client-server che hanno un IP statico | |||
client IN A 192.168.1.3 | |||
</pre> | |||
==== Area 1 ==== | |||
La prima linea del file specifica il '''TTL''' (Time To Live) di questa zona e indica quanto tempo deve trascorrere prima che Bind controlli i file locali per verificare eventuali cambiamenti. Il valore di default è espresso in secondi, ma potrebbe essere espresso anche secondo altre unità di tempo.<br> | |||
Nel caso si sia configurato DHCP per aggiornare automaticamente bind, questo oltre ad inserire nuovi record provvederà anche a dichiare nuovi valori di ''$TTL''. Se per esempio ad un client è stato concesso un lease pari a 7200 secondi nel suddetto file il relativo record apparirà così: | |||
<pre> | |||
$TTL 7200 | |||
caio IN A 192.168.1.X | |||
$TTL 86400 | |||
</pre> | |||
==== Area 2 ==== | |||
Le linee successive indicano il '''SOA''' (Start Of Authority); il formato di questi record è il seguente: | |||
<pre> | |||
<domain name>. IN SOA <primary nameserver>. <email address of admin>. ( | |||
<serial number> | |||
<time to refresh> | |||
<time to retry> | |||
<time to expire> | |||
<negative caching ttl> | |||
) | |||
</pre> | |||
dove | |||
* domain name - indica il nome del dominio, seguito da un punto; specificando invece '@' vale quanto detto nel paragrafo dedicato alla sintassi generale. | |||
* IN e SOA indicano che il server è un SOA e un DNS per internet | |||
* primary nameserver - è il nome di dominio del server che stiamo installando | |||
* email address of admin - l'email dell'amministratore del server, in cui il simbolo @ è sostituito da un . | |||
* serial number - è il valore utilizzato dai server DNS slave per determinare se sono occorsi cambiamenti dall'ultima volta che hanno contattato il master DNS. È del tutto arbitrario (valore minimo 1, valore massimo molto grande) e nel caso di IP statici deve essere modificato manualmente dall'amministratore ogni volta che compie delle modifiche. In questa guida si è scelto un formato del tipo anno-mese-giorno-numero. | |||
* refresh - è l'intervallo di tempo che deve trascorrere prima che un server slave ricontatti il proprio master | |||
* retry - è il numero di tentativi di connessione che un server slave deve effettuare prima di chiudere il tentativo di aggiornamento | |||
* expire - indica quanto tempo lo slave server deve continuare a fornire dati dopo che si è verificato un errore negli aggiornamenti da un master server | |||
* negative caching ttl - è il periodo di tempo in cui uno slave server fornisce risposte negative alle interrogazioni | |||
==== Area 3 ==== | |||
Seguono poi le linee che indicano i Server DNS della rete, nel formato: | |||
<pre> | |||
<domain name>. IN NS <nameserver1>. | |||
<domain name>. IN NS <nameserver2>. | |||
</pre> | |||
'''NS''' significa '''N'''ame '''S'''erver, i quali possono essere specificati sia tramite FQDN sia con un indirizzo IP. Nel nostro caso il Name Server si chiama <code>ns1</code> e pertanto la linea diventa: | |||
<pre> | |||
IN NS ns1.test.lan. | |||
</pre> | |||
Si noti che omettendo di specificare un 'name' (si veda il paragrafo sulla sintassi generale) bind userà l'ultimo specificato, in questo caso il <code>test.lan.</code> specificato con la precedente direttiva 'SOA'. | |||
==== Area 4 ==== | |||
Infine vengono specificati gli indirizzi delle macchine locali che posseggono un indirizzo IP statico, con la seguente sintassi: | |||
<pre> | |||
<full domain name>. IN A <IP address> | |||
</pre> | |||
==== Sintassi generale ==== | |||
Con l'esclusione dell'area 1, vale la seguente sintassi: | |||
<pre>NAME TTL CLASS RR VARIE</pre> | |||
* '''NAME''', che può essere: | |||
** FQDN, per esempio <code>test.lan.</code> nel caso 'RR=NS'; | |||
** Non qualificato, per esempio <code>client</code> nel caso 'RR=A'; | |||
** @, nei soli caso 'RR=NS' e 'RR=SOA'; con questo carattere bind userà il valore specificato nella variabile ''$origin'' dell'area 1, oppure qualora non presente uno specificato nella direttiva 'zone' del file 'named.conf.local'. | |||
** Omesso, è potenzialmente fonte di confusione. Se 'RR=A' bind userà l'ultimo valore di NAME precedente specificato, se invece 'RR=NS' bind userà sempre l'ultimo valore di NAME precedente specificato, ma se assente bind userà quello specificato nella variabile ''$origin'' dell'area 1, oppure qualora anche'esso non presente uno specificato nella direttiva 'zone' del file 'named.conf.local'. | |||
* '''TTL''', generalmente omesso se si usa quello definito nell'area 1; | |||
* '''CLASS''', per esempio <code>IN</code>; | |||
* '''RR''', ovvero "DNS Resource Record", per esempio <code>A</code> o <code>NS</code>; | |||
* '''VARIE''', dipende dal parametro RR, per esempio un IP se 'RR=A'. | |||
==== Misure di Tempo ==== | |||
In generale tutte le misure di tempo possono essere espresse come segue: | |||
* '''s''' = secondi = # x 1 secondi, es.: <code>$TTL 86400s</code> equivale a <code>$TTL 86400</code>, ovvero un giorno | |||
* '''m''' = minuti = # x 60 secondi, es.: <code>$TTL 1440m</code>, ovvero un giorno | |||
* '''h''' = ore = # x 3600 secondi, es.: <code>$TTL 24h</code>, ovvero un giorno | |||
* '''d''' = giorni = # x 86400 secondi, es.: <code>$TTL 1d</code>, ovvero un giorno | |||
* '''w''' = settimane = # x 604800 secondi | |||
Si noti che tali unità possono essere combinate, per esempio 90s = 1m30s. | |||
=== /etc/bind/db.192.168.1: === | |||
Descrive la zona della nostra rete LAN. Non è presente nella directory <code>/etc/bind</code>, ma va creato con un editor di testo. | |||
<pre> | |||
; | |||
; BIND reverse data file for local loopback interface | |||
; | |||
$TTL 604800 | |||
@ IN SOA ns1.test.lan. hostmaster.test.lan. ( | |||
2007081501 ; serial | |||
604800 ; refresh | |||
86400 ; retry | |||
2419200 ; expire | |||
604800 ; negative cache ttl | |||
); | |||
@ IN NS ns1.test.lan. | |||
1 IN PTR ns1.test.lan. | |||
3 IN PTR client.test.lan. | |||
</pre> | |||
Il file segue la stessa sintassi vista analizzando il file <code>db.test</code> precedente, con l'unica differenza che nel campo 'name' deve essere indicata l'ultima parte dell'indirizzo IP (o un carattere jolly come @); si noti ad esempio come | |||
<pre> | |||
ns1 IN A 192.168.1.1 | |||
client IN A 192.168.1.3 | |||
</pre> | |||
divenga | |||
<pre> | |||
1 IN PTR ns1.test.lan. | |||
3 IN PTR client.test.lan. | |||
</pre> | |||
=== Altri file === | |||
* <code>/etc/bind/db.0</code> | |||
* <code>db.127</code> | |||
* <code>db.255</code> | |||
* <code>db.empty</code> | |||
* <code>db.local</code> | |||
Questi file descrivono le zone locali predefinite in bind e non andrebbero toccati. | |||
=== Riavvio del server === | |||
Fatta la configurazione, bisogna riavviare il demone bind9: | |||
<pre># systemctl restart bind9</pre> | |||
=== Risoluzione di indirizzi internet === | |||
Ora il server DNS può risolvere i nomi host per il dominio test.lan presente sulla rete LAN, a condizione che gli IP indicati nel file di configurazione non cambino (da tenere presente che i valori indicati sono puramente indicativi); ciò implica che la nostra rete deve essere configurata con indirizzi IP statici, condizione accettabile se i PC non superano le 10 unità, altrimenti si deve considerare l'utilizzo di un server DHCP. Altra cosa da considerare, è che in questa situazione, Bind non riesce a risolvere i nomi di dominio Internet; per ovviare al problema, bisogna indicare a Bind uno o più server DNS pubblici che possano soddisfare le richieste che il server Linux fa per conto dei client, editando opportunamente il file <code>/etc/bind/named.conf.options</code> aggiungendo queste righe: | |||
<pre> | |||
allow-query { 127.0.0.1; 192.168.1.0/24; } ; | |||
allow-transfer { none; } ; | |||
allow-recursion { 127.0.0.1; 192.168.1.0/24; } ; | |||
forwarders { | |||
208.67.222.222; | |||
208.67.220.220; | |||
}; | |||
</pre> | |||
all'interno della sezione principale del file: | |||
<pre> | |||
options { | |||
directory "/var/cache/bind"; | |||
... | |||
... | |||
... | |||
auth-nxdomain no; # conform to RFC1035 | |||
listen-on-v6 { any; }; | |||
}; | |||
</pre> | |||
In questo modo i client potranno tranquillamente risolvere sia i nomi host in LAN sia i nomi di dominio Internet. | |||
Per aumentare il livello di protezione sono state aggiunte anche le direttive <code>allow</code>, permettendo le interrogazioni DNS solo dall'interno della lan e impedendo i trasferimenti di zona. | |||
== Troubleshooting Bind == | |||
=== Bind non riparte dopo un riavvio === | |||
Utilizzando il comando <code>rndc reload</code> qualche volta Bind può rifiutarsi di partire: | |||
<pre> | |||
metaserver:/etc/bind# rndc reload | |||
rndc: connection to remote host closed | |||
</pre> | |||
Questo può indicare che | |||
* il server sta usando una vecchia versione del protocollo | |||
* l'host da cui tentiamo di connetterci non è autorizzato alla connessione a Bind | |||
* i clock non sono sincronizzati | |||
* la chiave non è valida | |||
=== Bind non riparte dopo un aggiornamento di sistema === | |||
Digitare: | |||
<pre># journalctl -xe</pre> | |||
Se compare questo errore: | |||
<pre> | |||
/etc/bind/named.conf.local:5: open: /etc/bind/rndc.key: permission denied | |||
loading configuration: permission denied | |||
exiting (due to fatal error) | |||
</pre> | |||
È probabile che si siano cambiato il proprietario del file <code>/etc/bind/rndc.key</code>. Verificare che il proprietario sia root e che il gruppo sia bind. Verificare inoltre che i permessi del file siano 640. | |||
=== Errori in /var/log/syslog === | |||
Una volta che Bind è ripartito, con il comando <code>/etc/init.d/bind9 restart</code> il passo successivo è controllare il file <code>/var/log/syslog</code> in cerca di eventuali errori. Qui sotto proverò ad elencare i più comuni. Ricordatevi di riavviare Bind ogni volta che correggete un errore. | |||
==== Missing Period in a Zone File ==== | |||
Questo errore indica che ci siamo dimenticati di inserire un punto <code>.</code> alla fine della dichiarazione del FQDN all'interno dei files: | |||
* <code>/etc/bind/db.test</code> | |||
* <code>/etc/bind/db.192.168.1</code> | |||
==== Filename Typo ==== | |||
I nomi dei files delle zone creati in <code>/etc/bind</code> non corrispondono a quelli specificati nel file <code>/etc/bind/named.conf.local</code>. Dovreste trovare anche un errore come il seguente: | |||
<pre> | |||
Jul 3 19:22:42 eyrie named[2847]: zone 1.168.192.in-addr.arp/IN: loading from master file | |||
/etc/bind/db.1.169.192 failed: file not found | |||
</pre> | |||
==== Ignoring out-of-zone-data and 0 SOA/NS Records for Reverse DNS? ==== | |||
Questo è un po' criptico: | |||
<pre> | |||
Jul 3 19:49:28 eyrie named[3028]: /etc/bind/db.1.168.192:3: ignoring out-of-zone data (raptor.loc) | |||
Jul 3 19:49:28 eyrie named[3028]: /etc/bind/db.1.168.192:12: ignoring out-of-zone data (raptor.loc) | |||
Jul 3 19:49:28 eyrie named[3028]: zone 1.168.192.in-addr.arp/IN: has 0 SOA records | |||
Jul 3 19:49:28 eyrie named[3028]: zone 1.168.192.in-addr.arp/IN: has no NS records | |||
</pre> | |||
Probabilmente uno dei files di zona non contiene le corrette dichiarazioni SOA. | |||
==== Has no address records ==== | |||
<pre> | |||
zone 1.168.192.in-addr.arpa/IN: NS 'ns1.test.lan.1.168.192.in-addr.arpa' has no address records (A or AAAA) | |||
zone 1.168.192.in-addr.arpa/IN: not loaded due to errors | |||
</pre> | |||
Controllare di non aver dimenticato il punto finale nel file <code>db.192.168.1</code>, ovvero che ci sia scritto: | |||
<pre>@ IN NS ns1.test.lan.</pre> | |||
==== Turning Logging On/Off ==== | |||
Quando siamo alla ricerca di errori, può essere comodo abilitare temporaneamente il log di tutte le operazioni DNS sul file <code>/var/log/syslog</code> usando il comando: | |||
<pre> | |||
rndc querylog | |||
</pre> | |||
Questo porterà alla registrazione di numerose linee come le seguenti: | |||
<pre> | |||
Jul 3 21:25:40 eyrie named[3189]: client 192.168.1.200#32793: query: eyrie.raptor.loc IN A + | |||
Jul 3 21:25:41 eyrie named[3189]: client 192.168.1.200#32793: query: gyrfalcon.raptor.loc IN A + | |||
</pre> | |||
Per disabilitare il log occorre ridare il comando precedente. | |||
==== error (no valid RRSIG) resolving nome.dominio ==== | |||
Il problema è nella funzione DNSSEC di Bind, che fa in modo che il server rifiuti di restituire risposte non validate. Per eliminare l'errore è sufficiente aggiungere al file <code>/etc/bind/named.conf.options</code> aggiungendo le linee: | |||
<pre> | |||
dnssec-enable no; | |||
dnssec-validation no; | |||
</pre> | |||
=== Test di funzionamento === | |||
Una volta eliminati gli errori dai log possiamo testare il corretto funzionamento del server DNS, con i comandi | |||
<pre>$ host</pre> | |||
oppure | |||
<pre>$ dig</pre> | |||
Qui di seguito sono elencati alcuni problemi comuni: | |||
====Host Does not exist==== | |||
=====Authoritative answer===== | |||
<pre> | |||
gyrfalcon:~# host eyrie | |||
eyrie.raptor.loc does not exist (Authoritative answer) | |||
</pre> | |||
Di solito questo indica un problema con il Forward DNS, oppure che è stato dimenticato un punto finale in uno di questi files: | |||
* <code>/etc/bind/db.test</code> | |||
* <code>/etc/bind/db.192.168.1</code> | |||
=====Try Again===== | |||
<pre> | |||
eyrie:~# host eyrie | |||
eyrie does not exist, try again | |||
</pre> | |||
Occorre specificare il dominio di ricerca all'interno del file <code>/etc/resolv.conf</code>. | |||
====Host Not Found==== | |||
====Diretto==== | |||
<pre> | |||
caio@sempronio:~$ host sempronio | |||
sempronio has address 67.215.65.132 | |||
Host sempronio not found: 3(NXDOMAIN) | |||
</pre> | |||
L'IP <code>67.215.65.132</code> è quello cui OpenDNS reindirizza in caso di errore nella risoluzione dei nomi; tale errore potrebbe quindi comparire solo se oltre ad aver errato qualcosa avete indicato tra i forwarders uno dei server di OpenDNS.<br /> | |||
Un simile errore potrebbe essere dovuto ad un'errata definizione di ''sempronio'' nel file <code>db.test</code> se l'host è statico, oppure all'impossibilità di dhcpd di aggiornare il file <code>db.test</code>. In ogni caso consultare il file <code>/var/log/syslog</code> per avere maggiori informazioni. | |||
=====Inverso, SERVFAIL===== | |||
<pre> | |||
caio@sempronio:~$ host 192.168.1.X | |||
Host X.1.168.192.in-addr.arpa not found: 2(SERVFAIL) | |||
</pre> | |||
Controllare di aver definito correttamente tutti i client nel file <code>db.192.168.1</code>, per esempio di non aver scritto qualcosa del tipo: | |||
<pre>X IN PTR sempronio.test.lan</pre> | |||
mancando evidentemente il punto finale, cioè sempronio.test.lan.<br /> | |||
Nel solito file di log dovreste trovare un errore di questo tipo: | |||
<pre>unable to add reverse map from X.1.168.192.1.168.192.in-addr.arpa. to sempronio.test.lan: timed out</pre> | |||
=====Inverso, NXDOMAIN===== | |||
<pre> | |||
caio@sempronio:~$ host 192.168.1.X | |||
Host X.1.168.192.in-addr.arpa not found: 3(NXDOMAIN) | |||
</pre> | |||
Il suddetto IP non è presente nel file <code>db.192.168.1</code>, nel caso di indirizzo dinamico ciò potrebbe essere dovuto o all'impossibilita di DHCP di aggiornare tale file, o alla presenza di errori di sintassi nel file che ne impediscono il caricamento o infine ad un inserimento errato da parte del server DHCP. In quest'ultimo caso potrebbe capitare di trovare un record indicato come | |||
<pre>192.168.1.X PTR sempronio.test.lan.</pre> | |||
invece di | |||
<pre>X PTR sempronio.test.lan.</pre> | |||
Se nel file <code>dhcpd.conf</code> è stata inclusa la riga <code>ddns-rev-domainname "1.168.192.in-addr.arpa.";</code> eliminatela, infatti quello che il DHCP fa è appendere <code>1.168.192.in-addr.arpa.</code> a <code>X.1.168.192</code>. L'errore dovrebbe risultare evidente dal log, dove dovrebbe comparire la riga | |||
<pre>added reverse map from X.1.168.192.1.168.192.in-addr.arpa. to sempronio.test.lan</pre> | |||
quando invece quella corretta è | |||
<pre>added reverse map from X.1.168.192.in-addr.arpa. to sempronio.test.lan</pre> | |||
====Record not found==== | |||
<pre> | |||
eyrie:~# host eyrie | |||
eyrie A record not found, server failure | |||
</pre> | |||
Il client non sta usando il corretto server DNS. Occorre modificare il file <code>/etc/resolv.conf</code> oppure agire sulla configurazione di Network Manager. | |||
====Record query refused==== | |||
<pre> | |||
eyrie:~# host eyrie | |||
eyrie.raptor.loc A record query refused | |||
</pre> | |||
Dopo aver ottenuto questo errore comparirà una linea in <code>/var/log/syslog</code> sul server DNS: | |||
<pre> | |||
eyrie:~# tail /var/log/daemon.log | |||
Jul 3 21:02:22 eyrie named[3095]: client X.X.X.X#32790: query 'eyrie.raptor.loc/A/IN' denied | |||
</pre> | |||
Questo indica un problema con la direttiva <code>allow-query { }</code> in <code>/etc/bind/named.conf.options</code>, ad esempio è indicato male il range di IP della nostra LAN. | |||
== Esempi == | |||
=== Comandi utili === | |||
Elencare gli indirizzi IP dati in prestito da bind9: | |||
<pre># dhcp-lease-list --lease /var/lib/dhcp/dhcpd.leases</pre> | |||
=== Piccola LAN === | |||
==== Ipotesi ==== | |||
* Una decina di dispositivi con indirizzi statici tra computer (client windows e debian squeeze, un server debian squeeze) e stampanti di rete. Visto il ridotto numero si opta per un inserimento manuale dei relativi record DNS, pur essendo abilitato l'aggiornamento automatico tramite DHCP. | |||
* Un portatile con indirizzo prefissato tramite dhcp, ma DNS inserito manualmente, e un portatile con MAC address conosciuto, ma indirizzo assegnato dinamicamente. In entrambi i casi la connessione può essere si via cavo che senza fili. | |||
* Alcuni utenti saltuari cui si vuole garantire l'accesso a internet, ma non alla propria LAN. Si presume che tali utenti si colleghino via wireless, ma teoricamente potrebero collegarsi anche tramite cavo. | |||
* Si ipotizza l'assenza di utenti malintenzionati, ovvero di utenti che cerchino attivamente di superare con ogni mezzo i limiti imposti. | |||
==== resolv.conf ==== | |||
Non definito per i client debian, poiché gestito tramite ''network-manager'' (men che meno per quelli windows).<br> | |||
Definito nel caso del server come: | |||
<pre> | |||
search small.lan | |||
nameserver 127.0.0.1 | |||
</pre> | |||
==== named.conf.local ==== | |||
<pre> | |||
// | |||
// Do any local configuration here | |||
// | |||
include "/etc/bind/rndc.key"; | |||
controls { | |||
inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; }; | |||
}; | |||
zone "small.lan" { | |||
type master; | |||
file "/etc/bind/db.small"; | |||
allow-update { key rndc-key; }; | |||
}; | |||
zone "1.168.192.in-addr.arpa" { | |||
type master; | |||
file "/etc/bind/db.192.168.1"; | |||
allow-update { key rndc-key; }; | |||
}; | |||
// Consider adding the 1918 zones here, if they are not used in your | |||
// organization | |||
//include "/etc/bind/zones.rfc1918"; | |||
</pre> | |||
==== named.conf.options ==== | |||
<pre> | |||
options { | |||
directory "/var/cache/bind"; | |||
// If there is a firewall between you and nameservers you want | |||
// to talk to, you may need to fix the firewall to allow multiple | |||
// ports to talk. See http://www.kb.cert.org/vuls/id/800113 | |||
allow-query { 127.0.0.1; 192.168.1/24; } ; | |||
allow-transfer { none; } ; | |||
allow-recursion { 127.0.0.1; 192.168.1/24; } ; | |||
// If your ISP provided one or more IP addresses for stable | |||
// nameservers, you probably want to use them as forwarders. | |||
// Uncomment the following block, and insert the addresses replacing | |||
// the all-0's placeholder. | |||
forwarders { | |||
208.67.220.220; | |||
212.216.112.112; | |||
208.67.222.222; | |||
212.216.172.62; | |||
}; | |||
auth-nxdomain no; # conform to RFC1035 | |||
listen-on-v6 { any; }; | |||
}; | |||
</pre> | |||
==== db.small ==== | |||
<pre> | |||
$ORIGIN . | |||
$TTL 2592000 ; 30 giorni | |||
small.lan IN SOA server.small.lan. admin.small.lan. ( | |||
2012020713 ; serial | |||
86400 ; refresh (1 day) | |||
28800 ; retry (8 hours) | |||
604800 ; expire (1 week) | |||
86400 ; minimum (1 day) | |||
) | |||
IN NS server.small.lan. | |||
$ORIGIN small.lan. | |||
router IN A 192.168.1.1 | |||
server IN A 192.168.1.100 | |||
PC1 IN A 192.168.1.105 | |||
PC2 IN A 192.168.1.106 | |||
PC3 IN A 192.168.1.107 | |||
PC4 IN A 192.168.1.108 | |||
PC5 IN A 192.168.1.109 | |||
PC6 IN A 192.168.1.110 | |||
PC7 IN A 192.168.1.111 | |||
ST1 IN A 192.168.1.116 | |||
ST2 IN A 192.168.1.117 | |||
ST3 IN A 192.168.1.118 | |||
alias1 IN CNAME server | |||
alias2 IN CNAME server | |||
</pre> | |||
Attraverso CNAME è possibile definire degli alias per dei record precedentemente definiti, fatto che torna utile se per esempio si ha necessità di accedere ad una macchina attraverso differenti nomi, come nel caso di un server che ospiti diversi servizi (web server, server di posta, server ftp, ecc.). Alternativamente si potrebbero inserire altri record associando all'ip differenti nomi. | |||
==== db.192.168.1 ==== | |||
<pre> | |||
$ORIGIN . | |||
$TTL 2592000 ; 30 giorni | |||
1.168.192.in-addr.arpa IN SOA server.small.lan. admin.small.lan. ( | |||
2012020713 ; serial | |||
86400 ; refresh (1 day) | |||
28800 ; retry (8 hours) | |||
604800 ; expire (1 week) | |||
86400 ; minimum (1 day) | |||
) | |||
IN NS server.small.lan. | |||
$ORIGIN 1.168.192.in-addr.arpa. | |||
1 IN PTR router.small.lan. | |||
100 IN PTR server.small.lan. | |||
105 IN PTR PC1.small.lan. | |||
106 IN PTR PC2.small.lan. | |||
107 IN PTR PC3.small.lan. | |||
108 IN PTR PC4.small.lan. | |||
109 IN PTR PC5.small.lan. | |||
110 IN PTR PC6.small.lan. | |||
111 IN PTR PC7.small.lan. | |||
116 IN PTR ST1.small.lan. | |||
117 IN PTR ST2.small.lan. | |||
118 IN PTR ST3.small.lan. | |||
</pre> | |||
'''NON''' è possibile associare ad un indirizzo IP più di un nome di rete, diversamente dal file ''db.dune''. Quindi non più di una direttiva PTR per IP e niente alias. | |||
== Approfondimenti == | |||
=== Sitografia === | |||
* [https://wiki.debian.org/Bind9 Bind9], debian wiki. | |||
* [https://www.isc.org/downloads/bind/doc/ ISC] official documentation. | |||
* [http://www.zytrax.com/books/dns/ Zytrax DNS open guide] | |||
{{Autori | |||
|Autore = [[Utente:Wtf|Wtf]] 22:27, 5 mag 2019 (CEST) | |||
|Verificata_da = | |||
|Estesa_da = | |||
|Numero_revisori=0 | |||
}} | |||
[[Categoria:DNS e DHCP]] | [[Categoria:DNS e DHCP]] |
Versione attuale delle 22:30, 10 mag 2019
Versioni Compatibili Tutte le versioni supportate di Debian |
Gateway-Router |
Sommario |
Info Questa guida è essenzialmente la parte dedicata a Bind della vecchia guida "Un server DNS e DHCP su Debian", ma privata delle istruzioni relative a Lenny e dei riferimenti a Squeeze |
Introduzione
Due definizioni tratte da Wikipedia dovrebbero fornire un'idea precisa e sintetica di cosa sia un server DNS e Bind, l'implementazione più diffusa del primo:
- Il sistema dei nomi di dominio (in inglese: Domain Name System, DNS), è un sistema utilizzato per la risoluzione di nomi dei nodi della rete (in inglese: host) in indirizzi IP.
- BIND (Berkeley Internet Name Domain, in precedenza Berkeley Internet Name Daemon) è il server DNS più usato su Internet, specialmente sui sistemi Unix e derivati, sui quali è lo standard di fatto
In poche parole un server dns è ciò che permette di contattare un qualsiasi server web digitando un indirizzo invece che il suo corrispondente indirizzo IP.
Lo scopo di questa guida è spiegare come configurare un proprio server DNS attraverso bind al fine di risolvere automaticamente gli indirizzi IP della propria LAN, non di tutto il web.
L'utilità di configurare un server DNS per una LAN è evidente quando ci sono più macchine da amministrare e/o servizi di rete nella lan il cui IP non è eterno, ma cambia quantomeno sporadicamente. In tali situazioni dover aggiornare manualmente i file hosts
di ogni macchina potrebbe essere troppo gravoso, o comunque troppo fastidioso ...
Inoltre in ambito SoHo è infrequente avere un router che supporti tale funzionalità, pertanto l'uso di Bind permette di superare tale limite, oltre a garantire la possibilità di aggiornamenti continui e rapidi, diversamente dai prodotti consumer che spesso ricevono aggiornamenti in grande ritardo, ammesso che ne ricevano del tutto.
Nel caso di indirizzi dinamici è però bene ricordare che Bind può non bastare, infatti anche se tramite un server l'aggiornamento degli indirizzi avviene una sola volta per tutte le macchine, è comunque di tipo di manuale e in caso di molteplici macchine sarà ancora un problema.
La soluzione completa prevede quindi l'uso in tandem sia di un server DNS che di uno DHCP, dove quest'ultimo si occupa di tenere traccia delle variazioni degli indirizzi IP e di aggiornare automaticamente i record DNS di Bind. Per l'installazione e configurazione di un server DHCP si veda la guida dedicata a ISC DHCP server.
Importante
L'ordine di risoluzione dei nomi è sempre:
- Lettura del file
/etc/hosts
(oC:\Windows\System32\Drivers\etc\hosts
in windows). - Se al precedente punto non si è ottenuto quanto desiderato segue un interrogazione del server DNS primario, che ai fini di questa guida non potrà che essere il server privato dell'utente. Si noti che qualora il server primario fosse non raggiungibile verrà contattato quello secondario ove specificato; a tal proposito val la pena specificare che se il secondario è un altro server privato dell'utente, ovvero uno slave, allora sarà possibile risolvere qualsiasi nome, viceversa se pubblico evidentemente non sarà possibile risolvere nomi associati alla propria LAN (o comunque non correttamente in caso di omonimia).
- Se anche al punto due non è stato possibile risolvere il nome, per esempio perché non associato ad un IP della propria LAN (ipotizzato naturalmente di aver configurato correttamente il tutto), allora il proprio server DNS privato inoltrerà la richiesta ad altri server DNS pubblici (opportunamente specificati nel file di configurazione).
Dalla sequenza appena descritta risulta evidente che se un utente vuole impedire la risoluzione corretta di un certo specifico nome su una certa macchina, allora è sufficiente specificare nel file hosts
di quel PC una corrispondenza errata IP/NOME.
Un ultima nota: mentre in debian qualsiasi cambiamento del file hosts
è istantaneo, in windows potrebbe non esserlo, come nel sottostante esempio.
Si supponga che sul server DNS sia fatta l'associazione (corretta) 'IP/NOME1' e che un utente tramite il proprio file hosts
la modifichi in 'IP/NOME2' (fittizia); se dopo tale modifica quest'utente esegue il comando ping NOME2
egli raggiungerà correttamente e immediatamente IP. Ipotizzando ora che tale utente elimini dal proprio file hosts
l'associazione fittizia 'IP/NOME2' e che successivamente esegua il comando ping NOME1
, potrebbe accadere che IP risulti irraggiungibile per diverso tempo, anche mezz'ora.
Installazione
Il primo passo per organizzare questa architettura di rete è quello di installare Bind9 sul server Linux e le relative utilità, col comando:
# apt-get install bind9 dnsutils
Configurazione
A questo punto va configurato Bind in modo che possa risolvere i nomi host per il dominio che andremo a creare. Il primo passo, consiste nel dire al server Linux che la risoluzione dei nomi dev'essere delegata a se stesso, editando opportunamente il file /etc/resolv.conf
.
Successivamente bisogna modificare il file principale di configurazione di Bind, ovvero /etc/bind/named.conf.local
. È tramite questi file che si definisce dove sono posizionati i file in cui sono definite le zone corrispondenti ai vari domini che si vogliono configurare nonché i diversi parametri in generale.
Si ipotizzi quindi di avere un dominio test.lan
sulla rete 192.168.1.0: dovremo configurare due file di zona, uno chiamato /etc/bind/db.test
ed uno chiamato /etc/bind/db.192.168.1
, che rappresenta il file in cui inserire i record PTR ("Domain Name Pointer", quelli di ricerca inversa). Di seguito vediamo come impostare il file /etc/resolv.conf
, dopodiché vedremo il contenuto del file di configurazione generico di Bind9 /etc/bind/named.conf
, ed infine esamineremo i file di zona /etc/bind/db.test
e /etc/bind/db.192.168.1
, che rappresentano la zona che descrive la nostra rete LAN:
/etc/resolv.conf
Per quanto riguarda il server:
search test.lan nameserver 127.0.0.1
Nel caso delle macchine client dipende, infatti per PC linux con connessioni di rete gestite attraverso 'network-manager' non è necessario effettuare alcuna modifica in quanto è lo stesso applicativo ad alterarlo in base alla configurazione della connessione in uso (si veda una guida di 'network-manager' per sapere come configurarlo). Men che meno evidentemente nel caso di client windows, dove è sufficiente editare le impostazioni della scheda di rete indicando come DNS primario il proprio server privato.
Nel caso di macchine linux prive di 'network-manager' (o altro applicativo equivalente) allora sarà necessario modificare /etc/resolv.conf
manualmente come indicato sopra, ma indicando al posto di 127.0.0.1
l'indirizzo LAN del server (192.168.1.1
nel caso di questa guida).
/etc/bind/named.conf.local
zone "test.lan" { type master; file "/etc/bind/db.test"; }; zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168.1"; };
/etc/bind/db.test
Descrive la zona della nostra rete LAN. Non è presente nella directory /etc/bind
, ma va creato con un editor di testo.
$ORIGIN . ; ---Area 1--- $TTL 86400 ; 1 day ; ---Area 2--- test.lan IN SOA ns1.test.lan. hostmaster.test.lan. ( 2007081501 ; serial 86400 ; refresh (1 giorno) 28800 ; retry (8 ore) 604800 ; expire (1 settimana) 86400 ; minimum (1 giorno) ); ; ---Area 3--- IN NS ns1.test.lan. ; ---Area 4--- $ORIGIN test.lan. ;NOTA: ns1 è il nome del server che funge da DNS server ns1 IN A 192.168.1.1 ; Qui potete inserire gli IP dei client-server che hanno un IP statico client IN A 192.168.1.3
Area 1
La prima linea del file specifica il TTL (Time To Live) di questa zona e indica quanto tempo deve trascorrere prima che Bind controlli i file locali per verificare eventuali cambiamenti. Il valore di default è espresso in secondi, ma potrebbe essere espresso anche secondo altre unità di tempo.
Nel caso si sia configurato DHCP per aggiornare automaticamente bind, questo oltre ad inserire nuovi record provvederà anche a dichiare nuovi valori di $TTL. Se per esempio ad un client è stato concesso un lease pari a 7200 secondi nel suddetto file il relativo record apparirà così:
$TTL 7200 caio IN A 192.168.1.X $TTL 86400
Area 2
Le linee successive indicano il SOA (Start Of Authority); il formato di questi record è il seguente:
<domain name>. IN SOA <primary nameserver>. <email address of admin>. ( <serial number> <time to refresh> <time to retry> <time to expire> <negative caching ttl> )
dove
- domain name - indica il nome del dominio, seguito da un punto; specificando invece '@' vale quanto detto nel paragrafo dedicato alla sintassi generale.
- IN e SOA indicano che il server è un SOA e un DNS per internet
- primary nameserver - è il nome di dominio del server che stiamo installando
- email address of admin - l'email dell'amministratore del server, in cui il simbolo @ è sostituito da un .
- serial number - è il valore utilizzato dai server DNS slave per determinare se sono occorsi cambiamenti dall'ultima volta che hanno contattato il master DNS. È del tutto arbitrario (valore minimo 1, valore massimo molto grande) e nel caso di IP statici deve essere modificato manualmente dall'amministratore ogni volta che compie delle modifiche. In questa guida si è scelto un formato del tipo anno-mese-giorno-numero.
- refresh - è l'intervallo di tempo che deve trascorrere prima che un server slave ricontatti il proprio master
- retry - è il numero di tentativi di connessione che un server slave deve effettuare prima di chiudere il tentativo di aggiornamento
- expire - indica quanto tempo lo slave server deve continuare a fornire dati dopo che si è verificato un errore negli aggiornamenti da un master server
- negative caching ttl - è il periodo di tempo in cui uno slave server fornisce risposte negative alle interrogazioni
Area 3
Seguono poi le linee che indicano i Server DNS della rete, nel formato:
<domain name>. IN NS <nameserver1>. <domain name>. IN NS <nameserver2>.
NS significa Name Server, i quali possono essere specificati sia tramite FQDN sia con un indirizzo IP. Nel nostro caso il Name Server si chiama ns1
e pertanto la linea diventa:
IN NS ns1.test.lan.
Si noti che omettendo di specificare un 'name' (si veda il paragrafo sulla sintassi generale) bind userà l'ultimo specificato, in questo caso il test.lan.
specificato con la precedente direttiva 'SOA'.
Area 4
Infine vengono specificati gli indirizzi delle macchine locali che posseggono un indirizzo IP statico, con la seguente sintassi:
<full domain name>. IN A <IP address>
Sintassi generale
Con l'esclusione dell'area 1, vale la seguente sintassi:
NAME TTL CLASS RR VARIE
- NAME, che può essere:
- FQDN, per esempio
test.lan.
nel caso 'RR=NS'; - Non qualificato, per esempio
client
nel caso 'RR=A'; - @, nei soli caso 'RR=NS' e 'RR=SOA'; con questo carattere bind userà il valore specificato nella variabile $origin dell'area 1, oppure qualora non presente uno specificato nella direttiva 'zone' del file 'named.conf.local'.
- Omesso, è potenzialmente fonte di confusione. Se 'RR=A' bind userà l'ultimo valore di NAME precedente specificato, se invece 'RR=NS' bind userà sempre l'ultimo valore di NAME precedente specificato, ma se assente bind userà quello specificato nella variabile $origin dell'area 1, oppure qualora anche'esso non presente uno specificato nella direttiva 'zone' del file 'named.conf.local'.
- FQDN, per esempio
- TTL, generalmente omesso se si usa quello definito nell'area 1;
- CLASS, per esempio
IN
; - RR, ovvero "DNS Resource Record", per esempio
A
oNS
; - VARIE, dipende dal parametro RR, per esempio un IP se 'RR=A'.
Misure di Tempo
In generale tutte le misure di tempo possono essere espresse come segue:
- s = secondi = # x 1 secondi, es.:
$TTL 86400s
equivale a$TTL 86400
, ovvero un giorno - m = minuti = # x 60 secondi, es.:
$TTL 1440m
, ovvero un giorno - h = ore = # x 3600 secondi, es.:
$TTL 24h
, ovvero un giorno - d = giorni = # x 86400 secondi, es.:
$TTL 1d
, ovvero un giorno - w = settimane = # x 604800 secondi
Si noti che tali unità possono essere combinate, per esempio 90s = 1m30s.
/etc/bind/db.192.168.1:
Descrive la zona della nostra rete LAN. Non è presente nella directory /etc/bind
, ma va creato con un editor di testo.
; ; BIND reverse data file for local loopback interface ; $TTL 604800 @ IN SOA ns1.test.lan. hostmaster.test.lan. ( 2007081501 ; serial 604800 ; refresh 86400 ; retry 2419200 ; expire 604800 ; negative cache ttl ); @ IN NS ns1.test.lan. 1 IN PTR ns1.test.lan. 3 IN PTR client.test.lan.
Il file segue la stessa sintassi vista analizzando il file db.test
precedente, con l'unica differenza che nel campo 'name' deve essere indicata l'ultima parte dell'indirizzo IP (o un carattere jolly come @); si noti ad esempio come
ns1 IN A 192.168.1.1 client IN A 192.168.1.3
divenga
1 IN PTR ns1.test.lan. 3 IN PTR client.test.lan.
Altri file
/etc/bind/db.0
db.127
db.255
db.empty
db.local
Questi file descrivono le zone locali predefinite in bind e non andrebbero toccati.
Riavvio del server
Fatta la configurazione, bisogna riavviare il demone bind9:
# systemctl restart bind9
Risoluzione di indirizzi internet
Ora il server DNS può risolvere i nomi host per il dominio test.lan presente sulla rete LAN, a condizione che gli IP indicati nel file di configurazione non cambino (da tenere presente che i valori indicati sono puramente indicativi); ciò implica che la nostra rete deve essere configurata con indirizzi IP statici, condizione accettabile se i PC non superano le 10 unità, altrimenti si deve considerare l'utilizzo di un server DHCP. Altra cosa da considerare, è che in questa situazione, Bind non riesce a risolvere i nomi di dominio Internet; per ovviare al problema, bisogna indicare a Bind uno o più server DNS pubblici che possano soddisfare le richieste che il server Linux fa per conto dei client, editando opportunamente il file /etc/bind/named.conf.options
aggiungendo queste righe:
allow-query { 127.0.0.1; 192.168.1.0/24; } ; allow-transfer { none; } ; allow-recursion { 127.0.0.1; 192.168.1.0/24; } ; forwarders { 208.67.222.222; 208.67.220.220; };
all'interno della sezione principale del file:
options { directory "/var/cache/bind"; ... ... ... auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; };
In questo modo i client potranno tranquillamente risolvere sia i nomi host in LAN sia i nomi di dominio Internet.
Per aumentare il livello di protezione sono state aggiunte anche le direttive allow
, permettendo le interrogazioni DNS solo dall'interno della lan e impedendo i trasferimenti di zona.
Troubleshooting Bind
Bind non riparte dopo un riavvio
Utilizzando il comando rndc reload
qualche volta Bind può rifiutarsi di partire:
metaserver:/etc/bind# rndc reload rndc: connection to remote host closed
Questo può indicare che
- il server sta usando una vecchia versione del protocollo
- l'host da cui tentiamo di connetterci non è autorizzato alla connessione a Bind
- i clock non sono sincronizzati
- la chiave non è valida
Bind non riparte dopo un aggiornamento di sistema
Digitare:
# journalctl -xe
Se compare questo errore:
/etc/bind/named.conf.local:5: open: /etc/bind/rndc.key: permission denied loading configuration: permission denied exiting (due to fatal error)
È probabile che si siano cambiato il proprietario del file /etc/bind/rndc.key
. Verificare che il proprietario sia root e che il gruppo sia bind. Verificare inoltre che i permessi del file siano 640.
Errori in /var/log/syslog
Una volta che Bind è ripartito, con il comando /etc/init.d/bind9 restart
il passo successivo è controllare il file /var/log/syslog
in cerca di eventuali errori. Qui sotto proverò ad elencare i più comuni. Ricordatevi di riavviare Bind ogni volta che correggete un errore.
Missing Period in a Zone File
Questo errore indica che ci siamo dimenticati di inserire un punto .
alla fine della dichiarazione del FQDN all'interno dei files:
/etc/bind/db.test
/etc/bind/db.192.168.1
Filename Typo
I nomi dei files delle zone creati in /etc/bind
non corrispondono a quelli specificati nel file /etc/bind/named.conf.local
. Dovreste trovare anche un errore come il seguente:
Jul 3 19:22:42 eyrie named[2847]: zone 1.168.192.in-addr.arp/IN: loading from master file /etc/bind/db.1.169.192 failed: file not found
Ignoring out-of-zone-data and 0 SOA/NS Records for Reverse DNS?
Questo è un po' criptico:
Jul 3 19:49:28 eyrie named[3028]: /etc/bind/db.1.168.192:3: ignoring out-of-zone data (raptor.loc) Jul 3 19:49:28 eyrie named[3028]: /etc/bind/db.1.168.192:12: ignoring out-of-zone data (raptor.loc) Jul 3 19:49:28 eyrie named[3028]: zone 1.168.192.in-addr.arp/IN: has 0 SOA records Jul 3 19:49:28 eyrie named[3028]: zone 1.168.192.in-addr.arp/IN: has no NS records
Probabilmente uno dei files di zona non contiene le corrette dichiarazioni SOA.
Has no address records
zone 1.168.192.in-addr.arpa/IN: NS 'ns1.test.lan.1.168.192.in-addr.arpa' has no address records (A or AAAA) zone 1.168.192.in-addr.arpa/IN: not loaded due to errors
Controllare di non aver dimenticato il punto finale nel file db.192.168.1
, ovvero che ci sia scritto:
@ IN NS ns1.test.lan.
Turning Logging On/Off
Quando siamo alla ricerca di errori, può essere comodo abilitare temporaneamente il log di tutte le operazioni DNS sul file /var/log/syslog
usando il comando:
rndc querylog
Questo porterà alla registrazione di numerose linee come le seguenti:
Jul 3 21:25:40 eyrie named[3189]: client 192.168.1.200#32793: query: eyrie.raptor.loc IN A + Jul 3 21:25:41 eyrie named[3189]: client 192.168.1.200#32793: query: gyrfalcon.raptor.loc IN A +
Per disabilitare il log occorre ridare il comando precedente.
error (no valid RRSIG) resolving nome.dominio
Il problema è nella funzione DNSSEC di Bind, che fa in modo che il server rifiuti di restituire risposte non validate. Per eliminare l'errore è sufficiente aggiungere al file /etc/bind/named.conf.options
aggiungendo le linee:
dnssec-enable no; dnssec-validation no;
Test di funzionamento
Una volta eliminati gli errori dai log possiamo testare il corretto funzionamento del server DNS, con i comandi
$ host
oppure
$ dig
Qui di seguito sono elencati alcuni problemi comuni:
Host Does not exist
Authoritative answer
gyrfalcon:~# host eyrie eyrie.raptor.loc does not exist (Authoritative answer)
Di solito questo indica un problema con il Forward DNS, oppure che è stato dimenticato un punto finale in uno di questi files:
/etc/bind/db.test
/etc/bind/db.192.168.1
Try Again
eyrie:~# host eyrie eyrie does not exist, try again
Occorre specificare il dominio di ricerca all'interno del file /etc/resolv.conf
.
Host Not Found
Diretto
caio@sempronio:~$ host sempronio sempronio has address 67.215.65.132 Host sempronio not found: 3(NXDOMAIN)
L'IP 67.215.65.132
è quello cui OpenDNS reindirizza in caso di errore nella risoluzione dei nomi; tale errore potrebbe quindi comparire solo se oltre ad aver errato qualcosa avete indicato tra i forwarders uno dei server di OpenDNS.
Un simile errore potrebbe essere dovuto ad un'errata definizione di sempronio nel file db.test
se l'host è statico, oppure all'impossibilità di dhcpd di aggiornare il file db.test
. In ogni caso consultare il file /var/log/syslog
per avere maggiori informazioni.
Inverso, SERVFAIL
caio@sempronio:~$ host 192.168.1.X Host X.1.168.192.in-addr.arpa not found: 2(SERVFAIL)
Controllare di aver definito correttamente tutti i client nel file db.192.168.1
, per esempio di non aver scritto qualcosa del tipo:
X IN PTR sempronio.test.lan
mancando evidentemente il punto finale, cioè sempronio.test.lan.
Nel solito file di log dovreste trovare un errore di questo tipo:
unable to add reverse map from X.1.168.192.1.168.192.in-addr.arpa. to sempronio.test.lan: timed out
Inverso, NXDOMAIN
caio@sempronio:~$ host 192.168.1.X Host X.1.168.192.in-addr.arpa not found: 3(NXDOMAIN)
Il suddetto IP non è presente nel file db.192.168.1
, nel caso di indirizzo dinamico ciò potrebbe essere dovuto o all'impossibilita di DHCP di aggiornare tale file, o alla presenza di errori di sintassi nel file che ne impediscono il caricamento o infine ad un inserimento errato da parte del server DHCP. In quest'ultimo caso potrebbe capitare di trovare un record indicato come
192.168.1.X PTR sempronio.test.lan.
invece di
X PTR sempronio.test.lan.
Se nel file dhcpd.conf
è stata inclusa la riga ddns-rev-domainname "1.168.192.in-addr.arpa.";
eliminatela, infatti quello che il DHCP fa è appendere 1.168.192.in-addr.arpa.
a X.1.168.192
. L'errore dovrebbe risultare evidente dal log, dove dovrebbe comparire la riga
added reverse map from X.1.168.192.1.168.192.in-addr.arpa. to sempronio.test.lan
quando invece quella corretta è
added reverse map from X.1.168.192.in-addr.arpa. to sempronio.test.lan
Record not found
eyrie:~# host eyrie eyrie A record not found, server failure
Il client non sta usando il corretto server DNS. Occorre modificare il file /etc/resolv.conf
oppure agire sulla configurazione di Network Manager.
Record query refused
eyrie:~# host eyrie eyrie.raptor.loc A record query refused
Dopo aver ottenuto questo errore comparirà una linea in /var/log/syslog
sul server DNS:
eyrie:~# tail /var/log/daemon.log Jul 3 21:02:22 eyrie named[3095]: client X.X.X.X#32790: query 'eyrie.raptor.loc/A/IN' denied
Questo indica un problema con la direttiva allow-query { }
in /etc/bind/named.conf.options
, ad esempio è indicato male il range di IP della nostra LAN.
Esempi
Comandi utili
Elencare gli indirizzi IP dati in prestito da bind9:
# dhcp-lease-list --lease /var/lib/dhcp/dhcpd.leases
Piccola LAN
Ipotesi
- Una decina di dispositivi con indirizzi statici tra computer (client windows e debian squeeze, un server debian squeeze) e stampanti di rete. Visto il ridotto numero si opta per un inserimento manuale dei relativi record DNS, pur essendo abilitato l'aggiornamento automatico tramite DHCP.
- Un portatile con indirizzo prefissato tramite dhcp, ma DNS inserito manualmente, e un portatile con MAC address conosciuto, ma indirizzo assegnato dinamicamente. In entrambi i casi la connessione può essere si via cavo che senza fili.
- Alcuni utenti saltuari cui si vuole garantire l'accesso a internet, ma non alla propria LAN. Si presume che tali utenti si colleghino via wireless, ma teoricamente potrebero collegarsi anche tramite cavo.
- Si ipotizza l'assenza di utenti malintenzionati, ovvero di utenti che cerchino attivamente di superare con ogni mezzo i limiti imposti.
resolv.conf
Non definito per i client debian, poiché gestito tramite network-manager (men che meno per quelli windows).
Definito nel caso del server come:
search small.lan nameserver 127.0.0.1
named.conf.local
// // Do any local configuration here // include "/etc/bind/rndc.key"; controls { inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; }; }; zone "small.lan" { type master; file "/etc/bind/db.small"; allow-update { key rndc-key; }; }; zone "1.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168.1"; allow-update { key rndc-key; }; }; // Consider adding the 1918 zones here, if they are not used in your // organization //include "/etc/bind/zones.rfc1918";
named.conf.options
options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 allow-query { 127.0.0.1; 192.168.1/24; } ; allow-transfer { none; } ; allow-recursion { 127.0.0.1; 192.168.1/24; } ; // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. forwarders { 208.67.220.220; 212.216.112.112; 208.67.222.222; 212.216.172.62; }; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; };
db.small
$ORIGIN . $TTL 2592000 ; 30 giorni small.lan IN SOA server.small.lan. admin.small.lan. ( 2012020713 ; serial 86400 ; refresh (1 day) 28800 ; retry (8 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) IN NS server.small.lan. $ORIGIN small.lan. router IN A 192.168.1.1 server IN A 192.168.1.100 PC1 IN A 192.168.1.105 PC2 IN A 192.168.1.106 PC3 IN A 192.168.1.107 PC4 IN A 192.168.1.108 PC5 IN A 192.168.1.109 PC6 IN A 192.168.1.110 PC7 IN A 192.168.1.111 ST1 IN A 192.168.1.116 ST2 IN A 192.168.1.117 ST3 IN A 192.168.1.118 alias1 IN CNAME server alias2 IN CNAME server
Attraverso CNAME è possibile definire degli alias per dei record precedentemente definiti, fatto che torna utile se per esempio si ha necessità di accedere ad una macchina attraverso differenti nomi, come nel caso di un server che ospiti diversi servizi (web server, server di posta, server ftp, ecc.). Alternativamente si potrebbero inserire altri record associando all'ip differenti nomi.
db.192.168.1
$ORIGIN . $TTL 2592000 ; 30 giorni 1.168.192.in-addr.arpa IN SOA server.small.lan. admin.small.lan. ( 2012020713 ; serial 86400 ; refresh (1 day) 28800 ; retry (8 hours) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) IN NS server.small.lan. $ORIGIN 1.168.192.in-addr.arpa. 1 IN PTR router.small.lan. 100 IN PTR server.small.lan. 105 IN PTR PC1.small.lan. 106 IN PTR PC2.small.lan. 107 IN PTR PC3.small.lan. 108 IN PTR PC4.small.lan. 109 IN PTR PC5.small.lan. 110 IN PTR PC6.small.lan. 111 IN PTR PC7.small.lan. 116 IN PTR ST1.small.lan. 117 IN PTR ST2.small.lan. 118 IN PTR ST3.small.lan.
NON è possibile associare ad un indirizzo IP più di un nome di rete, diversamente dal file db.dune. Quindi non più di una direttiva PTR per IP e niente alias.
Approfondimenti
Sitografia
- Bind9, debian wiki.
- ISC official documentation.
- Zytrax DNS open guide
Guida scritta da: Wtf 22:27, 5 mag 2019 (CEST) | Debianized 20% |
Estesa da: | |
Verificata da: | |
Verificare ed estendere la guida | Cos'è una guida Debianized |