Un server DHCP in PHP…why not ?

Attenzione ! Questo articolo è stato scritto più di due anni fa. Ti prego quindi di considerare che le informazioni riportate potrebbero non essere aggiornate o non più valide.

I puristi si staranno già scandalizzando: “un server DHCP in PHP ?!?!?” sarà la loro prima reazione, con un misto di incredulità e sdegno.

Ma perché no ?

Il PHP, oltre ad essere un meraviglioso linguaggio per la programmazione web, può efficacemente sostituirsi -con tutti i suoi limiti- anche ad altri linguaggi interpretati “shell-based” come Perl o Python. Certo, non mi aspetto prestazioni eccezionali ma ad un server DHCP serve essenzialmente stabilità e, per quanto riguarda ad esempio il contesto VoIP dove vorrei implementarlo, tanta tanta flessibilità.

L’idea nasce, è giusto ammetterlo, da un progetto già avviato da un’altro italiano nel 2009, Angelo DiNardi, che sul suo blog (https://angelo.dinardi.name/2009/09/09/a-dhcp-server-in-php-why-not/) scriveva:

I had planned on making the DHCP server part have a plug in system of changing the storage system backing the server so that it could run off a database and do things that the normal ISC DHCP server can’t be configured to do.

Già, tutte quelle cose che il server DHCP de-facto, ISC DHCPD, non può fare. Una di queste è l’interfacciamento con un DBMS, quale MySQL, anche se l’ISC, attraverso il nuovo progetto KEA, ha risolto questo limite (attualmente è in fase di sviluppo).

DHCP handshaking

DHCP handshaking

Torniamo a noi. Essenzialmente un server DHCP deve rispondere alle richieste DHCPREQUEST, offrire un indirizzo IP disponibile (DHCPOFFER), attendere la risposta da parte del  nuovo dispositivo (DHCPREQUEST) e confermarne la “registrazione” (DHCPACK).

Oltre a questo, ovviamente, c’è tutta la parte strategia di allocazione degli IP, filtro e pre-allocazione sul MAC address, controllo della scadenza dei LEASE, opzioni…

Tutto questo tramite pacchetti UDP sulla porta 67 e 68 perché, lo ricordo, un dispositivo che viene connesso ad una rete e non ha un IP assegnato non può –ovviamente– stabilire connessioni TCP…

[alert style=”yellow”] Una spiegazione più dettagliata del Dynamic Host Configuration Protocol è disponibile su Wikipedia: http://it.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol mentre se volete farvi una esplorazione del traffico relativo, potete usare “tcpdump -i [interfaccia di rete] -vvv -s 1500 ‘(port 67 or port 68)‘” [/alert]

Basandomi sul codice già sviluppato e disponibile su GitHub (https://github.com/adinardi/phpdhcp), ho aggiunto alcune funzionalità e creato un fork su GitHub, da dove potete scaricare il codice: https://github.com/michelep/phpdhcp

In particolare ho aggiunto l’uso di un database MySQL come backend per la configurazione della rete e gestione dei leases, oltre alla possibilità di “demonizzare” il programma (usando PHP System Daemon). Lo schema del DB, contenuto nel file schema.sql, è il seguente:

CREATE TABLE IF NOT EXISTS `DHCPLeases` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `PoolID` int(11) NOT NULL,
 `IP` varchar(16) NOT NULL,
 `ChgDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`ID`),
 KEY `PoolID` (`PoolID`),
 KEY `IP` (`IP`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `DHCPPools` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `IPStart` varchar(16) NOT NULL,
 `IPEnd` varchar(16) NOT NULL,
 `SubnetMask` varchar(16) NOT NULL,
 `Router` varchar(16) NOT NULL,
 `DNSServers` varchar(64) NOT NULL,
 `Domain` varchar(32) NOT NULL,
 `Note` text NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

In fase di configurazione è necessario aggiungere le righe a descrizione del lotto (“pool”) di IP disponibili. Ad esempio:

DHCPPools

La tabella DHCPLeases viene automaticamente popolata man mano che vengono assegnati IP ai dispositivi collegati.

[alert style=”red”] Considerate che si tratta comunque di un programma a scopo didattico e non è adatto ad ambienti di produzione: USE AT YOUR OWN RISK ![/alert]

 

 


          
        

Michele Pinassi

Blogger, appassionato di tecnologia, società e politica. Attualmente Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena ed esperto di sicurezza informatica nello staff del DPO. Utilizza quasi esclusivamente software libero.

Potrebbero interessarti anche...

Una risposta

  1. Giuseppe Fonte ha detto:

    Ciao Michele,

    sto provando la tua version e del PHPDHCP e sono bloccato a un problema. Mi daresti un piccolo aiuto per capire?

    Grazie,
    Giuseppe


    Processing packet type: discover

    [Oct 29 17:41:36] warning: MAC 001174901cff unknown [l:]

    PHP Warning: pack(): Type H: not enough characters in string in /var/www/phpdhcp-master/packet.php on line 212

    Sending response

    Switching to broadcast address…

    Attempting to send response packet to 255.255.255.255

    Response packet sent.

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: