Logo - Japanese Zodiac Sign

wakeup - Wake On LAN

Ein Programm um per Wake-On-Lan einen anderen, im selben Netzwerk befindlichen Rechner aufzuwecken.

de en

Wake On LAN

Die hier beschriebene Programmvariante funktioniert leider nicht mehr mit der aktuellen libnet. Sobald ich die Zeit dazu finde, werde ich das Programm an die aktuelle Version anpassen.

Wie funktionert es?

Über Wake On LAN, ab hier mit WOL abgekürzt, läßt sich ein ausgeschalteter, oder im Standby befindlicher Rechner einschalten bzw. Aufwecken.

Damit so ein Rechner aufwacht muß ein sog. "Magic Packet" an die Netzwerkkarte geschickt werden. Da der Rechner im ausgeschalteten Zustand kein IP-Protokoll verarbeiten kann, reicht es wenn der Inhalt des "Magic Packets" im Ethernet Frame vorhanden ist. Der Inhalt sieht dann folgendermaßen aus:

6 Bytes mit dem Wert 255 (0xff Hex)
16 mal die MAC-Adresse des Zielrechners

Damit der Ethernet Frame jeden Rechner im LAN erreichen kann muß als Zieladresse eine Broadcast Adresse angegeben werden. In diesem Falle ff:ff:ff:ff:ff:ff. Der oben angegebene Inhalt des Magic Packet wird dann noch in ein UDP Paket verpackt. UDP deshalb weil es ein verbindungsloses Protokoll ist. Als IP Zieladresse wird auch hier eine Broadcast Adresse angegeben. Die global gültige für das Internet Protokoll ist 255.255.255.255.

Da ein solcher Broadcast nicht geroutet wird muß das Paket von einem Rechner in dem entsprechenden LAN-Segment abgeschickt werden. Da dieser Rechner mehrere Interfaces haben kann muß das entsprechende Netzwerkinterface ausgewählt werden auf dem der Ethernet Frame geschickt wird. Das komplette UDP Paket, das als Nutzdaten im Ethernet Frame verschickt wird sieht dann Beispielsweise so aus:

VersionIHLType of ServicePacket Length
0x045 (5 * 32bit = 20 Byte)0x10102
IdentificationFlagsFragment Offset
24200
Time to LiveProtocolHeader Checksum
1UDP (6)von libnet berechnet
Source Address
Erste IP Adresse des Interfaces
Destination Address
Broadcast Address 255.255.255.255
Magic Packet, insgesamt 17 * 6 = 102 Byte wie oben beschrieben

Die Implementierung

Da keiner meiner Versuche ein Magic Packet mit einem vorhandenen Programm zu generieren erfolgreich war habe ich mich daran gesetzt ein eigenes Programm zu schreiben, das auf meine Bedürfnisse zugeschnitten ist. Heraus kam wakeup, das mit Hilfe der libnet realisiert wurde. Die Quellen sollten mittels make übersetzbar und installierbar sein. Falls dies nicht funktionieren sollte bitte ich um eine kurze Fehlerbeschreibung.

Was hat das ganze nun mit OpenBSD zu tun? Nun ja, die meisten Lösungen, die ich gefunden habe waren Linux spezifische Programme. In den ports von OpenBSD existiert ein Perl-Modul, das die beschriebene Funktionalität bieten soll. Allerdings war es mir auch damit nicht möglich ein Magic Packet zu generieren. Das hier vorgestellte Programm ist bisher auch nur auf OpenBSD getestet worden. Erfolgs- oder Misserfolgsmeldungen über den Einsatz des Programms auf anderen Systemen würde ich gerne hier auf die Seite aufnehmen.

Die neuere Bibliothek libnet-1.1

Ich habe wakeup unter berücksichtigung der neueren libnet-1.1 neu geschrieben. Die Quellen von Version 0.2 sollten auf unix-ähnlichen Systemen compilieren, Ein port für OpenBSD kann hier gefunden werden.

Neues wake Kommando in -current

Am 28. Januar 2009 wurde ein Wake On Lan Befehl im Basissystem von OpenBSD eingeführt. Dieses Programm hat keine weiteren Abhängigkeiten ausserhalb des Basissystems und wird in OpenBSD-4.5 enthalten sein. Der Befehl wurde wieder entfernt. Magic Packets können seit dem mit dem arp Kommando generiert werden.