Wake-on-WAN

Rechner per Wake-on-LAN übers Internet einschalten

Praxis & Tipps | Praxis

Ein Rechner, der ständig erreichbar sein soll, muss dafür nicht dauernd vor sich hin laufen. Wenn er stattdessen im weniger stromverschwendenden Standby-Modus schlummert, lässt er sich jederzeit per Wake-on-LAN wecken, sogar über das Internet.

Mal eben schnell eine Datei von zu Hause holen – eigentlich sollte das mit der DSL-Flatrate kein Problem sein, wäre der PC nicht ausgeschaltet. Da viele moderne PCs das Wecken per Netzwerk unterstützen, kann man sie aber aus der Ferne einschalten. Dazu muss im lokalen Netz mindestens ein Router dauerhaft laufen, der den Weckruf entgegennimmt und an den abgeschalteten PC weiterreicht. Ob diese Aufgabe ein Hardware-DSL-Router oder eine Linux-Firewall übernimmt, spielt keine Rolle. Wie man einen Linux-Rechner auf verschiedene Weckmethoden vorbereitet, beschreibt der Artikel Linux aufgeweckt auf Seite 206 in der Ausgabe 11/07 der c't.

Technische Voraussetzung sind eine Wake-on-LAN-fähige Netzwerkkarte und ein passendes Mainboard. Aktuelle PC-Mainboards versorgen PCI-Komponenten auch in abgeschaltetem Zustand mit einer Standby-Spannung. Sie reicht den Netzwerkchips, um permanent das LAN zu überwachen und auf ein Magic Packet zu warten. Dieses enthält den Befehl, den PC einzuschalten. Alle oberen Protokollschichten wie TCP/IP stehen in diesem Sparmodus nicht zur Verfügung und werden auch nicht gebraucht.

Der Weckruf besteht aus einer Kennung und 16-mal der MAC-Adresse des Schläfers. Daher lässt er sich in UDP-Pakete verpacken.

Wie die Magic Packets auszusehen haben, definiert AMD in der Advanced Micro Devices Publication #20213 (Magic Packet Technology): Sie bestehen aus einem einzigen Ethernet-Frame, der irgendwo in seiner Nutzlast einen Vorspann von sechs Bytes (Wert jeweils 0xff) und dann 16-mal die Hardware-Adresse (MAC) des aufzuweckenden Rechners enthält. Der LAN-Chip wertet nur diesen Teil des Pakets aus und ignoriert alle Adressfelder des Ethernet-Pakets.

Im Internet gibt es für alle wichtigen Betriebssysteme Programme, die das Magic Packet versenden. Allerdings gehen die meisten davon aus, dass der aufzuweckende Rechner in demselben LAN schläft. Das magische Paket über das Internet zuzustellen, bedeutet etwas mehr Aufwand.

Einige Router, unter anderem einige Heim-Geräte von Buffalo und Draytek können auf Klick in den Konfigurationsseiten ein magisches Paket ins LAN schicken. Das funktioniert sehr gut, doch erfordert es einen Zugang zur Konfiguration über das Internet, also das Freischalten der Fernkonfiguration. In der Regel möchte man das vermeiden, da es auch Tür und Tor für einen Hacker öffnet, der das Passwort durch Ausprobieren oder Mitlauschen herausbekommt. Sicherer ist es daher, den Router so einzustellen, dass er ein aus dem Internet eintreffendes Magic Packet an den Schläfer im LAN weiterleitet.

Da die WOL-Nachricht keine weiteren Anforderungen stellt und an beliebiger Stelle im Ethernet-Frame stehen darf, lässt sie sich in verschiedenste Protokolle verpacken. Am besten eignet sich das einfache UDP. UDP-Pakete lassen sich im Unterschied zu Ethernet-Frames routen und können so beliebige Distanzen durch das Internet zurücklegen. Verschiedene Software-Tools für Linux, Windows und DOS erzeugen solche Päckchen und verschicken sie entweder als UDP-Broadcast oder an eine feste IP-Adresse – meist adressiert an den UDP-Discard-Port 9.

In einer sinnvollen Grundkonfiguration weist jeder Router diese Wecknachrichten allerdings ab, da er keinen Verkehr von außen nach innen zulässt. Einfache Hardware-Router kann man mit einem Port-Forwarding-Eintrag dazu bringen, ein eingehendes WOL-Paket ins LAN weiterzuleiten. Der Trick besteht darin, alle UDP-Pakete, die auf einem bestimmten Port ankommen – am besten wählt man einen zufälligen Port oberhalb von 50.000 – an die passende Adresse weiterzuleiten. Das ist entweder die MAC-Adresse des aufzuweckenden Rechners oder die Ethernet-Broadcast-Adresse ff:ff:ff:ff:ff:ff.

