ISC DHCP: differenze tra le versioni

16 985 byte aggiunti ,  10 mag 2019
Riga 150: Riga 150:
Ora, un riavvio del demone <code>isc-dhcp-server</code> completerà l'opera, ed avremo una rete con i PC che prendono la configurazione IP da un server DHCP, il quale  aggiorna dinamicamente il server DNS in modo tale che tutte le  operazioni di risoluzione dei nomi host avvengano correttamente sull'intera rete locale.<br>
Ora, un riavvio del demone <code>isc-dhcp-server</code> completerà l'opera, ed avremo una rete con i PC che prendono la configurazione IP da un server DHCP, il quale  aggiorna dinamicamente il server DNS in modo tale che tutte le  operazioni di risoluzione dei nomi host avvengano correttamente sull'intera rete locale.<br>
Il vantaggio di questa soluzione è l'elevata automatizzazione dei processi descritti, che comporta un intervento dell'amministratore di sistema che si limita alla configurazione iniziale ed alla normale manutenzione del server, senza dover svolgere noiosi, inutili e ripetitivi aggiornamenti manuali.
Il vantaggio di questa soluzione è l'elevata automatizzazione dei processi descritti, che comporta un intervento dell'amministratore di sistema che si limita alla configurazione iniziale ed alla normale manutenzione del server, senza dover svolgere noiosi, inutili e ripetitivi aggiornamenti manuali.
=== Alcune note generali ===
Visionando i manuali  ''dhcpd.conf'' e ''dhcpd-options'' si sarà probabilmente soppraffatti  dall'enorme mole di dati. Qui si vogliono sottolineare alcuni concetti  presenti nell'introduzione del manuale di ''dhcpd.conf'' (che fornisce molte informazioni importanti sulla logica di funzionamento di dhcp).<br>
Esistono due tipi di direttive utilizzabili nel file ''dhcpd.conf'':
* '''Parametri''': quantificano o dicono come fare qualcosa, definiscono se una certa operazione è permessa o meno. Per alcuni parametri è possibile assegnare un valore che non sia solo una costante, ma il risultato dell'elaborazione di una o più espressioni. È poi possibile distingeure tra parametri che influiscono esclusivamente sul server e parametri che riguardano i client; il nome di questi ultimi è composto in genere da due parti, la prima fissa e pari a "option" la seconda variabile. Si noti che questi parametri possono spesso essere definiti anche lato client attraverso il file ''dhclient.conf'', almeno su macchine linux. Naturalmente nessun client può imporre i valori di un parametro "option" al server a meno che l'amministratore non abbia deciso di permettere una cosa simile; vale anche il contrario, ma in tal caso perderebbe di significato la scelta di permettere una configurazione di rete automatica tramite dhcp.
* '''Dichiarazioni''': forniscono informazioni sulla topologia della rete, descrivono client e subnet, permettono di raggruppare parametri o altre dichiarazioni.
Nel caso di parametri d'avvio (boot parameters) definiti più volte, ma all'interno di differenti dichiarazioni, per determinare quali di questi un client deve adottare vale il principio di maggior specificità; per esempio un parametro presente all'interno della dichiarazione ''host'' prevale su qualsiasi parametro definito altrove: ''class'', ''pool'', ''subnet'', ''shared-network''.<br>
Segue una breve descrizione di alcune dichiarazioni disponibili:
* '''host''', contiene parametri e dichiarazioni relative ad uno specifico dispositivo fisico. Perché questo sia identificato univocamente è necessario dare un nome unico alla dichiarazione ''host'' e definire al suo interno il parametro ''hardware''. Si noti che il nome dato ad una dichiarazione ''host'' è del tutto arbitrario poiché completamente slegato dall'hostname del dispositivo fisico cui si fa riferimento; in caso di aggiornamento dinamico dei record DNS è possibile sostituire all'hostname del dispositivo uno di propria scelta attraverso il parametro ''ddns-hostname''. Dispositivi privi di una dichiarazione host vengono classificati come sconosciuti, cioè ''unknown-clients''.
* '''class''', permette di attribuire uno stesso set di parametri e o dichiarazioni a più dispositivi che non siano definiti dalla direttiva ''host''.
* '''pool''', associa set di parametri e/o dichiarazioni a specifici gruppi di indirizzi dinamici. Ogni dichiarazione ''pool'' deve contenere almeno uno di questi gruppi di indirizzi specificati attraverso la direttiva ''range'' ed è possibile regolarne l'accesso da parte dei vari client attraverso i parametri ''allow'', ''deny'' e ''ignore''. Ogni ''pool'' deve necessariamente essere inserita dopo le dichiarazioni ''subnet'' cui fa riferimento attraverso la definizione di ''range'', o al limite all'interno delle stesse (prestare attenzione alle pool che contengono intervalli di indirizzi appartenenti a più subnet).
* '''subnet''', dichiarazione obbligatoria per ogni subnet che il server dhcp dovrà gestire. Eventuali parametri e dichiarazioni di valità generale, purché strettamente legati alla subnet, possono essere inclusi nella specifica dichiarazione ''subnet''. Si noti che i parametri ''allow'', ''deny'' e ''ignore'' se definiti all'interno di questa dichiarazione prevalgono su quelli omonimi eventualmente specificati all'interno delle dichiarazioni ''pool''. L'assegnazione di un client ad una certa subnet avviene esclusivamente sulla base dell'indirizzo IP associato al medesimo.
* '''shared-network''', è obbligatorio fare una dichiarazione di questo tipo per ogni gruppo di subnet che condividono la stessa infrastruttura fisica. Si noti che in ogni caso dhcp provvede a creare autonomamente una dichiarazione ''shared-network'' nel caso si dichiari una sola subnet.
* '''group''', questa dichiarazione permette di raggruppare come le precedenti parametri e dichiarazioni di vario tipo, tuttavia se ne raccomanda l'utilizzo solo per accorpare quei parametri e dichiarazioni non strettamente legate ad una subnet.
==== Allow e Deny known/unknown clients ====
È importante prestare molta attenzione al parametro '''deny''' ''known/unknown clients'', infatti quando viene dichiarato in un certo ambito seguirà necessariamente che tutti gli ambiti più specifici ne saranno influenzati. Supponiamo per esempio di avere diversi intervalli di indirizzi IP e che la maggior parte di essi non debbano essere accessibili ai dispositivi sconosciuti; si potrebbe allora essere tentati di piazzare un bel ''deny unknown-clients'' a livello di ''shared-network'' o ''subnet'' e poi di dichiare ''allow unknown-clients'' nei singoli intervalli. Grave errore.<br>Quando un client contatta il server dhcp questi cerca un indirizzo IP e inizializza i vari parametri da passare al client; il server cerca una dichiarazione ''host'' per il client e non trovandola lo classifica come sconosciuto; successivamente valuta le dichiarazioni ''class'' (che supponiamo assenti) e poi quelle di tipo ''pool'', dove risulta che per tutte è possibile l'accesso da parte di client sconosciuti, poiché se non viene dichiarato ne ''allow'' ne ''deny'' chiunque ha accesso al range di indirizzi in oggetto.<br>
Il passo successivo è valutare le dichiarazioni ''subnet'' e ''shared-network'', dove per ipotesi il server troverà sicuramente la dichiarazione ''deny unknown-hosts''; poiché tale parametro non è mai stato definito in precedenza segue immediatamente che ''subnet'' o ''shared-network'' sono gli ambiti di definizione più specifici per il parametro, quindi quelli dove viene determinato il valore di ''deny'' per quanto riguarda l'accesso ai range di indirizzi (''allow'' e ''deny'' possono essere contemporaneamente usati anche per valutare altri aspetti) di tutte le ''pool''<br>
Ricapitolando si ha che per la maggioranza delle dichiarazioni ''pool'' risulta definito il solo parametro ''deny unknown-clients'' come effettivamente desiderato, mentre per le rimanenti risultano definiti contemporaneamente ''deny unknown-clients'' e ''allow unknown-clients''. Come esplicitamente scritto nel manuale, qualora per un range di IP risultino definiti sia i parametri ''allow'' che ''deny'' il client può averne accesso solo se appartiene alla lista dei client permessi e contemporaneamente NON appartiene a quella dei client impediti. Risulta quindi evidente che avendo scelto di discriminare l'accesso sulla base di conosciuto/sconosciuto tutti i client sconosciuti si vedranno impedito l'accesso ad ogni ''pool'', poiché al più soddisfano la condizione ''allow'', ma non quella ''deny''.<br>L'unica soluzione, a meno di non optare per una valutazione basata sull'utilizzo delle classi invece della parola chiave conosciuto/sconosciuto, è quella di definire il solo parametro ''deny unknown-clients'' nelle ''pool'' dove si vuole negare l'accesso ai client sconosciuti.
==== Conoscere i dettagli del ''lease'' concesso da client ====
È possibile visualizzare i dettagli dei dati che il proprio client ha ricevuto dal server dhcp leggendo i file contenuti nella cartella <code>/var/lib/dhcp/</code> del client stesso.
==== Assegnazione dinamica degli IP ====
Prima di presentare quella che è una traduzione dell'omonimo paragrafo del manuale si vuole riportare sinteticamente un paio di sequenze tipiche di una procedura per l'ottenimento di un IP da parte di un client.<br>
'''Caso A'''
# Il client invia un messaggio ''DHCPDISCOVER'' al server.
# Il server riesce a trovare un indirizzo valido e lo propone al client con un messaggio ''DHCPOFFER''.
# Il client accetta l'offerta e risponde al server con un messaggio ''DHCPREQUEST''.# Il server conferma il ''lease'' ("prestito") dell'indirizzo IP al client tramite un messaggio ''DHCPACK''.
# Il client può usare l'IP alle condizioni definite dal ''lease'' senza bisogno di contattare ulteriormente il server.
'''Caso B'''
# Il client ritiene di essere già in possesso di un ''lease'' valido ed invia un messaggio ''DHCPREQUEST'' al server.
# Il server risponde che la sua richiesta non è valida e gli invia un messaggio ''DHCPNAK''.
# Il client invia un messaggio ''DHCPDISCOVER'' al server.
# Se non ci sono problemi si prosegue esattamente come nel caso A.
{{Box|NOTA| La procedura di assegnazione di un indirizzo IP non può che iniziare dai client, pertanto dispositivi configurati staticamente e server DHCP non si parleranno mai, se non in forma assai limita come descritto nel paragrafo relativo alla prevenzione dei conflitti tra indirizzi IP.}}
===== Traduzione =====
L'allocazione dinamica avviene effettivamente quando il client si trova nello stato INIT e ha già inviato al server un messaggio di tipo ''DHCPDISCOVER''. Qualora il client ritenga di possedere già un ''lease'' valido ed abbia già provveduto ad inviare un messaggio di tipo ''DHCPREQUEST'' per inizializzare o rinnovare il predetto ''lease'', si hanno tre modi in cui il server può comportarsi:
* ignorare il messaggio ''DHCPREQUEST'' del client;
* rispondere con un messaggio ''DHCPNAK'' per informare il client di non usare più quell'indirizzo;
* rispondere con un messaggio ''DHCPPACK'' per informare il client che può continuare ad usarlo per un po';
Se il server trova l'indirizzo che il client richiede e quell'indirizzo è disponibile per il client, il server manderà un ''DHCPACK''. Se l'indirizzo non è più disponibile, o se al client non è permesso di usarlo, il server manderà un ''DHCPNAK''.
Se il server non ha alcun tipo di informazione sull'indirizzo eviterà di rispondere, a meno che l'indirizzo non sia corretto per il segmento di rete al quale il client è collegato e il server sia responsabile (''authoritative'', NdT) per il suddetto segmento di rete, nel qual caso invierà un "DHCPNAK" pur non avendo alcuna informazione sull'indirizzo.<br>Potrebbe esserci una dichiarazione ''host'' compatibile con l'identificazione del client se tale dichiarazione ''host'' include una dichiarazione ''fixed-address'' che specifichi un indirizzo IP valido per il segmento di rete al quale il client è connesso. In tal caso il server DHCP non gli allocherà mai dinamicamente un indirizzo, ma gli imporrà di usare l'indirizzo indicato nella dichiarazione ''host''. Qualora il client inviasse altri ''DHCPREQUEST'' per un qualsiasi altro indirizzo, il server risponderà con un  ''DHCPNAK''.<br>
Quando il server DHCP alloca un nuovo indirizzo per un client (si ricordi che ciò può avvenire solo se il client ha precedentemente inviato un ''DHCPDISCOVER''), per prima cosa controlla se il client possiede già un ''lease'' valido oppure se esiste un vecchio indirizzo IP già rilasciato al client, ma non ancora riassegnato ad altri. In quest'ultima circostanza il server verificherà in primis che tale indirizzo possa ancora essere usato dal client e, in caso negativo, provvederà a inserirlo nuovamente nell'elenco degli indirizzi disponibili per essere assegnati. Del resto il fatto che il client abbia mandato un ''DHCPDISCOVER'' prova inequivocabilmente che tale ''lease'' non fosse più utilizzato dallo stesso.<br>
Se nessun precedente ''lease'' viene individuato, o se al client è fatto divieto di ricevere tale ''lease'' preesistente, allora il server esaminerà i gruppi di indirizzi associati al segmento di rete del client in cerca di un ulteriore ''lease'' non occupato e per cui soddisfi i requisiti di assegnazione.Per fare ciò il server esaminerà sequenzialmente ogni dichiarazione ''pool'' (eventuali dichiarazioni ''range'' non incluse in dichiarazioni ''pool'' sono raggruppate in una dichiarazione ''pool'' priva di una lista permessi). Quando viene trovata una ''pool'' la cui lista permessi consente di allocare un indirizzo appartenente ad un intervallo di sua competenza il server verifica che esista un indirizzo non occupato e, se così è, prova ad assegnarglielo.<br>
In caso contrario procede ad esaminare una a una le ''pool'' successive finché non riesce ad assegnare un indirizzo al client. Se al termine della ricerca non è stato possibile individuare alcun indirizzo assegnabile il server si limita a non fornire alcuna risposta.<br>
Qualora venga trovato un indirizzo per cui il client ha i permessi e che non sia mai stato assegnato in precedenza, allora tale indirizzo gli viene allocato immediatamente. Se cade la seconda condizione il server continuerà a cercare un indirizzo sperando di trovarne uno che non sia mai stato dato in uso.<br>
Il server DHCP genera la lista degli IP disponibili a partire da una tabella ''hash'', pertanto gli indirizzi non vengono ordinati seguendo un particolare criterio e risulta impossibile predire l'ordine con cui il server DHCP provvederà ad allocarli. Sebbene gli utenti delle precedenti versioni di ISC DHCP Server possano essersi abituati ad un allocazione degli indirizzi in ordine ascendente, si ribadisce che dalla versione 3 ciò non è più possibile in alcun modo.
==== Prevenzione di possibili conflitti tra indirizzi IP (traduzione) ====
Il server DHCP prima di allocare gli indirizzi IP controlla che questi non siano in uso inviando una richiesta ''ICMP Echo'' all'indirizzo che sta per essere allocato; se entro un secondo non viene ricevuta alcuno risposta ''ICMP Echo'' l'indirizzo viene ritenuto libero. Questa procedura scatta solo per quei ''lease'' specificati nelle varie dichiarazioni ''range'' e soltanto se il server riteneva tale ''lease' libero, come quando un server DHCP o la sua controparte d'emergenza non ha contrassegnato un certo lease come occupato.<br>
Se al contrario il server riceve una risposta ad una richiesta ''ICMP Echo'', allora ipotizza la presenza di un errore di configurazione dovuto al fatto che l'indirizzo IP in questione sia in uso presso un dispositivo di rete che non è un client DHCP. In tale situazione il suddetto indirizzo viene contrassegnato come abbandonato così che non possa essere assegnato ai client.<br>
Se non risultano indirizzi disponibili quando un client ne fa richiesta, il server tenterà di utilizzare uno degli indirizzi contrassegnati come abbandonati. Dopo aver contrassegnato detto indirizzo come libero si ripete la precedente procedura; se non viene ricevuta alcuna risposta ''ICMP Echo'' allora il server procede alla sua assegnazione presso il client.<br>
Il server DHCP non effettua alcuna iterazione degli indirizzi IP abbandonati se il primo che tenta di reclamare risulta libero. Piuttosto, quando riceve il successivo ''DHCPDISCOVER'' dal client tenterà tipicamente una nuova allocazione usando lo stesso metodo qui descritto, ma su un nuovo indirizzo IP.
== Impostare la configurazione del Proxy ==
Oltre ai parametri già visti, è possibile impostare il DHCP Server affinchè rilasci automaticamente anche delle informazioni sulla configurazione del proxy in uso nella LAN. Questo può diventare utile quando sulla LAN è impostato un proxy con autenticazione, ma desideriamo evitare la configurazione manuale di tutti i client della rete.
<br/>
=== Proxy Auto Configuration (PAC) ===
Attraverso un file Javascript collocato nella root di un webserver Apache della LAN è possibile rilasciare automaticamente ai client le istruzioni per l'autoconfigurazione di un proxy server.
<br/>
Creiamo quindi questo file:
<pre>
# touch /var/www/wpad.dat
# chmod 644 /var/www/wpad.dat
# nano /var/www/wpad.dat
</pre>
e diamogli il contenuto:
<pre>
function FindProxyForURL(url, host)
{
if (!isInNet(myIpAddress(), "192.168.1.0", "255.255.255.0"))
return "DIRECT";
return "PROXY 192.168.1.1:3128";
}
</pre>
dove:
* abilitiamo la navigazione sui siti web interni alla LAN senza passare dal proxy
* per la navigazione al di fuori della LAN configuriamo automaticamente il proxy con indirizzo IP 192.168.1.1 e in ascolto sulla porta 3128
Aggiungiamo un puntatore nel file di configurazione della zona di Bind:
<pre>
server        A      192.168.1.1
wpad          CNAME  server
</pre>
A questo punto dobbiamo configurare il server DHCP, agendo sul suo file di configurazione:
<pre>
# nano /etc/dhcp/dhcpd.conf
</pre>
e aggiungendo le opzioni:
<pre>
    option local-proxy-config code 252 = text;
    option local-proxy-config "http://server/wpad.dat";
</pre>
nella sezione generale del file.
<br/>
Infine modifichiamo il file <code>/etc/mime.types</code> affinchè Apache serva correttamente il file, aggiungendo la riga:
<pre>
application/x-ns-proxy-autoconfig              pac dat
</pre>


== Approfondimenti ==
== Approfondimenti ==
3 155

contributi