ISC DHCP

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian
Gateway-Router

Sommario


Info.png Info
Questa guida è essenzialmente la parte dedicata a isc-dhcp-server della vecchia guida "Un server DNS e DHCP su Debian", ma privata delle istruzioni relative a Lenny e dei riferimenti a Squeeze


Introduzione

Definizione di DHCP tratta da wikipedia:
DHCP

Il Dynamic Host Configuration Protocol (DHCP) (protocollo di configurazione IP dinamica) è un Protocollo Applicativo (Ausiliario) che permette ai dispositivi o terminali di una certa rete locale di ricevere automaticamente ad ogni richiesta di accesso, da una rete IP (quale una LAN), la configurazione IP necessaria per stabilire una connessione[...]

In poche parole un server DHCP è quell'applicativo che si occupa di assegnare in automatico gli indirizzi IP a tutti i dispositivi di una rete. Per quanto riguarda questa guida le reti di interesse sono quelle di tipo locale (LAN).

Installazione

Da terminale digitare:

# apt-get install isc-dhcp-server
  ATTENZIONE
Il server DHCP appena installato tenterà subito di avviarsi, ma fallirà, non essendo ancora stato configurato. Non spaventatevi quindi se subito dopo l'installazione ricevete il messaggio "Starting ISC DHCP server: dhcpdcheck syslog for diagnostics. ... failed!".
Basta proseguire nella lettura della guida e tutto andrà a posto


Configurazione

Fare una copia di salvataggio del file di configurazione di esempio, crearne uno nuovo vuoto ed editarlo:

# mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.old
# nano /etc/dhcp/dhcpd.conf

Ora, aggiungere un ambito DHCP con le opzioni del caso che ci permetta di distribuire i parametri della configurazione TCP/IP ai client della LAN, operazioni che si traducono nel seguente contenuto del file dhcpd.conf:

authoritative;
server-identifier 192.168.1.1;
ignore client-updates;
subnet 192.168.1.0 netmask 255.255.255.0
        {
        range 192.168.1.100 192.168.1.150;
        range 192.168.1.200 192.168.1.250;
        option subnet-mask 255.255.255.0;
        default-lease-time 604800; # cioè una settimana
        max-lease-time 2592000; # cioè 30 giorni
        option broadcast-address 192.168.1.255;
        option routers 192.168.1.254;
        option domain-name-servers 192.168.1.1;
        option domain-name "test.lan";
        option netbios-name-servers 192.168.1.1;
        option netbios-node-type 8;
        }

# Assegnare un IP fisso ad un particolare client
host pc_fisso {
  hardware ethernet 00:0D:87:B3:AE:A6;
  fixed-address 192.168.1.150;
}
  • Authoritative, obbligatorio se si tratta dell'unico server dhcp (a tal fine contano anche quelli di router e simili).
  • server-identifier, utile se la propria interfaccia di rete possiede più di un indirizzo IP.
  • ignore client-updates, nega eventuali richieste da parte dei client di aggiornare autonomamente i record DNS.
  • subnet... netmask, dichiarazione obbligatoria per ogni subnet che il server dhcp andrà a servire.
  • range, parametro obbligatorio se si intende assegnare degli indirizzi dinamici; è possibile specificare più di un intervallo come in quest'esempio, oppure anche nessuno se non si prevede di assegnare indirizzi dinamici. È buona pratica evitare di dichiarare intervalli in cui figurino IP statici e/o staticamente assegnati dal server DHCP.
  • default-lease-time, la durata predefinita dell'assegnazione di un indirizzo IP ai client, ovvero quanti secondi devono passare prima che il server rinegozi nuovamente l'IP col client. Si noti che i client possono richiedere durate di assegnazione differente.
  • max-lease-time, la massima durata dell'assegnazione di un indirizzo IP che il server può concedere; in poche parole un client può chiedere che un certo indirizzo IP gli sia assegnato per un numero di secondi compreso tra 1 e max-lease-time.

A questo punto, far partire (o ripartire) il demone isc-dhcp-server per attivare la configurazione:

# systemctl start isc-dhcp-server

Aggiornamento dinamico DNS

Giunti fin qui, rimangono da configurare gli aggiornamenti dinamici del server DNS. In questo caso, come già esposto, sarà il server DHCP ad aggiornare dinamicamente il server DNS, al quale dovremo dire che sono consentiti gli aggiornamenti dinamici solamente da parte degli host coinvolti nel processo.
In questo caso, ipotizzando che DNS e DHCP siano sulla stessa macchina, abiliteremo solamente localhost all'aggiornamento dinamico del server DNS, e come ulteriore misura di sicurezza, specificheremo che l'aggiornamento delle zone coinvolte avverrà solamente utilizzando una chiave segreta che viene creata automaticamente all'installazione di Bind ed il cui nome file è /etc/bind/rndc.key.
Il primo passaggio consiste nel modificare il file /etc/bind/named.conf.local per indicare che il server DNS accetta aggiornamenti dinamici solamente da localhost utilizzando la chiave segreta:

include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; };
};

Un'ulteriore modifica da fare al file /etc/bind/named.conf.local è relativa alle zone create in precedenza, poiché anche in esse è necessario indicare che è possibile l'aggiornamento solamente tramite l'utilizzo della chiave segreta:

zone "test.lan" {
        type master;
        file "/etc/bind/db.test";
        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; };
};

Il file completo, dopo l'aggiunta delle ACL per la gestione del traffico interno e esterno, dovrebbe avere questo contenuto:

acl internals {
    127.0.0.0/8;
    192.168.1.0/24;
};


include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 allow {localhost; } keys { "rndc-key"; };
};


view "internal" {
        match-clients { internals; };
        recursion yes;
        zone "test.lan" {
          type master;
          file "/etc/bind/db.test";
          journal "/var/cache/bind/db.test.jnl";
          allow-update { key rndc-key; };
        };
        zone "1.168.192.in-addr.arpa" {
          type master;
          file "/etc/bind/db.192.168.1";
          journal "/var/cache/bind/db.192.168.1.jnl";
          allow-update { key rndc-key; };
        };
};

Poichè nel file /etc/bind/named.conf.local abbiamo utilizzato la direttiva view, è necessario che tutte le zone di Bind siano configurate all'interno di una propria view.
Si deve quindi modificare anche il file /etc/bind/named.conf.default-zones aggiungendo all'inizio del file le righe:

view "external" {
        match-clients { any; };
        recursion yes;

e alla fine del file la corrispondente chiusura di istruzione:

};

Fatto questo, far ripartire il demone bind9.
Ora, rimane da configurare il server DHCP, il quale sarà incaricato di effettuare gli aggiornamenti sul server DNS, e che quindi dovrà obbligatoriamente "autenticarsi" su Bind utilizzando la chiave segreta /etc/bind/rndc.key.
Ciò si traduce nell'aggiunta delle seguenti opzioni nel file di configurazione /etc/dhcp/dhcpd.conf:

ddns-updates on;
update-static-leases on;    # i client con ip statico sono compresi negli aggiornamenti  
ddns-update-style interim;
ddns-domainname "test.lan.";
ddns-rev-domainname "in-addr.arpa.";
include "/etc/bind/rndc.key";
zone test.lan. {
        primary 192.168.1.1;
        key rndc-key;
        }
zone 1.168.192.in-addr.arpa. {
        primary 192.168.1.1;
        key rndc-key;
        }

L'ultimo passaggio consiste nel rendere la directory /etc/bind scrivibile anche per l'utente bind, in modo tale che Bind possa creare i file di zona con estensione .jnl che contengono i record DNS generati dinamicamente tramite l'aggiornamento di Bind da parte del server DHCP:

# chmod 775 /etc/bind

Verificare che anche i file db.test e db.192.168.1 siano scrivibili da bind (potrebbe succedere che uno o entrambi i file abbiano come proprietario root:bind e che i permessi di gruppo siano di sola lettura).
Ora, un riavvio del demone isc-dhcp-server 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.
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).
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.
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.
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.
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
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.
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 /var/lib/dhcp/ 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.

Caso A

  1. Il client invia un messaggio DHCPDISCOVER al server.
  2. Il server riesce a trovare un indirizzo valido e lo propone al client con un messaggio DHCPOFFER.
  3. 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.
  4. Il client può usare l'IP alle condizioni definite dal lease senza bisogno di contattare ulteriormente il server.