Die erste Methode funktioniert nur mit wenigen Routern, denn die meisten Modelle kennen als Ziel einer Port-Weiterleitung nur IP-Adressen, keine MACs. Für die Zuordnung von IP zu MAC ist das Protokoll ARP (Address Resolution Protocol) zuständig. Der Router fragt dabei über das Netzwerk nach, welcher MAC für die IP-Adresse zuständig ist. Eine Antwort bekommt er jedoch nur, wenn der Rechener vollständig wach ist, denn im Schlaf kennt er keine IP-Adressen und beantwortet daher die ARP-Anfragen nicht. Der Router merkt sich zwar ältere Antworten für einige Zeit (ARP-Cache), doch im Zweifel steht die MAC-Adresse des aufzuweckenden Rechners genau dann nicht mehr im Cache, wenn man sie wirklich braucht, um ihn zu wecken.

Durch das Umleiten eines UDP-Ports auf die interne Broadcast-Adresse erhalten alle Rechner das Magic Packet..

Daher eignen sich für dieses Verfahren nur Router, die ein Port-Forwarding auf eine MAC-Adresse schicken können (statt an eine IP-Adresse) oder statische ARP-Einträge erlauben, die die Zuordnung fest verankern. Bei allen anderen Modellen schickt man das magische Paket nicht gezielt an den einzuschaltenden Rechner, sondern einfach als Ethernet-Broadcast an alle. Auf den Inhalt des Pakets reagiert ja ohnehin nur derjenige mit der MAC-Adresse, die im Innern des Magic Packet steht.

Die meisten Router erzeugen einen Ethernet-Broadcast, wenn sie ein Paket an die IP-Broadcast-Adresse weiterleiten sollen. Dies ist immer die höchste Adresse im lokalen Subnetz und hängt daher von der Netzmaske ab. In einem typischen Netz mit der Netzmaske 255.255.255.0 wäre dies zum Beispiel die 192.168.1.255. Der IP-Stack des Routers setzt diesen IP-Broadcast dann in einen Ethernet-Broadcast um, und das Paket erreicht alle PCs im LAN. Eine Umleitung eines UDP-Ports des Routers auf die interne Broadcast-Adresse macht das ankommende UDP-Paket zu einem Ethernet-Frame, den alle Rechner im LAN erhalten.

Wer statt auf Hardware-Router auf eine Linux-Firewall setzt, muss einen anderen Weg wählen. Das aktuelle Netfilter-Regelwerk (iptables) verweigert es, Pakete auf Broadcast-Adressen umzuleiten. Ein kleiner Trick hilft weiter: Die Regel

iptables -t nat -A PREROUTING -i eth0 \\
-p udp -d 192.168.0.1 --dport 9 \\
-j DNAT --to 192.168.1.254:9

leitet die WOL-Pakete an eine nicht anderweitig benutzte IP-Adresse (192.168.1.254) im lokalen Netz weiter. An welche MAC-Adresse dieses Paket dann ausgeliefert wird, entscheidet der Router über seine ARP-Tabelle. Ein statischer ARP-Eintrag sorgt dafür, dass aus dem zielgerichteten UDP-Paket ein Ethernet-Broadcast wird:

arp -s 192.168.1.254 ff:ff:ff:ff:ff:ff

Einen Schönheitsfehler haben beide Ansätze aber: Mit einer solchen Konfiguration kann jeder über das Internet Rechner im lokalen Netz aufwecken. Dies ist allerdings kaum ein Sicherheitsrisiko und kostet höchstens ein paar Cent für den Strom. Eher bedenklich ist es, dass es einem potenziellen Angreifer nun möglich ist, UDP-Pakete beliebigen Inhalts in das lokale Netz zu schleusen. Die Gefahr, dass er so eine Sicherheitslücke findet, ist zwar niedrig, aber solche Pakete könnten auch zur Kommunikation mit bereits übernommenen Clients missbraucht werden. Falls man den IP-Bereich einschränken kann, aus dem Wake-up-Pakete kommen, so erhöht dies die Sicherheit deutlich.

