Search domain via DHCP in Linux met Windows DHCP server

Het artikel hieronder beschrijft de manier waarop wij de troubleshooting aan hebben gepakt en tot een antwoord zijn gekomen. Onderaan staat een praktische howto beschreven.

Omdat we bij ons op het werk midden in een migratie zitten tussen twee domeinen moeten we hosts opzoeken in verschillende DNS zones. Om dit wat te vereenvoudigen kun je search domains opgeven. In Windows is dit fenomeen ook bekend als DNS-suffix.

Voor de Windows computers kun je dit heel eenvoudig instellen middels een group policy, maar voor de Linux-gebruikers gaat dat niet op. We kunnen het handmatig instellen in /etc/resolv.conf, maar elke keer als je een nieuw IP-adres opvraagt wordt die config overschreven. Natuurlijk kun je dan wel in de dhclient.conf gaan lopen rotzooien, maar wij wilden het op de nette manier doen, door de DHCP server optie 119 (DNS Domain Search List) mee te laten geven.

In Microsoft’s DHCP server is optie 119 niet standaard aanwezig en moet je die zelf aanmaken. “Gelukkig” heeft Microsoft documentatie online staan over hoe dit moet. Jammergenoeg bleek deze oplossing niet te werken; de DHCP client van Linux accepteerde de input niet.

Om te troubleshooten had een collega optie 119 geïmplementeerd op een testomgeving met de ISC DHCP daemon, en daarvan accepteerde de DHCP client de search domains wel.

Overtuigd dat we  dit ook werkend moeten kunnen krijgen met Microsoft DHCP server hebben we de datapaketten geanalyseerd en kwamen tot de conclusie dat de value voor optie 119 voor beide systemen totaal verschillend was. We zijn toen RFC 3397 (Dynamic Host Configuration Protocol (DHCP) Domain Search Option) ingedoken om te kijken welke output we zouden moeten verwachten (ik ben van mening dat een beetje security officer weet hoe de protocollen in zijn netwerk(en) werken).

Dit document verwijst voor de opbouw van de value naar RFC 1035 (Domain names – Implementation and specification) sectie 4.1.4 ( Message compression) waarin een pretty nifty techniek wordt omschreven om domeinnamen zo efficïent mogelijk op te slaan n de payload door gebruik te maken van pointers.

Waar het op neer komt is dat je de value als volgt indeelt: [aantal bytes tot de eerstvolgende punt][byte-array][null-byte]

Stel dat ik de domeinen virtugon.nl en virtugon.net mee wil geven als search domain dan moet ik de value als volgt meegeven:

08 76 69 72 74 75 67 6f 6e 02 6e 6c 00 08 76 69 72 74 75 67 6f 6e 03 6e 65 74 00

  • 08 is het aantal bytes van de eerste sectie uit het domein.
  • 76 69 72 74 75 67 6f 6e is de byte-array die staat voor “virtugon” (8 bytes).
  • 02 is het aantal bytes van de volgende sectie uit het domein, in dit geval de TLD.
  • 6e 6c is de byte-array die staat voor “nl” (2 bytes).
  • 00 is om aan te geven dat dit het einde is voor dit domein.

Dit herhaalt zich nogmaals maar dan voor virtugon.net.

Nu de uitdaging om Windows dezelfde output te laten genereren. Gelukkig kun je in de DHCP server ook het type “byte” selecteren en het ingeven als een array. Het nadeel is dat je elke byte als hexadecimaal getal los achter elkaar in moet vullen.

Na dit vervelende invoerwerk accepteerde de DHCP client op onze Linux systemen de search domains wel.

Een hoop werk voor zoiets simpels, maar hierdoor hebben we wel weer wat bijgeleerd over de DHCP- en DNS-protocollen. \o/

Howto
Hieronder staat de praktische howto beschreven die het resultaat is van het bovenstaande verhaal.

  1. Open de DHCP Server MMC
  2. Klik op de DHCP server waarop je dit toe wilt passen
  3. Klik in het menu op Action –> Set Predefined Options
  4. Klik op de knop Add
  5. Vul bij de naam DNS Search List en bij code 119 in
  6. Kies bij het type Byte en activeer de optie Array
  7. Klik op OK
  8. Vertaal elke sectie van het domein via http://centricle.com/tools/ascii-hex/ en vervang % met 0x
  9. Ga nu naar de scope options van de scope waarop je dit toe wilt passen
  10. Maak een nieuwe scope option aan, kies hierbij voor optie 119
  11. Vul het array nu door de bytes 1 voor 1 toe te voegen. Let hierbij op dat je de 0x0 die Microsoft er standaard in zet verwijderd.

Screenshots volgen nog.