Der MS-DHCP-Flüsterer – MACkerer2

Einige mögen sich daran erinnern, daß ich 2003 ein Tool schrieb, welches eine nützliche Erweiterung für den DHCP-Server von Windows 2000 Server bietet – MACkerer (kein Support!!!), geschrieben in Delphi. Inzwischen sind zwar einige Jahre ins Land gegangen, aber ich war auch zwischenzeitlich nicht faul. Im Jahr 2004 hatte ich diese Erweiterung nach C portiert und um ein Installationsprogramm erweitert. Außerdem wurden die Syntax und die Loggingfunktionen deutlich aufgepeppt. Die neue Version nannte ich MACkerer2.

Leider habe ich diese Version niemals der Öffentlichkeit zugänglich gemacht – Asche auf mein Haupt :mrgreen:. Das hole ich hiermit nach. Außerdem kann ich ja auch gleich bekannt geben, daß ich an einer C++-Version von MACkerer2 arbeite. Die wird zwar auch MACkerer2 heißen, aber eben eine interne Versionsnummer 2.x tragen, während die C-Version intern eine 1.x Version war (die MACkerer2 hieß). Die 2 am Namen hat nichts mit der eigentlichen Version zu tun. Sie zeigt an, daß es sich um einen Rewrite handelt(e). Die hier zum Download angebotene Version MACkerer2 1.x wurde inzwischen auch auf Windows 2003 Server getestet und funktionierte tadellos.

Aber kommen wir doch erstmal zu Nutzung und Nutzen der Erweiterung. Der MS-DHCP-Server bietet zwar an, daß man in einem Netzwerk Reservierungen vornimmt, wobei man einer bestimmten MAC-Adresse immer die gleiche IP zuweisen kann. Das ist zwar nützlich, stößt aber sehr schnell an seine Grenzen. Wobei? Nun, das ist sehr einfach. Wie einige Leser vielleicht wissen, war ich mehrere Jahre Administrator eines PC-Pools an meiner Uni und dort gab es irgendwann auch Benutzer, die mit ihrem Laptop in den Genuß der schnellen DFN-Anbindung der Uni kommen wollten. Auf Nachfrage wurde uns gesagt, daß das ginge, allerdings wollten wir als Admins (der damalige Helfer ist aktuell der Admin) uns nicht das Zepter aus der Hand nehmen lassen. Leider gab es nämlich ein signifikantes Problem, die Grenzen des MS-DHCP-Servers. Man kann zwar Reservierungen anlegen, wenn man aber nur eine begrenzte Anzahl von IPs zu vergeben hat, man aber insgesamt mehr Nutzer als IPs hat, ist man ziemlich in den Popo gekniffen. Natürlich sind in unserem Fall niemals alle potentiellen Benutzer gleichzeitig ans Netz angestöpselt, so daß es keine Engpässe bei den verfügbaren IPs gibt, dennoch sieht man hier, daß Reservierungen nicht die Lösung sind. Und der MS-DHCP-Server bietet keine anderen Lösungen an. Aber wozu ist man schließlich Programmierer? Also habe ich eine Lösung des Problems entwickelt.

Die Lösung bestand von Anfang an aus einer Erweiterungs-DLL für den MS-DHCP-Server. Diese DLL ermöglicht es, auf die Ausgaben (an den Client) des DHCP-Servers Einfluß zu nehmen. Wichtigste Funktion ist es dabei, aus einer Liste heraus die erlaubten MACs zu lesen. Hat man dann MACkerer2 so konfiguriert, daß alle unbekannten MACs abgelehnt werden, so ist genau das dann auch der Fall. Es werden nur bekannte MACs zugelassen und bekommen eine IP. Zusätzlich kann man jedem MAC-Eintrag noch eine Namen, eine Emailadresse und einen Status zuweisen. Damit ist es dann möglich den Benutzer anhand der MAC zu identifizieren. Da die Logfunktionen ebenfalls dank MACkerer2 ausgebaut wurden, kann man so nachvollziehen wer wann vom DHCP-Server eine IP angefordert hat – oder besser, wer wann das Netzwerkkabel eingestöpselt hat. Und voila hat man was man wollte: eine begrenzte Anzahl von IPs kann an eine größere Anzahl von Benutzern verteilt werden.

Aktuell gibt es keine GUI oder andere Möglichkeiten die Konfigurationsdatei zu bearbeiten – man muß es ganz simpel manuell machen. Die Syntax ist dabei an die der Apache-Konfigurationsdateien angelehnt. Hier ein Beispiel:

# Das ist ein Kommentar
<MAC 11-22-33-DD-EE-FF>
  Name       = "Full Name"
  Status     = 1
  Email      = "me@server.tld"
  Registered = "2003-01-01@00-00-00"
</MAC>

Man sieht eigentlich sehr schön, daß die Identifikation des Eintrags nach der MAC-Adresse erfolgt und dann für den Eintrag noch optionale Attribute angegeben werden können. Dabei sind alle Attribute in dieser Version von MACkerer2 noch optional. Der Name ist ein einfacher Textstring. Der Status kann 0 oder 1 als Wert annehmen. Wobei 0 bedeutet, daß der Benutzer “aktiviert” ist. Das heißt, daß bei AllowOnlyRegistered = 1 im Hauptkonfigurationsblock (s.u.) eine IP an den Rechner mit dieser MAC vergeben wird. Ist der Wert 1 oder anderweitig ungleich 0, wird der Rechner abgelehnt und bekommt vom DHCP-Server keine IP zugewiesen. Achtung: aktuell sind nur die Werte 0 und 1 definiert. Auch wenn ein anderer Wert als 1 die gleiche Bedeutung wie 1 hat, wird sich das in zukünftigen Versionen ändern, so daß es angeraten ist, sich an 0 oder 1 zu halten! Wurde kein Status explizit angegeben, so ist der Standardwert mit 0 (also aktiviert) festgelegt.

Neben den einzelnen Einträgen für MACs, die – obwohl optional – sinnvollerweise ausgefüllt werden sollten um die Logdateien mit nützlichen Informationen zu füllen, gibt es noch einen Hauptkonfigurationsblock. Dieser steuert beispielsweise, welche Aktionen von MACkerer2 in die Logdatei geschrieben werden sollen und wo sich diese befindet. Hier der Haupkonfigurationsblock aus der Vorgabe-Konfigurationsdatei, welche nach der Installation im Verzeichnis %SystemRoot%\System32\dhcp befindet:

<MAIN>

# Log any events connected with start/restart/stop-ing the service
# DEFAULT = 1 (On)
  LogDaemonEvents     = 1
# Log all events when a packet has been dropped or denied
# because of some reason
# DEFAULT = 1 (On)
  LogDrop             = 1
# Log events when a new packet was allowed to pass.
# DEFAULT = 1 (On)
  LogPass             = 1
# Log IP offers from the DHCP server
# DEFAULT = 1 (On)
  LogOffer            = 1
# Log IP released by client
# DEFAULT = 1 (On)
  LogRelease          = 1
# Log if a user has been added using the DLL functions
# DEFAULT = 1 (On)
  LogAddUsr           = 1
# Log if a user has been deleted using the DLL functions
# DEFAULT = 1 (On)
  LogDelUsr           = 1
# Log if a user has been updated using the DLL functions
# (does not include deletion!)
# DEFAULT = 1 (On)
  LogUpdUsr           = 1

# Note: This is highly technical and may only be interesting for
# admins resolving DHCP server problems. This includes events
# from DhcpPktDropHook()
# DEFAULT = 0 (Off)
  LogDebugEvents      = 0

  # This defines wether any MAC is allowed to pass or only
  # registered ones
  AllowOnlyRegistered = 0

  # Defines the path to the logfile(s) (without trailing backslash!)
  # It may contain environment variables, but the expanded path
  # must not exceed 255 characters!
  LogfilePath         = "%SystemRoot%\System32\dhcp"

</MAIN>

Die neue Version, an der ich unter anderem gerade arbeite, wird auch Unterstützung für Konfigurationsdateien in UTF-8 und UCS-2 bieten und so zu einer besseren Internationalisierung beitragen. Außerdem werden noch weitere neue Features hinzukommen, die es ermöglichen auch ohne Reservierungen die Parameter für einen Client anhand seiner MAC-Adresse anzupassen (bspw. die Lease-Dauer).

Viel Spaß einstweilen mit dieser (“alten”) Version 😉

// Oliver

PS: Die deutschen Leser werden es schon geahnt haben, MACkerer hat seinen Namen vom Wort “Meckerer” (wie herummeckern). Das schien mir passend, weil er ja “rummeckert”, wenn eine MAC nicht autorisiert ist 😉

This entry was posted in DE, Programming. Bookmark the permalink.

3 Responses to Der MS-DHCP-Flüsterer – MACkerer2

  1. Oliver says:

    The same in English.
    The Ganze nochmal auf Englisch.

  2. Chris says:

    Hallo,
    Interessante Erweiterung die du da hast. Was denkst du über eine Oberfläche (webbasiert) wo ich Benutzer registrieren können um mit Ihren Rechnern eine IP zugewiesen zu bekommen bzw autorisiert werden ? so das ich mich einloggen kann mit einem notebook und danach einen lease für lass sagen 24h bekomme

  3. Oliver says:

    Hallo,

    sowas in der Art gibt es schon, allerdings konzipiert für den Admin selber. Das haben wir damals (in PHP) geschrieben um es uns einfacher zu machen.

    Allerdings bin ich schon lange nicht mehr dort wo das PHP-Skript eingesetzt wird, kann aber bei Bedarf mal anfragen.

    Die Lease-Zeit kann man derzeit ja noch nicht innerhalb von MACkerer2 einstellen, daher könnte eine Weboberfläche sowas auch nicht leisten. Außerdem braucht der Benutzer vorher ja einen Zugriff auf die Weboberfläche (und daher schon eine IP). Vermutlich am besten lösbar mit einem Kiosk-PC derfür die Registrierung von Notebooks eingesetzt wird …

    // Oliver

Leave a Reply

Your email address will not be published. Required fields are marked *