Elegant, sicher und ohne nennenswerte Modifikationen am Regelwerk der Firewall löst Portknocking das Problem. Dabei versucht der Client über das Internet nacheinander Verbindungen zu verschiedenen Ports der Firewall aufzubauen. Diese ignoriert die Klopfzeichen (englisch knocks) und protokolliert sie lediglich. Ein Hintergrundprogramm analysiert die Logfiles der Firewall. Findet es ein bestimmtes Muster an Zugriffen auf unterschiedlichen Ports, startet es ein Programm, das dann ein WOL-Paket im LAN erzeugt. Über die Art der Zugriffe kann auch eine Autorisierung und Übertragung der Ziel-MAC-Adresse erfolgen. All dies geschieht, ohne dass ein einziges Paket die Firewall passiert. Sobald der Knockdaemon das korrekte Klopfzeichen gehört hat, ruft er das Hilfsprogramm wakeonlan auf. Dieses erzeugt ein Magic Packet mit dem eigentlichen Weckruf. Damit die Firewall die Klopfzeichen in das Logfile einträgt, das der Knockdaemon auswertet, muss man sie lediglich um eine LOG-Regel erweitern:

iptables -I INPUT -p tcp -s 0/0 -d 0/0 --dport 55000:55255 -j LOG

Der in Perl geschriebene Daemon benötigt eine ganze Reihe an zusätzlichen CPAN-Modulen – welche genau, verrät die Readme-Datei. Installieren kann man sie über die CPAN-Shell, die man kurz auf Aktualität prüfen sollte:

perl -MCPAN -e shell
cpan> install Bundle::CPAN …
cpan> reload cpan

Dann lädt und installiert der CPAN-Befehl install MODULNAME das jeweilige Modul. Alle Einstellungen des Daemon stehen in der Datei knockdaemon.conf. Damit der Daemon im File-Modus runmode=file auch die Logs der Firewall findet, weist ihm logfile=/var/log/messages den Pfad. Eine Klopfsequenz soll die MAC-Adresse (Flag0 bis Flag5) enthalten und ist wie folgt aufgebaut:

knock=IP,PORT,FLAG0,FLAG1,FLAG2,FLAG3,FLAG4,FLAG5,CHECKSUM

Die Felder IP und PORT sind für Wake-on-LAN eigentlich überflüssig und nur zur Kompatibilität mit anderen Klopfzeichen vorhanden. Eine action bestimmt, wie der Daemon auf bestimmte Klopfzeichen reagieren soll:

<action>
condition = PORT==9 && FLAG0<255
template = wake_on_lan
use = yes
</action>

Das Template wake_on_lan ruft das Programm wakeonlan auf, das im gleichen Verzeichnis wie der Knockdaemon liegen muss. Es erzeugt das eigentliche magische Paket:

<template wake_on_lan>
system = "./wakeonlan -i 192.168.1.255
`printf "%02x\n" FLAG0`:
`printf "%02x\n" FLAG1`:
`printf "%02x\n" FLAG2`:
`printf "%02x\n" FLAG3`:
`printf "%02x\n" FLAG4`:
`printf "%02x\n" FLAG5`"
</template>

Die auf den ersten Blick umständliche Konstruktion mit den printf-Befehlen baut aus den sechs dezimalen FLAGx-Feldern die hexadezimale MAC-Adresse zusammen.

Die Klopfzeichen erzeugt ein ebenfalls in Perl geschriebener knockclient. Er läuft unter Linux und Windows und besitzt eine Konfigurationsdatei knockclient.conf. Sie muss genau auf die des Servers abgestimmt sein und enthält neben dem Aufbau des Klopfzeichens auch die Adresse der Firewall. Die Optionen für verschlüsselte Übertragung und der Kryptoschlüssel müssen exakt mit denen in knockdaemon.conf übereinstimmen.

Das Portknocking bietet ganz nebenbei die Möglichkeit, das Aufwecken über die Kryptofunktion des Klopf-Daemon zu autorisieren. Paranoiker können die Klopfregeln weiter verfeinern und für jeden Rechner im LAN ein eigenes Zeichen festlegen. So muss dann nicht einmal mehr die MAC-Adresse die Firewall passieren.

Die Weckrufe per Klopfzeichen zu übertragen erfordert etwas mehr Aufwand als die beiden anderen Verfahren und bietet deutlich mehr Sicherheit, setzt aber einen Linux-Router voraus. Andererseits ist das Risiko mit einer Weiterleitungsregel auf einem Hardware-Router gering und diese Variante ebenfalls empfehlenswert.

Die Gefahr, dass Hacker das eigene LAN nur mittels unbeantworteter UDP-Pakete erobern, ist relativ gering – die danach genutzten Protokolle zum Zugriff auf den geweckten Rechner dürften wesentlich anfälliger sein. Bei der Auswahl dieser Server-Programme sollte man immer auch an die Sicherheit der privaten Daten denken. (je)

Anzeige