:: DJBDNS


Nome del pacchetto:   djbdns
Sito di riferimento:   http://cr.yp.to/djbdns.html
Autore:   D. J. Bernstein
Versione presentata:   v. 1.05
Categoria port:   DNS

:: Descrizione del pacchetto

Djbdns è stato sviluppato da Dan Bernstein per poter rimpiazzare e/o integrare il più ben noto software BIND. E' composto da una serie di programmi ognuno dei quali offre funzionalità differenti a seconda delle necessità.

Utilità utente
 
  • axfr-get
Client usato per il trasferirmento di zona di un determinato dominio.
  • dnsfilter
Utility per convertire gli indirizzi ip in nomi degli host.
  • dnsip
Utility per convertire i nomi degli host in indirizzi ip.
  • dnsipq
Utility per ricercare il nome qualificato di un determinato indirizzo ip.
  • dnsname
Utility per ricercare il nome dell'host di un determinato indirizzo ip.
  • dnstxt
Utility per ricercare record di tipo txt.
  • dnsmx
Utility per ricercare record di tipo mx.
Utilità amministratore
 
  • dnsq
Utility per effettuare query non ricorsive ad un server dns.
  • dnsqr
Utility per effettuare query ad un server dns.
  • dnstrace
Utility per tracciare il percorso dei server dns interessati nella risoluzione di una determinata query a partire da un prefissato root server.
  • dnstracesort
Utility per rielaborare il file di output di dnstrace in una forma più accattivante..
Server
 
  • axfrdns
Server per consentire i trasferimenti di zona di un determinato dominio.
  • dnscache
Server per la memorizzare i risultati delle query ai server dns.
  • rbldns
Server per consentire la risoluzione ricorsiva delle query.
  • tinydns
Server dns abilitato a rispondere con le sole informazioni presenti nel proprio database.
  • walldns
Server per consentire la risoluzione inversa delle query.
Ognuno di questi software può, ed in alcuni casi deve, lavorare in stretta simbiosi con le daemontools le quali provvedono a creare un ambiente più sicuro e controllato (per esempio impostando alcuni parametri quali il nome utente sotto il quale far girare l'applicativo e/o la directory dove effettuare il chroot e/o le risorse massime di sistema a disposizione).

:: Installazione

Installiamo il pacchetto dalla lista dei ports del nostro sistema con i comandi:

# cd /usr/ports/net/djbdns
# make
# make install
# make clean
# mkdir /usr/local/service
# pw useradd dnslog -u 2000 -d /nonexistent -s /sbin/nologin

E l'installazione è completata.
A questo punto, data la grande modularità di questo pacchetto è necessario scegliere i moduli da installare stando ovviamente attenti a non far girare degli applicativi che utilizzino lo stesso tipo e numero di porta sullo stesso indirizzo ip.


tinydns
tinydns è un server dns (porta udp 53) che si limita a rispondere alle query mediante l'utilizzo del solo proprio database. Per installarlo basta semplicemente digitare:

# pw useradd tinydns -u 2001 -d /usr/local/service/tinydns -s /sbin/nologin -g nogroup
# tinydns-conf tinydns dnslog /usr/local/service/tinydns 1.2.3.4

Con il primo comando si crea un utente chiamato tinydns che verrà usato dallo stesso programma durante il suo funzionamento. Mentre con il secondo viene creata la struttura delle directory necessarie al funzionamento del software stesso. E' bene notare che:
- tinydns e dnslog sono i nomi degli utenti usati rispettivamente dai programmi tinydns e multilog;
- /usr/local/service/tinydns è la directory dove si vuole installare il server dns;
- mentre 1.2.3.4 è l'indirizzo di rete del computer locale da dove si vuole che il server accetti le chiamate.

dnscache
dnscache è un software (porta udp 53) in grado di risolvere e memorizzare i risultati delle query ricevute. Per installarlo basta semplicemente digitare:

# pw useradd dnscache -u 2002 -d /usr/local/service/dnscache -s /sbin/nologin -g nogroup
# dnscache-conf dnscache dnslog /usr/local/service/dnscache 1.2.3.4

Con il primo comando si crea un utente chiamato dnscache che verrà usato dallo stesso programma durante il suo funzionamento. Mentre con il secondo viene creata la struttura delle directory necessarie al funzionamento del software stesso. E' bene notare che:
- dnscache e dnslog sono i nomi degli utenti usati rispettivamente dai programmi dnscache e multilog;
- /usr/local/service/dnscache è la directory dove si vuole installare il server dns;
- mentre 1.2.3.4 è l'indirizzo di rete del computer locale da dove si vuole che il server accetti le chiamate.

axfrdns
axfrdns è un programma (porta tcp 53) che consente il trasferimento di determinati domini contenuti nel file data di tinydns. E' quindi necessario aver precedentemente installato e configurato tinydns.
Per installarlo basta semplicemente digitare:

# pw useradd axfrdns -u 2003 -d /usr/local/service/axfrdns -s /sbin/nologin -g nogroup
# axfrdns-conf axfrdns dnslog /usr/local/service/axfrdns /usr/local/service/tinydns 1.2.3.4

Con il primo comando si crea un utente chiamato axfrdns che verrà usato dallo stesso programma durante il suo funzionamento. Mentre con il secondo viene creata la struttura delle directory necessarie al funzionamento del software stesso. E' bene notare che:
- axfrdns e dnslog sono i nomi degli utenti usati rispettivamente dai programmi axfrdns e multilog;
- /usr/local/service/dnscache è la directory dove si vuole installare il server dns;
- /usr/local/service/tinydns è la directory dove è stato installato tinydns e da dove verranno prelevati i dati;
- mentre 1.2.3.4 è l'indirizzo di rete del computer locale da dove si vuole che il server accetti le chiamate.

daemontools
Una volta creata la struttura delle directory dove sono collocati i dati dei vari programmi basterà semplicemente richiamare l'utility svscan con la seguente sintassi:

# svscan /usr/local/service &

Svscan si occuperà di controllare che ciascuno dei software installati nella directory /usr/local/service sia sempre funzionante. In caso contrario tenterà di riavviarlo. Per fare in modo che l'avvio di tutto questo avvenga in modo automatico è necessario compiere i seguenti passi:

# cd /usr/local/etc/rc.d
# vi djbdns.sh
[CONTENUTO DEL FILE]
#!/bin/sh

case "$1" in
start)
        exec env - PATH="/usr/local/bin:$PATH" \
        /usr/local/bin/svscan /usr/local/service&
        echo -n ' tinydns'
        echo -n ' dnscache'
        echo -n ' axfrdns'
        exit 0
        ;;
