Bind: differenze tra le versioni

14 533 byte aggiunti ,  10 mag 2019
 
(10 versioni intermedie di uno stesso utente non sono mostrate)
Riga 15: Riga 15:
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>
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 ===
=== Importante ===
Riga 35: Riga 40:
== Configurazione ==
== 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 />
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 nel caso di Lenny e precedenti <code>/etc/bind/named.conf</code>, mentre nel caso di Squeeze <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 />
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 />
Sebbene in Lenny e precedenti sia possibile definire tutto nel file <code>/etc/bind/named.conf</code> in questa guida si opterà per inserire le nostre zone "locali" in un file apposito, chiamato <code>/etc/bind/named.conf.local</code> (metodologia divenuta standard in Squeeze, come già detto).


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:
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:
Riga 196: Riga 200:
=== Riavvio del server ===
=== Riavvio del server ===
Fatta la configurazione, bisogna riavviare il demone bind9:
Fatta la configurazione, bisogna riavviare il demone bind9:
<pre>
<pre># systemctl restart bind9</pre>
# /etc/init.d/bind9 restart
</pre>


=== Risoluzione di indirizzi internet ===
=== Risoluzione di indirizzi internet ===
Riga 228: Riga 230:


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.
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]]
2 894

contributi