Caso B

  1. Il client ritiene di essere già in possesso di un lease valido ed invia un messaggio DHCPREQUEST al server.
  2. Il server risponde che la sua richiesta non è valida e gli invia un messaggio DHCPNAK.
  3. Il client invia un messaggio DHCPDISCOVER al server.
  4. Se non ci sono problemi si prosegue esattamente come nel caso A.
  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.
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.
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.
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.
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.
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.
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.
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.
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.
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

  Compatibilità
Non ancora verificata per Stretch e successive

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.

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.
Creiamo quindi questo file:

# touch /var/www/wpad.dat
# chmod 644 /var/www/wpad.dat
# nano /var/www/wpad.dat

e diamogli il contenuto:

function FindProxyForURL(url, host)
 {
	if (!isInNet(myIpAddress(), "192.168.1.0", "255.255.255.0"))
		return "DIRECT";

	return "PROXY 192.168.1.1:3128";
 }

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:

server        A       192.168.1.1
wpad          CNAME   server

A questo punto dobbiamo configurare il server DHCP, agendo sul suo file di configurazione:

# nano /etc/dhcp/dhcpd.conf

e aggiungendo le opzioni:

     option local-proxy-config code 252 = text;
     option local-proxy-config "http://server/wpad.dat"; 

nella sezione generale del file.
Infine modifichiamo il file /etc/mime.types affinchè Apache serva correttamente il file, aggiungendo la riga:

application/x-ns-proxy-autoconfig               pac dat

Troubleshooting dhcpd

isc-dhcp-server non riparte dopo un aggiornamento di sistema

Digitare da terminale:

# systemctl status isc-dhcp-server.service

Se compaiono uno o più dei seguenti errori

No subnet declaration for ...

oppure

No subnet6 declaration for ...

e voi siete sicuri che la prima o entrambe (se usate anche IPv6) le dichiarazioni sono presenti, allora è necessario controllare il file nano /etc/default/isc-dhcp-server assicurandosi che sia presente (e non commentata) in coda la seguente dichiarazione (valida per IPv4):

INTERFACESv4="nome_interfacce"

dove nome_interfaccia è appunto il nome dell'interfaccia di rete su cui dhcpd deve rimanere in ascolto, ad es. "eth0" (NON omettere i doppi apici!). Si noti che è INTERFACESv4 e non semplicemente INTERFACES come per le versioni più vecchie. Prima di riavviare il demone digitare anche:

# journalctl -xe

Se nel log compaiono sia Failed to start LSB: DHCP server. che Starting ISC DHCPv4 server: dhcpddhcpd service already running (pid file /var/run/dhcpd.pid currenty exists) ... failed! è necessario:

  1. arrestare il server
  2. eliminare manualmente il file /var/run/dhcpd.pid

A questo punto riavviare il demone e gli errori dovrebbero scomparire.

Impossibile accedere al file rndc.key

Può capitare che il demone dhcpd non riesca ad accedere al file /etc/bind/rndc.key, il che costituisce un errore critico (cioè il demone non si avvia) se dhcpd è stato configurato per aggiornare automaticamente i DNS.
Una semplice soluzione è cambiare il gruppo proprietario del file da bind a dhcpd

# chown bind:dhcpd /etc/bind/rndc.key

Assicurarsi anche che i permessi sul file siano sufficienti, ad esempio 640.

isc-dhcp-server non si avvia dopo aver modificato /etc/network/interfaces

