19.7.1 DHCP - Dynamic Host Control Protocol

Il DHCP è un protocollo basato su BOOTP e definito dalle RFC 1541 e 2131, nato per creare un meccanismo centralizzato per la configurazione delle interfacce di rete dei sistemi connessi ad una stessa rete. Tale protocollo utilizza il protocollo UDP e prevede un sistema che funge da server DHCP, che è quello che assegna le impostazioni alle varie interfacce che ne fanno richiesta. Le interfacce che vengono collegate alla rete di cui esso fa parte vengono automaticamente configurate (i relativi sistemi devono essere impostati in maniera tale da prevedere la configurazione delle interfacce per mezzo del DHCP).

L’idea di fondo è la seguente: si supponga di avere una rete sulla quale voler attuare il DHCP. A tal proposito è necessario configurare una macchina che funga da server DHCP. Quando si collega in rete un’altra macchina, opportunamente configurata per funzionare in DHCP, al suo avvio quest’ultima invia una richiesta in broadcast per ottenere un indirizzo IP valido (la richiesta dovrebbe essere inviata al server DHCP, ma la macchina appena avviata non conosce a priori l’indirizzo del server DHCP). Il server DHCP, ricevendo la richiesta, provvede a fornire la configurazione dell’interfaccia di rete (indirizzo IP, netmask, gli indirizzi dei DNS server, ...).

Il server DHCP è un processo che rimane in ascolto sulla porta 67. Esso gestisce un insieme di indirizzi IP, detto scope o pool, dal quale ne preleva di volta in volta uno da assegnare ad una interfaccia che ne fa richiesta, per un determinato periodo di tempo, detto lease. Il server DHCP invia le risposte alla porta 68 delle interfacce di rete che hanno inoltrato la richiesta (client).

Sui sistemi GNU/Linux la macchina che funge da server DHCP deve avere installato il processo che gestisce le richieste DHCP, cioè dhcpd (man page dhcpd(8)).36

____________________________________________________________________

Comando: dhcpd
Path: /???/dhcpd

SINTASSI  
# dhcpd [option] [ifaces]  
DESCRIZIONE

____________________________________________________________________

Al suo avvio, dhcpd legge il file di configurazione /etc/dhcpd.conf (v. man page dhcpd.leases(5)) caricando in RAM lo scope delle subnet. Per default il lease è di un giorno. Prima della sua scadenza, la macchina che vuol continuare ad utilizzare l’indirizzo assegnatole dal server DHCP, deve rinnovare la richiesta.

Per tener traccia dei lease assegnati alle varie macchine, dhcpd utilizza un database, costituito dal file /var/lib/dhcp/dhcpd.leases.37 Tutte le operazioni di richiesta, rilascio e rinnovo di lease vengono memorizzate in tale file, che viene letto da dhcpd al suo avvio, per conoscere lo stato dei lease. Il formato delle annotazioni memorizzate al suo interno è il seguente:

 
lease ip-address {statements}  
dove

Per evitare che il file di database dei lease cresca a dismisura, dhcpd di tanto in tanto crea un nuovo file di database dei lease, rinominando quello vecchio in dhcpd.leases~.38

Il PID relativo al processo dhcpd è contenuto nel file /var/run/dhcpd.pid da dhcpd stesso, al suo avvio.

La comunicazione tra il server DHCP ed un sistema avviene in tre fasi:

  1. Richiesta di un indirizzo IP

    Il sistema che desidera richiedere la configurazione di una sua interfaccia di rete via DHCP, configura “temporaneamente” la propria interfaccia per inoltrare la richiesta al server DHCP. In particolare il pacchetto inviato sulla rete (DHCPDISCOVER) avrà come indirizzo IP mittente 0.0.0.0 e come indirizzo IP di destinazione 255.255.255.255 (porta 67). Questo significa che il pacchetto viene inoltrato a tutte le interfacce di rete (broadcast). Il pacchetto però contiene l’indirizzo fisico (MAC address) della scheda di rete che l’ha inviato, così che il mittente possa essere univocamente identificato sulla rete.

  2. Offerta di un indirizzo IP

    Il server DHCP, ricevuta la richiesta, risponde con un messaggio DHCPOFFER contenente l’indirizzo IP da assegnare all’interfaccia che ne ha fatto richiesta. Tale pacchetto viene inviato sulla porta 68 dell’indirizzo IP 255.255.255.255 (un altro messaggio broadcast, poiché l’interfaccia di rete da configurare non ha ancora un proprio indirizzo IP). All’interno del pacchetto c’è comunque il MAC address della scheda che ne ha fatto richiesta.

  3. Selezione dell’indirizzo IP

    L’interfaccia, ricevuta la risposta (la prima che riceve)39 notifica la ricezione dell’indirizzo IP fornito dal server DHCP inviando in broadcast un opportuno messaggio DHCPREQUEST (nel quale l’indirizzo IP mittente è quello fornito dal server DHCP), che contiene l’indirizzo IP del server DHCP che ha fornito l’indirizzo IP.

    A sua volta, il server DHCP invia all’interfaccia appena configurata un messaggio DHCPACK di conferma, specificando la durata di validità del lease.

Nel caso in cui al client sia stato già rilasciato un lease, prima della sua scadenza, il client stesso può richiederne il rinnovo, mediante l’invio al server DHCP di un messaggio DHCPREQUEST, al quale il server DHCP può rispondere con un messaggio DHCPACK o DHCPNACK per accordare o meno il rinnovo del lease.

[da completare ...]

Gli indrizzi IP forniti dal server DHCP vengono generati per mezzo di una tabella hash e quindi non è possibile predire quale sarà il successivo indirizzo IP che verrà rilasciato dal server DHCP: non hanno un particolare ordine di rilascio.

Per assicurarsi che l’indirizzo IP da assegnare al client non sia già utilizzato da un’altra interfaccia, il server DHCP invia a tale indirizzo un echo ICMP: se non viene ricevuta alcuna risposta entro un secondo, l’indirizzo IP viene ritenuto inesistente. Nel caso in cui venga ricevuta una risposta, tale indirizzo IP viene considerato abandoned e non viene assegnato al client.

Il file di configurazione di dhcpd è /etc/dhcpd.conf, un file di testo contenente delle direttive espresse secondo un’opportuna sintassi, molto forbita, per la quale si rimanda alla relativa documentazione (man page dhcpd.conf(5)).

Per una semplice rete, può essere sufficiente un file di configurazione analogo a quello si seguito riportato

subnet 192.168.1.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.10;
                                                                        
                                                                        
option domain-name-servers 192.168.1.11;
range 192.168.1.50 192.168.1.200;
default-lease-time 86400;
max-lease-time 604800;
}
Il blocco subnet specifica appunto la subnet (il suo indirizzo IP e la relativa netmask) sulla quale deve essere utilizzato il server DHCP. Al suo interno la direttiva option subnet-mask specifica la subnet mask da assegnare all’interfaccia del client, la direttiva option broadcast-address specifica l’indirizzo di broadcast della subnet, la direttiva option routers definisce il gateway di default per l’interfaccia del client, la direttiva option domain-name-servers specifica il DNS server per l’interfaccia del client, la direttiva range indica l’intervallo degli indirizzi IP (quello inferiore e quello superiore) utilizzabili per i client, cioè lo scope, la direttiva default-lease-time indica la durata di default40 del lease espressa in secondi (in questo caso 86400, cioè 24 ore), e la direttiva max-lease-time indica la durata massima del lease, espressa in secondi (in questo caso 604800, cioè 7 giorni).

[da completare ...]

La gestione dei lease avviene per mezzo di un database, che in genere è realizzato tramite un semplice file di testo: dhcp.leases.

[da completare ...]

Dal punto di vista del client, esso deve essere opportunamente configurato per poter effettuare la configurazione automatica della propria interfaccia di rete con i parametri ottenuti dal server DHCP. A tale scopo deve utilizzare un opportuno client DHCP, generalmente implementato dal comando dhclient41 (man page dhclient(8)), per comunicare con il server DHCP. Il file di configurazione relativo all’interfaccia di rete da configurare via DHCP, deve contenere le seguenti impostazioni42

BOOTPROTO=dhcp
ONBOOT=yes
dhclient utilizza il file di configurazione /etc/dhclient.conf ed il database dei lease /var/lib/dhcp/dhclient.leases.

[da completare ...]