stop)
        /usr/bin/killall svscan
        /usr/local/bin/svc -d /usr/local/service/tinydns
        /usr/local/bin/svc -d /usr/local/service/tinydns/log
        /usr/local/bin/svc -d /usr/local/service/dnscache
        /usr/local/bin/svc -d /usr/local/service/dnscache/log
        /usr/local/bin/svc -d /usr/local/service/axfrdns
        /usr/local/bin/svc -d /usr/local/service/axfrdns/log         /usr/bin/killall supervise
        echo -n ' tinydns'
        echo -n ' dnscache'
        echo -n ' axfrdns'
        exit 0
        ;;
*)
        echo "Usage: `basename $0` {start|stop}" >&2
        exit 0
        ;;
esac

Da notare che lo script andrà poi personalizzato a seconda delle directory dove si sono installati e configurati gli applicativi che si vogliono far girare sul proprio computer.

:: Configurazione

Questo programma, così come gli altri compresi nel pacchetto djbdns, una volta installati presentano una gerarchia delle directory molto simile. Brevemente possiamo sintetizzarla in questo modo:

Directory

[/usr/local/service]
+ tinydns
|            > run
+------- env
|            > IP
|            > ROOT
+------- log
|            > run
|            +------- main
|            > current
+------- root
|            > data
|            > data.cdb

Passiamo ora ad illustrare il significato di ciascuno di questi files:
run* contengono i comandi che svscan deve eseguire per poter avviare tinydns e multilog;
current* archivia tutti i messaggi di log elaborati dal programma multilog;
ROOT* generalmente ha la stringa "/usr/local/service/tinydns/root" perchè indica al server dns dove trovare il database del o dei domini;
IP indica a tinydns da quale indirizzo ip del computer locale ricevere le query. Il suo valore di default è 0.0.0.0 e stà ad indicare tutti gli indirizzi ip disponibili. E' comunque possibile modificarlo ed assegnare un solo indirizzo;
data.cdb versione compilata del file data;
data database dei domini utilizzati dal server dns.

* (generalmente non vanno modificati)

Per poter inserire nel file data le informazioni necessarie a far funzionare correttamente il server dns è necessario seguire un preciso formato, qui di seguito sintetizzato:

%lo:1.2.3
  definisce una stringa lo di uno o due caratteri al massimo che se indicata su ognuno dei record seguenti permette di condizionare le risposte del server dns a seconda dell'indirizzo ip del client. (nell'esempio riportato gli indirizzi ip interessati sono quelli 1.2.3.*).
Zrete.dom:server.rete.dom:root.server.rete.dom:numeroseriale:16384:2048:1048576:2560:ttl:timestamp:lo
  definisce un record di tipo SOA (start of authority) dove:
  • rete.dom il dominio per il quale si autoritativi;
  • server.rete.dom il nome del server autoritativo per il dominio specificato;
  • root.server.rete.dom indirizzo di posta elettronica del responsabile del servizio;
  • numeroseriale un numero a piacere che va incrementato ogni volta che si modificano i dati perchè i server secondari confrontano il numero seriale prima di effettuare un trasferimento di zona;
  • 16384 (refresh time) il periodo di tempo in secondi entro il quale un server secondario controllerà il database del server autoritativo;
  • 2084 (retry time) il periodo di tempo in secondi entro il quale un server secondario ritentererà a contattare il server autoritativo nel caso in cui non vi sia riuscito prima;
  • 1048576 (expire time) il periodo di tempo in secondi dopo il quale il server secondario, non riuscendo a contattare il server autoritativo, smetterà di propagarne i dati;
  • 2560 (min time);
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client.
&rete.dom:1.2.3.4:server.rete.dom:ttl:timestamp:lo
  definisce un record di tipo NS ed A dove:
  • rete.dom il dominio per il quale il server è in grado di rispondere alle query;
  • 1.2.3.4 è l'indirizzo ip del server dns;
  • server.rete.dom il nome del server dns;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client.
=server.rete.dom:1.2.3.4:ttl:timestamp:lo
  definisce un record di tipo A e PTR dove:
  • server.rete.dom il nome del computer;
  • 1.2.3.4 è l'indirizzo ip del computer;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client.
+server1.rete.dom:1.2.3.4:ttl:timestamp:lo
  scopo del presente record è quello di definire un record di tipo A senza definirne uno di tipo PTR. il suo principale ambito di applicazione è nella definizione di un nome aggiuntivo ad un computer.
  • server1.rete.dom il nome aggiuntivo del computer;
  • 1.2.3.4 è l'indirizzo ip del computer;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client
@rete.dom:1.2.3.4:server.rete.dom:5:ttl:timestamp:lo
  definisce un record di tipo MX dove:
  • rete.dom il nome del dominio o del computer a cui è indirizzata la posta;
  • 1.2.3.4 è l'indirizzo ip del computer che gestirà la posta;
  • server.rete.dom è il nome del computer che è abilitato a gestire la posta;
  • 5 è la priorità assegnata a tale server (0 è il valore più grande) ed è significativo solo in presenza di più record MX;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client
-server.rete.dom:1.2.3.4:ttl:timestamp:lo
  scopo di questo record è quello di eliminare momentaneamente un record di tipo A senza dover cancellare la riga che lo ha definito.
  • server.rete.dom il nome del computer;
  • 1.2.3.4 è l'indirizzo ip del computer;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client
'server.rete.dom:stringa:ttl:timestamp:lo
  definisce un record di tipo TXT dove:
  • server.rete.dom il nome del computer;
  • stringa è il testo associato a tale nome;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client
Cnome.rete.dom:server.rete.dom:ttl:timestamp:lo
  definisce un record di tipo CNAME dove:
  • nome.rete.dom il nome aggiuntivo che si vuole assegnare al computer;
  • sever.rete.dom è il record di tipo A assegnato precedentemente;
  • ttl (time to live) il periodo in secondi entro il quale i server dns conservano le informazioni, precedentemente reperite, nella loro cache;
  • timestamp la data e l'ora fino alla quale o dalla quale il server dns fornirà la presente informazione (in questo caso un record di tipo SOA);
  • lo la stringa utilizzata per differenziare le risposte a seconda dell'indirizzo ip del client

Per poter chiarire meglio ciò appena illustrato qui di seguito viene riportato un esempio:>

# cd /usr/local/service/tinydns/root
# vi data
[CONTENUTO DEL FILE]
Zrete.dom:server.rete.dom:root.server.rete.dom:20011115
&rete.dom:1.2.3.4:server.rete.dom
=server.rete.dom:1.2.3.4
@rete.dom:1.2.3.4:server.rete.dom:5
@server.rete.dom:1.2.3.4:server.rete.dom:0

Z3.2.1.in-addr.arpa:server.rete.dom:root.server.rete.dom:2001111
&3.2.1.in-addr.arpa:1.2.3.4:server.rete.dom

# make

dnscache
E' bene ricordare che dnscache pur non essendo un server dns vero e proprio, ne imita molto il comportamento in quanto accetta le query dai client abilitati e provvede ad interrogare i server dns appropriati. Al termine di questa routine provvederà poi, se abilitato, alla memorizzazione del risultato al fine di evitare inutili e ridondanti interrogazioni.

Directory

[/usr/local/service]
+ dnscache
|             > run
+------- env
|             > IP
|             > IPSEND
|             > DATALIMIT
|             > CACHESIZE
|             > ROOT
+------- log
|             > run
|             +------- main
|                         > current
+------- root
|             +------- ip
|                         > 1.2.3
|             +------- servers
|                         > @

run* contengono i comandi che svscan deve eseguire per poter avviare dnscache e multilog;
current* archivia tutti i messaggi di log elaborati dal programma multilog;
ROOT* generalmente ha la stringa "/usr/local/service/dnscache/root" perchè in essa sono contenuti i parametri di risoluzione delle query;
IP e IPSEND indicano a cachedns da quale indirizzo ip del computer locale ricevere le query. Il suo valore di default è 0.0.0.0 e stà ad indicare tutti gli indirizzi ip disponibili. E' comunque possibile modificarlo ed assegnare un solo indirizzo;
CACHESIZE imposta il limite, in bytes, della cache impiegata per archiviare i risultati delle query;
DATALIMIT imdica il limite massimo di memoria utilizzabile da dnscache;
le directory ip e server contengono i files che permettono rispettivamente di autorizzare determinati indirizzi ip di possibili client e tenere traccia dei server da contattare per la risoluzione delle query a determinati domini.

* (generalmente non vanno modificati)

Per indicare ad esempio che solamente i client con indirizzo ip 1.2.3.* possono interrogare il dns cache è necessario eseguire il seguente comando:

# touch /usr/local/service/dnscache/root/ip/1.2.3

Nella directory /usr/local/service/dnscache/root/servers è presente un file @ nel quale sono indicati gli indirizzi ip dei root server da contattare nel caso in cui non sia diversamente specificato. Nel caso in cui invece si voglia abbinare uno o più servers ad un determinato dominio (ad esempio rete.dom) è sufficente compiere i seguenti passi:

# vi /usr/local/service/dnscache/root/servers/rete.dom
[CONTENUTO DEL FILE]
1.2.3.4
# vi /usr/local/service/dnscache/root/servers/3.2.1.in-addr.arpa
[CONTENUTO DEL FILE]
1.2.3.4


axfrdns
La gerarchia delle directory in axfrdns è la seguente:

[/usr/local/service]
|             > run
|             > tcp
|             > tcp.cdb
+------- env
|             > IP
|             > ROOT
+------- log
|             > run
|                         +------- main
|                                     > current

run* contengono i comandi che svscan deve eseguire per poter avviare axfrdns e multilog;
current* archivia tutti i messaggi di log elaborati dal programma multilog;
ROOT* generalmente ha la stringa "/usr/local/service/dnscache/root" perchè in essa sono contenuti i parametri di risoluzione delle query;
IP e IPSEND indicano a cachedns da quale indirizzo ip del computer locale ricevere le query. Il suo valore di default è 0.0.0.0 e stà ad indicare tutti gli indirizzi ip disponibili. E' comunque possibile modificarlo ed assegnare un solo indirizzo;
tcp.cdb versione compilata del file tcp;
tcp database degli host abilitate al trasferimento di zona di determinati domini;

* (generalmente non vanno modificati)

La sintassi del file tcp è molto simile a quella usata per configurare il pacchetto ucspi-tcp:

# vi /usr/local/service/axfrdns/tcp
[CONTENUTO DEL FILE]
1.2.3.4:deny,AXFR="rete.dom/3.2.1.in-addr.arpa"
1.2.3.:allow,AXFR="rete.dom/3.2.1.in-addr.arpa"
# make