Controllare il file /etc/default/isc-dhcp-server e verificare alla riga INTERFACESv4 sia dichiarata l'interfaccia di rete corretta. In questo caso si dovrebbe trovare anche il seguente messaggio d'errore in /var/log/syslog (il nome dell'interfaccia potrebbe ovviamente essere diverso da quello riportato nel sottostante esempio):

No subnet declaration for enp3s0 (no IPv4 addresses).
** Ignoring requests on enp3s0.  If this is not what
you want, please write a subnet declaration
in your dhcpd.conf file for the network segment
to which interface enp3s0 is attached. **

Esempi

Comandi utili

Elencare gli indirizzi IP dati in prestito da bind9:

# dhcp-lease-list --lease /var/lib/dhcp/dhcpd.leases

Piccola LAN

Per la parte relativa ai DNS si veda Bind.

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.

dhcpd.conf

# Parametri globali
authoritative;
ignore client-updates;
# Parametri per l'aggiornamento automatico di Bind
ddns-updates on;
ddns-update-style interim;
update-static-leases off;
ddns-domainname "small.lan.";
include "/etc/bind/rndc.key";
zone small.lan. {
    primary 192.168.1.100;
    key rndc-key;
}
zone 1.168.192.in-addr.arpa. {
    primary 192.168.1.100;
    key rndc-key;
}
# Fine zona aggiornamento automatico di Bind
# Fine area parametri globali
# Definizione rete
shared-network piccolalan {
    subnet 192.168.1.0 netmask 255.255.255.0 {
        option broadcast-address 192.168.1.255;
        option subnet-mask 255.255.255.0;
        option routers 192.168.1.1;
        option ip-forwarding off;
        option domain-name "small.lan";
        option domain-search "small.lan";
        option domain-name-servers 192.168.1.100;
        default-lease-time 604800;
        max-lease-time 1209600;
    }
    pool {
        deny unknown-clients;
        range 192.168.1.131 192.168.1.140;
    }
    pool {
        deny known-clients;
        range 192.168.1.151 192.168.1.160;
        default-lease-time 14400;
        max-lease-time 28800;
        option domain-name "none";
        option domain-search "none";
        option domain-name-servers 208.67.220.220, 212.216.112.112;
    }
}
# Definizione host noti
host PC7C {
    hardware ethernet XX:XX:XX:XX:XX:XX;
    fixed-address 192.168.1.111;
}
host PC7W {
    hardware ethernet YY:YY:YY:YY:YY:YY;
    fixed-address 192.168.1.111;
}
host PC8C {
    hardware ethernet ZZ:ZZ:ZZ:ZZ:ZZ:ZZ;
    ddns-hostname PC8C;
}
host PC8W {
    hardware ethernet WW:WW:WW:WW:WW:WW;
    ddns-hostname PC8W;
}

Con questa configurazione i client che ricevono un indirizzo dinamico e che sono sconosciuti (ovvero per cui non esiste una direttiva host) utilizzeranno direttamente server dns pubblici e non avranno accesso al server dns locale, non potendo così sapere nulla della LAN. Ovviamente tutto ciò non va interpretato come una procedura di sicurezza, ma solo come un artificio per non rendere immediatamente disponibili certe informazioni.
Nella parte finale sono dichiarati quattro host, che in realtà corrispondono ai due portatili citati nella premessa iniziale; in sintesi una dichiarazione host per ogni interfaccia di rete. Sarebbe stato in teoria possibile dichiarare più di un mac address per host, ma pare che tale soluzione renda più lenta di un paio di minuti l'acquisizione/conferma dell'indirizzo IP assegnato da dhcp.
Mentre a PC7 è stato assegnato un indirizzo prefissato (a prescindere dall'interfaccia usata), a PC8 non è stato assegnato alcun IP; questo significa che si vedrà assegnato un indirizzo IP dinamico dal range definito nella subnet, tuttavia per quanto già spiegato avrà comunque accesso al server DNS locale risultando quindi in grado di risolvere correttamente i nomi di small.lan. L'opzione ddns-hostname fa si che il server DNS associ al suo IP non il nome host della macchina, ma quello qui definito, ovvero "PC8C" o "PC8W" a seconda dell'interfaccia usata per connettersi. Tale scelta è stata fatta a scopo puramente esemplicativo in quanto sarebbe stato molto più semplice associargli direttamente un IP statico ed inserire manulmente i relativi record nei file del server DNS (come fatto per PC7).
In ultimo si fa presente che ogni computer per cui siano definite più dichiarazioni host deve accedere alla LAN con una sola interfaccia per volta, mai con due contemporaneamente (a meno che non siano associate a differenti subnet).


Approfondimenti

Manpages

  • man dhcpd
  • man dhcpd.conf

Sitografia




Guida scritta da: Wtf 22:14, 8 mag 2019 (CEST)   Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized