Friday, March 2, 2012

Control ISC DHCP to allocate IP address based on vendor ID

ISC DHCP supports conditional evaluation(man dhcp-eval), one of the evaluation expressions is hardware, the MAC  address of the network card.
Conditional evaluation make it possible to allocate different IP pool for clients or even allow multiple DHCPD daemons running in the same broadcasts domain.
My challenge is to setup a new DHCP server to PXE boot VMware Vms without affecting an existing DHCP server.
The solution is to create a new class which only response DHCP request  from Vmware NICs, the key is to use expression binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)) to get the vendor ID.
$cat /etc/dhcpd.conf
ddns-update-style none;
ignore client-updates;
#log-facility local7;
#log (debug, binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)));
class "vmware-nics"
match if  ( binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)) = "0:05:69") or ( binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)) = "0:0c:29") or ( binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)) = "0:1c:14") or ( binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)) = "0:50:56");
subnet netmask {
pool {
allow members of "vmware-nics";
option routers        ;
option subnet-mask    ;
option domain-name              "";
option domain-name-servers;
range dynamic-bootp;
#time unit is 1 sec
default-lease-time 3000;
max-lease-time 6000;
filename "gpxelinux.0";

NOTE: the double 0  in MAC address  will be translated to single 0. e.g "00:05:69" = "0:05:69"
If the expression doesn't work, you can check the expression by logging it to a file.You might need to disable "allow members" restriction in order for the expression to be logged.
log-facility local7;
log (debug, binary-to-ascii (16, 8, ":", substring (hardware, 1, 3)));

By default, DHCP log is directed to /var/log/message, it seems, in order to log expression, the DHCP must use separate log file. Because “local7.* /var/log/boot.log” is configured in /etc/syslogd.conf  by default, “log-facility local7” in dhcpd.conf will direct messages to /var/log/boot.log

1 comment:

  1. You could also use something like this (makes it a bit more readable):

    class "vmware-nics"
    match binary-to-ascii (16, 8, ":", substring (hardware, 1, 3);
    subclass "vmware-nics" "0:1c:14";
    subclass "vmware-nics" "0:50:56";
    subclass "vmware-nics" "0:0c:29";

    or.. even simpler, just use sub-string on the mac-addresss:

    class "vmware-nics"
    match substring (hardware, 1, 3);
    subclass "vmware-nics" 00:1c:14;
    subclass "vmware-nics" 00:50:56;
    subclass "vmware-nics" 00:0c:2;

    (notice im NOT using quotes in the second example)... and you could use 00: or 0 as the mac is interpreted as binary.

    you can see more details here: