WAKE ON LAN
(→Satzzeichenfehler korrigiert) |
(Letzte Version wiederhergestellt) |
||
| Zeile 1: | Zeile 1: | ||
| + | Unter Wake on LAN (Abgekürzt: 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 Einschalten erfolgt meistens durch das sogenante "MagicPacket(TM)". | ||
| + | |||
| + | == 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 [http://stephan.mestrona.net/wol/ 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 [http://www.scyld.com/wakeonlan.html ether-wake]. | ||
| + | |||
| + | Compiliert wird der source-code mit | ||
| + | <pre> | ||
| + | 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 | ||
| + | </pre> | ||
| + | Der Aufruf erfolgt so: | ||
| + | <pre> | ||
| + | ether-wake 00:11:22:33:44:55 | ||
| + | </pre> | ||
| + | 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 | ||
| + | <pre>ifconfig eth0 | ||
| + | </pre> | ||
| + | anzeigen lassen (natürlich auf dem Rechner den man später wecken will!). | ||
| + | * als Alternative dazu gibt es z.B. noch [http://ahh.sourceforge.net/wol/ 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 [http://www.sourceforge.net/projects/gkernel/ "ethtool"]. Hiermit kann man - nachdem der Netzwerktreiber geladen ist - die Netzwerkkartenparameter auslesen und ändern. | ||
| + | So bekommt man angezeigt, wie die Parameter derzeit sind: | ||
| + | <pre>ethtool eth0</pre> | ||
| + | Beispiel: | ||
| + | <pre> | ||
| + | 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 | ||
| + | </pre> | ||
| + | Besonders die Zeilen "Supports Wake-on:" und "Wake-on:" sollte man hier im Auge behalten. | ||
| + | Die Buchstaben bedeuten: | ||
| + | <pre> | ||
| + | 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. | ||
| + | </pre> | ||
| + | So aktiviert man das Wake-On-Lan beim Eintreffen eines "MagicPacket(TM)": | ||
| + | <pre> | ||
| + | ethtool -s eth0 wol g | ||
| + | </pre> | ||
| + | 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 | ||
| + | |||
| + | === Windows === | ||
| + | Für Windows gibt es die Freeware [http://www.spettel.de/lanstart/ 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. | ||
| + | <pre> | ||
| + | <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> | ||
| + | </pre> | ||
| + | |||
| + | und diesen CGI-Teil als "/cgi/wakeup.pl" auf dem Webserver speichern. | ||
| + | <pre> | ||
| + | #!/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"); | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | ==Sonstiges== | ||
| + | Das ganze ist im BIOS zu aktivieren: '''Power On by Ring''' bzw. '''Wake on LAN''' | ||
| + | |||
| + | [[Bild:Wake On Lan 01.png|thumb|none|400px|''Einstellung im BIOS'']] | ||
| + | |||
| + | 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 [http://www.heise.de/ct/04/24/232/default.shtml c't Hotline Seiten zur Ausgabe 24/2004] unter ''Komplizierter Netzverkehr'' zu finden | ||
| + | |||
| + | [[Bild:Wake On Lan 02.png|thumb|none|400px|''WOL Kabel'']] | ||
| + | |||
| + | == Links == | ||
| + | {| | ||
| + | |[1] | ||
| + | |[http://www.ip-phone-forum.de/forum/viewtopic.php?p=94622 Thread zu "Wake-On-Lan aus Internet durch DSL-Router (hier FritzBox)"] | ||
| + | |-- | ||
| + | |[2] | ||
| + | |[http://stephan.mestrona.net/wol/ Wake-On-Lan über Router-Dienst: MagicPacket(TM) aus Web-Formular senden] | ||
| + | |} | ||
Version vom 29. August 2005, 19:18 Uhr
Unter Wake on LAN (Abgekürzt: 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 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
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 |