con la prima riga si nega il trasferimento di zona dei due domini al computer con indirizzo 1.2.3.4 mentre con la seconda si autorizza tutti i client della 1.2.3.*; ma in entrambi i casi solo per i domini specificati.

 

:: Tools

axfr-get
axfr-get è una utility che permette il trasferimento di zona di un determinato dominio. Il formato con il quale i dati vengono salvati su disco è perfettamente corrispondente a quello usato dal server tinydns. La sintassi è la seguente:

# axfr-get rete.dom data data.tmp

oppure in alternativa:

# tcpclient 1.2.3.4 53 axfr-get rete.dom data data.tmp

dove rete.dom è il dominio di cui si vuole effettuare il trasferimento; dove data è il nome del file sul quale salvare il risultato; dove data.tmp è il file provvisorio creato.
La differenza tra i due comandi è che il primo utilizza l'indirizzo del server dns indicato dalla direttiva nameserver contenuta del file /etc/resolv.conf mentre il secondo interroga direttamente il server dns all'indirizzo 1.2.3.4.
Questa utility si collega al server autoritativo per il dominio specificato alla porta tcp 53 ed effettua, se autorizzato, il prelievo dei dati. Se il file data esiste già axfr-get confronta i numeri seriali ed effettua il trasferimento solo se quello fornito dal server dns è maggiore di quello presente nel file data.


dnsfilter
dnsfilter è una utility che una volta avviata attende l'immissione da parte dell'utente di una serie di indirizzi ip che provvederà immediatamente alla conversione in nomi dns qualificati.
Per interrompere l'immissione dei dati basterà semplicemente premere i tasti Ctrl+c.


dnsip
dnsip è una utility che converte il nome fornito nella riga di comando nel rispettivo indirizzo ip. La sintassi è la seguente:

# dnsip server.rete.dom

dove server.rete.dom è il nome del computer di cui si vuole conoscere l'indirizzo di rete.


dnsipq
Il comportamento di dnsipq è molto simile a quello di dnsip se non per il fatto che oltre a fornire l'indirizzo di rete visualizza anche il nome qualificato. La sintassi è la seguente:

# dnsipq server.rete.dom

dove server.rete.dom è il nome del computer di cui si vuole conoscere l'indirizzo di rete.


dnsname
dnsname visualizza il nome qualificato dell'indirizzo di rete fornito. Nel caso in cui vengano forniti più indirizzi il programma si limiterà a compiere tale operazione per ognuno dei valori impartiti. La sintassi è la seguente:

# dnsname 1.2.3.4

dove 1.2.3.4 è l'indirizzo o gli indirizzi di cui si vuole conoscere il rispettivo nome qualificato.


dnsmx
dnsmx ricerca i record mail exchange per un determinato dominio. La sintassi è la seguente:

# dnsmx rete.dom

dove rete.dom è il dominio od il nome del computer per il quale ricercare record di tipo mx. Se inesistente qualsiasi record di questo tipo, dnsmx scrive il risultato simulando il comportamente di un qualsiasi MTA.


dnstxt
dnstxt ricerca record di tipo txt associati ad un determinato host. La sintassi è la seguente:

# dnstxt server.rete.dom

dove server.rete.dom è il nome del computer per il quale ricercare record di tipo txt.


dnsqr
dnsqr effettua delle query ricorsive per estrapolare da un determinato dominio tutti i records di un certo tipo. La sintassi è la seguente:

# dnsqr tipo server.rete.dom

dove tipo è il tipo di record da ricercare e puo essere: a, any, soa, ns, aaaa, mx, cname, ptr, hinfo, rp, sig, key, axfr; dove server.rete.dom è il nome del dominio dal quale estrapolare il tipo di informazione richiesta.


dnsq
dnsq effettua delle query non ricorsive ad un determinato server dns per estrapolare da un determinato dominio tutti i records di un certo tipo. La sintassi è la seguente:

# dnsq tipo rete.dom server.rete.dom

dove tipo è il tipo di record da ricercare e puo essere: a, any, soa, ns, aaaa, mx, cname, ptr, hinfo, rp, sig, key, axfr;
dove rete.dom è il nome del dominio dal quale estrapolare il tipo di informazione richiesta;
dove server.rete.dom è il nome del server dns da interrogare.

[ Pagina principale ]