18. June 2012 12:27
by Rik Hepworth
If you’ve seen my recent blog post on making Android work in Hyper-V you will have seen my problems around DNS resolution when in the office. That turned out to be down to the DHCP options being handed back by our Server 2008 R2 box. Or rather, it was what wasn’t being handed back to the client that was the problem.
Linux (and Apple OSX, as it turns out) both want a response to option 119, which defines the domain suffix search order. Windows does not request this option and the windows DHCP server does not offer the option at all.
There are a few locations on the web that talk around this but none properly document the process of adding the custom option to your DHCP server and more importantly, exactly how to encode the response (thanks go to Matt for describing that one in enough detail!).
What option 119 looks like
Option 119 hands back a byte array that encodes the domain suffix. The trouble is, it’s not a simple matter of turning text into ascii hex values. There is a structure to it.
Our domain is blackmarble.co.uk. I found a handy web site that sped up the process of getting the hex of that.
|b ||l ||a ||c ||k ||m ||a ||r ||b ||l ||e ||. ||c ||o ||. ||u ||k |
|0x62 ||0x6c ||0x61 ||0x63 ||0x6b ||0x6d ||0x61 ||0x72 ||0x62 ||0x6c ||0x65 ||0x2e ||0x63 ||0x6f ||0x2e ||0x75 ||0x6b |
The client expects the full domain to be split (get rid of the separating periods), with each section prefixed by it’s length (e.g. 11 blackmarble 2 co 2 uk) and then the whole string is null terminated.
| ||b ||l ||a ||c ||k ||m ||a ||r ||b ||l ||e || ||c ||o || ||u ||k || |
|0x0b ||0x62 ||0x6c ||0x61 ||0x63 ||0x6b ||0x6d ||0x61 ||0x72 ||0x62 ||0x6c ||0x65 ||0x02 ||0x63 ||0x6f ||0x02 ||0x75 ||0x6b ||0x00 |
Adding the option to Server 2008 R2
To add the DHCP option to Windows Server 2008 R2 you need to add a new option to the IPV4 section. Select ‘Set Predefined Options’ from the context menu on the IPV4 heading beneath the name of the server in the DHCP console.
In the dialog that appears, click the Add button.
Enter the name for new option. It needs to be of type Byte and make sure you check the array option; the Code is 119 and you can add a description if you want to.
Once you’ve defined the option you can add it either to the main Server Options section, a scope or an individual address reservation.
Each of the hex values you worked out (see my examples) needs to be added in turn to create the full byte array.
Hopefully this pulls all the necessary information into one handy reference and it saves somebody else the confusion I experienced.