DHCP on-the-fly block assignment
We have a large number of clients who connect to our DHCP machine. We want to assign some of them to a different IP block, which is routed with lower priority. Every DHCP lease renewal, we'd like to check a database and decide which IP block we'd like to assign a customer to.
Is there a way to have a DHCP server execute a script, look in a database, or execute some dynamic code when deciding which address to assign in which pool? Each client is uniquely identified by option82, aka "DHCP Relay Agent Information Option".
Solution 1:
Ideally, you'd modify dhcpd to support address assignment based on Option82, equivalent to the "hardware" lines in host objects. I've done it with the OpenBSD dhcpd when I worked at an ISP, which has a simpler internal structure to isc-dhcpd.
If you're not in a position to do that, then look at omapi(3) and omshell(1); you'd use OMAPI to dynamically create "class" and "pool" objects, to implement Zypher's suggestion. I just checked dhcpd.h
and the class
struct has an OMAPI_OBJECT_PREAMBLE
, so this should be possible. Beware that the documentation on OMAPI can be a little ... skimpy.
Solution 2:
So i havn't done this with option 82, but your best bet would be to use classing in isc dhcpd.
What you would do is setup a class like:
class "userclass1" {
match if substring(option agent.circuit-id, 2, 2) = "<your_id1>";
}
class "userclass2" {
match if substring(option agent.circuit-id, 2, 2) = "<your_id2>";
}
Then in your pool statement:
pool {
allow members of "userclass1";
range 10.0.0.11 10.0.0.50;
}
pool {
allow members of "userclass2";
range 10.0.0.51 10.0.0.100;
}
Reference: dhcpd.conf
This should at least get you on the right track, i don't have my play server up to test it, but i've done something similar with other options.
Solution 3:
Maybe you can start from here:
http://blog.nominet.org.uk/tech/2005/12/21/using-omapi-object-management-application-programming-interface/
Never used, but with a bit of scripting I think it could work.
EDIT
man omshell(1) would give some other examples