Forum: PC-Programmierung Kleines Wake On Lan Programm


von Borislav B. (boris_b)


Lesenswert?

Hallo,
ich möchte gerne ein kleines Programm schreiben, dass per Internet mein 
NAS (Synology DiskStation) weckt. Diese unterstützt wake on LAN, also 
müsste das ja eigentlich möglich sein.

Mein Programm sieht in etwa so aus:

 - Öffne UDP Verbindung zu meinem Router (per DynDNS hat der eine feste 
IP)
 - Schicke ein Magic Packet an den Port 5000 (dieser wird vom Router an 
mein NAS geforwarded)

Im Magic Packet habe ich wie auf Wikipedia beschrieben 6x FF und 16x die 
MAC Adresse meines NAS.

Leider funktioniert das ganze nicht. Zum Testen habe ich das ganze auch 
mal im Heimnetz probiert, und das Paket nicht über den Router sondern 
direkt ans NAS gesendet. Hilft auch nix :-(

Woran könnte das liegen?
Was gibt es hier noch zu beachten?

von Gerd E. (robberknight)


Lesenswert?

Boris P. schrieb:
>  - Schicke ein Magic Packet an den Port 5000 (dieser wird vom Router an
> mein NAS geforwarded)

Na woher soll denn der Router die MAC des NAS kennen wenn das NAS aus 
ist? Normalerweise geht das per ARP, aber dafür muss das NAS darauf 
antworten. Also: nicht an die IP des NAS senden, sondern an die 
Broadcast-IP.

Zum debuggen einfach mal per Wireshark mit nem anderen Rechner im LAN 
mitlauschen, dort muss das Paket auch vorbeikommen.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich habe hier zwei Sourcecodes, einen in RealBasic (entfernt verwandt 
mit VB) und einen in PHP - vlt. hast du ja in deinem eigenen Programm 
etwas übersehen...

RealBasic (heute "Xojo"):
1
dim usock as UDPSocket
2
  dim macbin, mac16, pref as string
3
  dim i as integer
4
  
5
  macbin=""
6
  mac16=""
7
  pref=""
8
  
9
  for i= 1 to 6
10
    macbin = macbin + ChrB(val("&h"+nthfield(macadr, ":", i)))
11
  next
12
  
13
  for i=1 to 6
14
    pref = pref + chrB(&hFF)
15
  next
16
  
17
  for i=1 to 16
18
    mac16 = mac16 +macbin
19
  next
20
  
21
  usock = new UDPSocket
22
  if usock<>nil then
23
    usock.port = 3307
24
    usock.connect
25
    usock.write usock.BroadcastAddress, pref + mac16
26
    usock.close
27
  end if

-------------------------------
und das Gleiche in PHP
1
<?php
2
# Wake on LAN - (c) HotKey (at SPR dot AT), upgraded by Murzik <tomurzik@inbox.ru>
3
4
  flush();
5
6
  function WakeOnLan($addr, $mac)
7
  {
8
    $addr_byte = explode(':', $mac);
9
    $hw_addr = '';
10
11
    for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
12
    $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
13
    for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
14
15
    $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
16
    if ($s == false)
17
    {
18
      echo "Error creating socket!\n";
19
      echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
20
    }
21
    else
22
    {
23
      $opt_ret = socket_set_option($s, 1, 6, TRUE);
24
      if($opt_ret < 0)
25
      {
26
        echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
27
      }
28
      
29
      $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
30
      echo $e;
31
      socket_close($s);
32
      echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
33
    }
34
  }
35
36
WakeOnLan('192.168.10.255', '00:1b:78:a3:ee:20');
37
38
?>

Denk' dran: Eine schlafende Netzwerkkarte hat keine IP, nur eine 
MAC-Adresse. Diese erreicht man nur per Broadcast, der aber 
normalerweise nicht von einem Router weitergeleitet wird. Am Besten wäre 
ein "Komplize" im Inneren des Netztes, z.B. ein Pi oder ein Arduino, der 
- angestossen von einer Nachricht per Portforwarding von Router - 
seinerseits das Magic Packet erzeugt und absendet.

: Bearbeitet durch User
von Gerd E. (robberknight)


Lesenswert?

Frank Esselbach schrieb:
> Denk' dran: Eine schlafende Netzwerkkarte hat keine IP, nur eine
> MAC-Adresse. Diese erreicht man nur per Broadcast, der aber
> normalerweise nicht von einem Router weitergeleitet wird.

Bei UDP-Paketen schon, nur muss die Zieladresse eben die 
Broadcast-Adresse des Netzes sein

> Am Besten wäre
> ein "Komplize" im Inneren des Netztes,

nicht wirklich nötig.

Ich hab mit der UDP-Variante gute Erfahrungen gemacht.

Das schwierigste ist meiner Erfahrung nach die Geräte dazu zu bekommen, 
bei Wake-On-LAN-Paketen wirklich aufzuwachen. Bei manchen Geräten 
funktioniert das nur wenn Sie angeschaltet waren, das OS geladen war, 
das OS korrekt runtergefahren wurde und sie sich dann selbst 
ausgeschaltet haben. Wenn man dagegen den Strom getrennt hatte und nur 
den wieder eingeschaltet hatte, ging es nicht da das BIOS das 
Wake-On-LAN nicht selbst initialisiert hat und das das OS machen muss.

von Borislav B. (boris_b)


Lesenswert?

Gerd E. schrieb:
> Na woher soll denn der Router die MAC des NAS kennen wenn das NAS aus
> ist?

Die scheint mein Router zu kennen. Zumindest wird sie im Web-Interface 
angezeigt ;-)
Da die MAC ja fest ist, sollte der Router auch bei ausgeschaltetem NAS 
die MAC noch wissen.

Frank Esselbach schrieb:
> Am Besten wäre
> ein "Komplize" im Inneren des Netztes, z.B. ein Pi oder ein Arduino

Hm, also geht das garnicht von außen (ohne einen Spion im Inneren)?
(übrigens danke für den Code!)

Gerd E. schrieb:
> nicht wirklich nötig.
> Ich hab mit der UDP-Variante gute Erfahrungen gemacht.

Oder doch? Jetzt bin ich verwirrt ^^
Was ist denn die "Broadcast Adresse meines Netzwerks"? Ich kenne ja nur 
die eine, nach außen hin sichtbare, DyDNS IP. Muss ich an einen 
speziellen Port senden, damit eine Broadcast-Message im Heimnetz daraus 
wird?

von Frank (Gast)


Lesenswert?

Manche Router bieten WOL als Service über ihre Weboberfläche. Dazu 
speichern sie die MAC-Adresse der angeschlossenen Geräte (während diese 
gerade mal eingeschaltet sind) oder man muss sie von Hand eingeben - ich 
glaube aktuelle Fritzboxen können das, sofern man sie vom Web aus 
erreichbar macht.

Wer keine Lust darauf hat, jedesmal den Browser "anzwerfen" und sich 
durch die GUI zu klicken, könnte das damit verbundene Skript 
herausfinden und es über eine igenes kleines Tool abrufen.

Ich mache das genau umgedreht. Mein NAS ist ständig an und ich schalte 
bei Bedarf versch. PCs (z.B. Server) über ein PHP-Skript ein, was vom 
Webserver des NAS ausgeführt wird (Code siehe oben).

von Borislav B. (boris_b)


Lesenswert?

Frank schrieb:
> Manche Router bieten WOL als Service über ihre Weboberfläche. Dazu
> speichern sie die MAC-Adresse der angeschlossenen Geräte (während diese
> gerade mal eingeschaltet sind) oder man muss sie von Hand eingeben - ich
> glaube aktuelle Fritzboxen können das, sofern man sie vom Web aus
> erreichbar macht.

Ich habe eine Fritzbox, die das angbietet. Im Web-Interface gibt es dazu 
einen Button "Computer wecken" (oder so ähnlich). Der tut tatsächlich 
was er soll, d.h. das NAS wacht auf wenn ich ihn drücke.

=> Das möchte aich aber nicht nutzen, da das zu umständlich ist (erst 
bei der Fritzbox einloggen, auf die richtige Seite wechseln, den Button 
drücken, dannbeim NAS einloggen...)

Zusätzlich gibt es aber dort noch ein Häkchen "Computer bei Zugriff aus 
dem Internet automatisch aufwecken". Das klingt eigentlich genau wie 
das, was ich haben möchte.

=> Leider funktioniert das nicht. Ich kann auf das NAS zugreifen so viel 
ich will, die Fritzbox weckt es nicht auf :-(

von Botuser (Gast)


Lesenswert?

Benutz doch erstmal lokal in deinem Netz einen fertiges WOL Programm um 
dein NAS zu wecken. Wenn das klappt weist du erstmal ob das überhaupt 
mit den momentanen Einstellungen geht.
Wenn das klappt kannst du dir mit Wireshark ja mal die Telegramme 
anschauen und mit denen vergleichen die nicht klappen.
Das hilft dann ungemein bei der Fehlersuche.

von Borislav B. (boris_b)


Lesenswert?

Botuser schrieb:
> Benutz doch erstmal lokal in deinem Netz einen fertiges WOL Programm um
> dein NAS zu wecken. Wenn das klappt weist du erstmal ob das überhaupt
> mit den momentanen Einstellungen geht.

Das habe ich ja bereits mit der Fritzbox gemacht (siehe oben).

Botuser schrieb:
> Wenn das klappt kannst du dir mit Wireshark ja mal die Telegramme
> anschauen und mit denen vergleichen die nicht klappen.
> Das hilft dann ungemein bei der Fehlersuche.

Noch schöner wäre es ja, wenn das direkt über die FB klappen würde. Dann 
bräuchte ich mein programm garnicht ;-)

von Botuser (Gast)


Lesenswert?

Klappt der Zugriff auf dein NAS von Extern denn wenn es an ist?

von Karl (Gast)


Lesenswert?

Soweit mir bekannt ist leiten nicht alle Router das Magic-Packet weiter. 
Ich würde da das Problem vermuten. Ich habe das ganze mit einer 
VPN-Verbindung gelöst.

von Borislav B. (boris_b)


Lesenswert?

Botuser schrieb:
> Klappt der Zugriff auf dein NAS von Extern denn wenn es an ist?

Ja, das geht.

Karl schrieb:
> Soweit mir bekannt ist leiten nicht alle Router das Magic-Packet weiter.
> Ich würde da das Problem vermuten. Ich habe das ganze mit einer
> VPN-Verbindung gelöst.

Das sollte ja über die Auto-Aufwecken-Funktion der Fritzbox ganz einfach 
zu machen sein. Ohne Weiterleitung, VPN oder sonst was. Wenn es denn 
funktionieren würde ;-)

von Micha (Gast)


Lesenswert?

Ich wecke meine DS212+ mittels 
http://www.heise.de/download/wol.exe.html. Über die Fritzbox war es mir 
zu umständlich mich immer einzuloggen und auf die entsprechende Seite zu 
navigieren. Durch ein kleines Batch-Skript auf dem Desktop und o.g. Tool 
ist es nun nur noch ein Doppelklick...

von Karl (Gast)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Boris P. schrieb:
> NAS (Synology DiskStation). Diese unterstützt wake on LAN

Genau deine? Nicht alle können das:
https://www.synology.com/de-de/knowledgebase/faq/437

von Borislav B. (boris_b)


Lesenswert?

Karl schrieb:
> Hast du mal das gelesen?
>
> 
http://avm.de/nc/service/fritzbox/fritzbox-7490/wissensdatenbank/publication/show/1482_Computer-wird-bei-Zugriff-aus-dem-Internet-nicht-automatisch-gestartet/

Jetzt schon. Und siehe da, es geht :-)
Das mit den 15 Minuten warten habe ich natürlich bisher bei meinen 
Experimenten nicht beachtet. Damit hat sich das Ursprungsproblem in 
Wohlgefallen aufgelöst.

Danke euch allen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.