WAKE ON LAN
Negge (Diskussion | Beiträge) (→Probleme: /etc/init.d/networking als Beispiel hinzugefügt) |
Emsker (Diskussion | Beiträge) (Link zu Fritz!Box WoL Hack hinzugefügt) |
||
Zeile 1: | Zeile 1: | ||
− | Unter Wake on LAN (Abgekürzt: WOL) versteht man einen Rechner per Netzwerk einzuschalten. | + | Unter Wake on LAN (Abgekürzt: WOL auch WoL) versteht man einen Rechner per Netzwerk einzuschalten. |
− | Dies ist z. B. sehr schön wenn man einen Linux-Router hat - sich per Internet zu diesem verbindet - und dann seinen VDR einschalten kann (um z. B. neue Timer zu speichern). | + | Dies ist z. B. sehr schön wenn man einen Linux-Router hat - sich per Internet zu diesem verbindet - und dann seinen VDR einschalten kann (um z. B. neue Timer zu speichern). Das funktioniert z.B. mit der FritzBox mit Hilfe des [http://www.tecchannel.de/server/linux/432967/ Fritz!Box WoL Hack]. |
Das Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)". | Das Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)". | ||
Zeile 293: | Zeile 293: | ||
|[2] | |[2] | ||
|[http://stephan.mestrona.net/wol/ Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden] | |[http://stephan.mestrona.net/wol/ Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden] | ||
+ | |-- | ||
+ | |[3] | ||
+ | |[[http://www.tecchannel.de/server/linux/432967/ Fritz!Box WoL Hack] | ||
|} | |} |
Version vom 6. Dezember 2005, 12:39 Uhr
Unter Wake on LAN (Abgekürzt: WOL auch WoL) versteht man einen Rechner per Netzwerk einzuschalten. Dies ist z. B. sehr schön wenn man einen Linux-Router hat - sich per Internet zu diesem verbindet - und dann seinen VDR einschalten kann (um z. B. neue Timer zu speichern). Das funktioniert z.B. mit der FritzBox mit Hilfe des Fritz!Box WoL Hack.
Das Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)".
Inhaltsverzeichnis |
Programme
Die Programme müssen das "MagicPacket(TM)" erzeugen und an die MAC-Adresse der Netzwerkkarte des aufzuweckenden Rechners schicken.
Browser
Bequem per Browser läßt sich über diesen Wake-On-Lan über Router-Dienst das MagicPacket(TM) aus Web-Formular senden. Das funktioniert teilweise sogar durch (DSL-) Router hindurch.
Linux
Ein passendes Linux-Programm ist ether-wake.
Compiliert wird der source-code mit
wget ftp://ftp.scyld.com/pub/diag/ether-wake.c gcc -O -Wall -o ether-wake ether-wake.c cp ./ether-wake /usr/local/bin
Der Aufruf erfolgt so:
ether-wake 00:11:22:33:44:55
wobei man für die Zahlenfolge einfach die MAC-Adresse des aufzuweckenden Rechners eingeben muss. Wenn man die nicht hat, kann man sich diese mit
ifconfig eth0
anzeigen lassen (natürlich auf dem Rechner den man später wecken will!).
- als Alternative dazu gibt es z.B. noch wol
Probleme
- seit dem 2.6er Kernel gibt es Probleme dass WOL nicht funktioniert Das Problem liegt darin, dass die meisten Netzwerkkarten-Treiber das WOL deaktivieren.
- 3Com Karten die den Treiber 3c59x verwenden, müssen den Parameter "enable_wol=1" angeben, um WOL zu aktivieren. Dies geht allerdings nur wenn der Treiber als Modul eingebunden wird.
Lösung des Problems: Es gibt ein Programm namens "ethtool". Hiermit kann man - nachdem der Netzwerktreiber geladen ist - die Netzwerkkartenparameter auslesen und ändern. So bekommt man angezeigt, wie die Parameter derzeit sind:
ethtool eth0
Beispiel:
ethtool eth0 Settings for eth0: Supported ports: [ TP MII ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Advertised auto-negotiation: Yes Speed: 100Mb/s Duplex: Full Port: MII PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: pumbg Wake-on: g Current message level: 0x00000001 (1) Link detected: yes
Besonders die Zeilen "Supports Wake-on:" und "Wake-on:" sollte man hier im Auge behalten. Die Buchstaben bedeuten:
wol p|u|m|b|a|g|s|d... Set Wake-on-LAN options. Not all devices support this. The argument to this option is a string of characters specifying which options to enable. p Wake on phy activity u Wake on unicast messages m Wake on multicast messages b Wake on broadcast messages a Wake on ARP g Wake on MagicPacket(tm) s Enable SecureOn(tm) password for MagicPacket(tm) d Disable (wake on nothing). This option clears all previous options.
So aktiviert man das Wake-On-Lan beim Eintreffen eines "MagicPacket(TM)":
ethtool -s eth0 wol g
Ich habe diese Zeile einfach in meine /etc/init.d/networking an entsprechender Stelle nach dem Aktivieren des Netzwerks gesetzt. Falls es noch Fragen gibt könnt Ihr mich auch direkt anmailen: Thorsten at Gehrig.de
Bei Debian (c't vdr3) sieht das dann z.B. so aus: (einfach nacht ethool suchen, um die passenden Stellen zu finden):
#!/bin/sh # # manage network interfaces and configure some networking options PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin if ! [ -x /sbin/ifup ]; then exit 0 fi spoofprotect_rp_filter () { # This is the best method: turn on Source Address Verification and get # spoof protection on all current and future interfaces. if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done return 0 else return 1 fi } spoofprotect () { echo -n "Setting up IP spoofing protection: " if spoofprotect_rp_filter; then echo "rp_filter." else echo "FAILED." fi } ip_forward () { if [ -e /proc/sys/net/ipv4/ip_forward ]; then echo -n "Enabling packet forwarding..." echo 1 > /proc/sys/net/ipv4/ip_forward echo "done." fi } syncookies () { if [ -e /proc/sys/net/ipv4/tcp_syncookies ]; then echo -n "Enabling TCP/IP SYN cookies..." echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo "done." fi } doopt () { optname=$1 default=$2 opt=`grep "^$optname=" /etc/network/options` if [ -z "$opt" ]; then opt="$optname=$default" fi optval=${opt#$optname=} if [ "$optval" = "yes" ]; then eval $optname fi } case "$1" in start) doopt spoofprotect yes doopt syncookies no doopt ip_forward no echo -n "Configuring network interfaces..." ifup -a ethtool -s eth0 wol g echo "done." ;; stop) if sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts | grep -q "^/ nfs$"; then echo "NOT deconfiguring network interfaces: / is an NFS mount" elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\1 \2/p' /proc/mounts | grep -q "^/ smbfs$"; then echo "NOT deconfiguring network interfaces: / is an SMB mount" elif sed -n 's/^[^ ]* \([^ ]*\) \([^ ]*\) .*$/\2/p' /proc/mounts | grep -qE '^(nfs[1234]?|smbfs|ncp|ncpfs|coda|cifs)$'; then echo "NOT deconfiguring network interfaces: network shares still mounted." else echo -n "Deconfiguring network interfaces..." ifdown -a --exclude=lo echo "done." fi ;; force-reload|restart) doopt spoofprotect yes doopt syncookies no doopt ip_forward no echo -n "Reconfiguring network interfaces..." ifdown -a --exclude=lo ifup -a ethtool -s eth0 wol g echo "done." ;; *) echo "Usage: /etc/init.d/networking {start|stop|restart|force-reload}" exit 1 ;; esac exit 0
Windows
Für Windows gibt es die Freeware LANStart.
Wakeup per CGI
Einen eigenen Wakeupdienst mit MagicPacket(TM) und Web-Formular ist aber ansich auch keine größere Schwierigkeit. Also wenn man sich z.B. die eigene MAC Adresse nicht permanent nicht merken möchte, und wenn ein eigener Webserver, der CGI+Perl unterstützt, zur Verfügung steht, kann mit folgendem HTML-Wrapper und CGI-Script ein eigener Wakeupdienst aufgesetzt werden.
Dieser HTML-Teil in die Webseite einbetten.
<form action="/cgi/wakeup.pl" method="post"> <table> <tr><td>HWaddress:</td><td><input size="40" maxlength="40" name="HWaddress" value="00:11:22:33:44:55"></td></tr> <tr><td>IPaddress:</td><td><input size="40" maxlength="40" name="IPaddress" value="1.2.3.4"></td></tr> <tr><td>Port:</td><td><input size="40" maxlength="40" name="Port" value="9"></td></tr> <tr><td> </td><td><input type="submit" value="Absenden"></td></tr> </table> </form>
und diesen CGI-Teil als "/cgi/wakeup.pl" auf dem Webserver speichern.
#!/usr/bin/perl -w use strict; use Socket; use CGI; my $cgi = new CGI; use CGI::Carp qw(fatalsToBrowser); $cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN'); print $cgi->header(-type =>'text/html'), $cgi->start_html('Wakeup'), $cgi->h1('Wakeup'), wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')), $cgi->end_html(); sub wake { my $hwaddr = shift; my $ipaddr = shift || '255.255.255.255'; my $port = shift || getservbyname('discard', 'udp'); my ($raddr, $them, $proto); my ($hwaddr_re, $pkt); # Validate hardware address (ethernet address) $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6); if ($hwaddr !~ m/^$hwaddr_re$/) { return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" ); } # Generate magic sequence foreach (split /:/, $hwaddr) { $pkt .= chr(hex($_)); } $pkt = chr(0xFF) x 6 . $pkt x 16; # Allocate socket and send packet $raddr = gethostbyname($ipaddr); $them = pack_sockaddr_in($port, $raddr); $proto = getprotobyname('udp'); if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) { return $cgi->p({-style => 'color:red'}, "socket : $!"); } if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) { return $cgi->p({-style => 'color:red'}, "setsockopt : $!" ); } if(!send(S, $pkt, 0, $them)) { return $cgi->p({-style => 'color:red'}, "send : $!"); } close S; return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr"); }
Sonstiges
Das ganze ist im BIOS zu aktivieren: Power On by Ring bzw. Wake on LAN
Vor allem bei älteren Netzwerkkarten, bzw. Mainboards muss außerdem ein Kabel zwischen Mainboard und Netzwerkkarte gesteckt werden: (Ausnahme sind Mainboards mit Onboard-Netzwerkkarte). Abhängig ist dies von der verwendeten PCI-Spezifikation.
Eine genauere Erläuterung dazu ist auf den c't Hotline Seiten zur Ausgabe 24/2004 unter Komplizierter Netzverkehr zu finden
Links
[1] | Thread zu "Wake-On-Lan aus Internet durch DSL-Router (hier FritzBox)" |
[2] | Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden |
[3] | [Fritz!Box WoL Hack |