Gerät über Internet mit Port 9 aufwecken (wol - wow)

Wieso schreibst Du dann:
das die FB anscheinend keine MagicPaket mehr über´s Internet and meine NAS sendet,
wenn FBx und NAS innerhalb eines LANs sind?

Ich habe mich mal etwas besser vertraut gemacht mit dem WOL-Thema, weil ich selbst WOL noch nie verwendet hatte. Wenn ich alles richtig verstanden habe, kannst Du das ganze Theater mit PHP-Script, Port-Freigabe usw. vergessen. Die FBx macht das alles automatisch!

Es genügt, wenn die NAS-Netzwerkadresse in der FBx (Heimnetz) mit einem Haken versehen ist (WOL). Wenn NAS-seitig alle Voraussetzungen gegeben sind, wird das NAS von der FBx bei jedem Zugriff auf das NAS-Laufwerk (nicht auf die Box !!) automatisch gestartet. Mit etwas Verzögerung (Kaffepause!) kann man dann auf das NAS zugreifen.

Ich meine, dass es das ist, was Du am Ende willst. Oder?

Wie Du den Schutz organisierst, damit nicht jeder, der dies auskundschaftet, darauf zugreifen kann, ist eine andere Sache. Ich weiss nicht, ob das evtl. über einen Gastzugang mit eigenem Kennwort zu lösen wäre. Ich bin aber nach wie vor überzeugt, dass ein VPN-Tunnel die beste aller Varianten ist.

Voraussetzung ist allerdings, dass das Freetzen der Box diese Eigenschaften soweit unverändert gelassen hat, sonst wäre eine Original-FBx Software wahrscheinlich vernünftiger.
 
Zuletzt bearbeitet:
Es genügt, wenn die NAS-Netzwerkadresse in der FBx (Heimnetz) mit einem Haken versehen ist (WOL).
Funktioniert das auch bei VPN wieder? Ich hatte für einen Bekannten einen kleinen Batch gemacht, der den VPN-Client startet/verbindet, seinen "fernen" PC per Ping weckt und dann AnyDesk verbindet. Bei der nächsten Firmware-Release war dann VPN plötzlich kein Internet mehr und das Wecken funktionierte nur noch mit Portfreigaben, wo natürlich jeder den PC mit einem ausführlichen Portscan starten kann.
 
Funktioniert das auch bei VPN wieder?
Ich würde sagen: Versuch macht kluch! :) Praktische aktuelle Erfahrungen habe ich mangels vernünftiger Ausrüstung momentan nicht.

Meine, allerdings seinerzeit sehr intensiven VPN-Erfahrungen sind also leider ebenso wenig aktuell wie alles, was ich zu WOL & Co. sage. Es ist mehr oder weniger angelesen und mit eigenen zurückliegenden Erfahrungen abgeglichen. Ich bin erst gerade dabei, mich wieder auf den neuesten Stand zu bringen.

VPN-Tunnel werden ja grundsätzlich zwischen Scripten auf beiden Seiten des Tunnels ausgehandelt. Das kann dann zu tausend und einer Varianten führen.

Vorteil: Alles ist möglich!
Nachteil: Man kann es nicht mal so eben auf der Durchreise beherrschen!
 
Es genügt, wenn die NAS-Netzwerkadresse in der FBx (Heimnetz) mit einem Haken versehen ist (WOL). Wenn NAS-seitig alle Voraussetzungen gegeben sind, wird das NAS von der FBx bei jedem Zugriff auf das NAS-Laufwerk (nicht auf die Box !!) automatisch gestartet.

Auf der NAS ist alles richtig eingestellt, und in der FritzBox auf der Haken gesetzt für Zugriff über´s Internet starten, macht sie aber nicht mehr.

hier mein PHP Script was gut 2 Jahre funktioniert hat, bis ich eben die neue Box installiert habe.

PHP:
 <?php
 // myDomain.nix - entspricht der richtigen dynDNS Adresse :-)
 //
 // I have used the original PHP code from here:
 //
 // Version: 2
 //    http://www.synology.com/
 // License: GPLv2.0
 //
 //
 $mac_address = "00:11:xx:xx:xx:xx";  // NetDisk SERVER, hier ist natürlich die richtig MAC eingetragen
 $addr = "192.168.100.1";                // Adresse aus dem eigenen Segment, Router oder aktueller Rechner sind OK.
 $cidr = "24";                                    // MASK: 255.255.255.0 ==> 24 (3 Byte * 8 Bit)
 $port = "9";                                     // Weiterleitung im Router Fritzbox
 //
 function WakeOnLan($mac_address, $addr, $cidr, $port)
 {
    // Prepare magic packet: part 1/3 (defined constant)
     $buf="";
     for($a=0; $a<6; $a++) $buf .= chr(255); // the defined constant as represented in hexadecimal: FF FF FF FF FF FF (i.e., 6 bytes of hexadecimal FF)
     //Check whether $mac_address is valid
     $mac_address=strtoupper($mac_address);
     $mac_address=str_replace(":", "-", $mac_address);
     if ((!preg_match("/([A-F0-9]{2}[-]){5}([0-9A-F]){2}/",$mac_address)) || (strlen($mac_address) != 17))
     {
         $error = "Input error: Pattern of MAC-address is not \"xx-xx-xx-xx-xx-xx\" (x = digit or letter).<br>\n";
         return $error; // false
     }
     else
     {
         // Prepare magic packet: part 2/3 (16 times MAC-address)
         $addr_byte = explode('-', $mac_address); // Split MAC-address into an array of (six) bytes
         $hw_addr="";
         for ($a=0; $a<6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a])); // Convert MAC-address from bytes to hexadecimal to decimal
         $hw_addr_string="";
         for ($a=0; $a<16; $a++) $hw_addr_string .= $hw_addr;
         $buf .= $hw_addr_string;
     }
     // Resolve broadcast address
     if (filter_var ($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) // same as (but easier than):  preg_match("/\b(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5])\b/",$addr)
     {
         // $addr has an IP-adres format
     }
     else
     {
         // Whitespaces confuse name lookups
         $addr=trim($addr);
         // If you pass to gethostbyname() an:
         //    unresolvable domainname, gethostbyname() returns the domainname (rather than 'false')
         //    IP address, gethostbyname() returns that IP address.
         if (gethostbyname($addr) == $addr)
         {
             // $addr is NOT a resolvable domainname
             $error = "Input error: host name of broadcast address is unresolvable.<br>\n";
             return $error; // false
         }
         else
         {
             // $addr IS a resolvable domainname
             $addr = gethostbyname($addr);
         }
     }
     // Store input value for cookie
     $resolved_addr = $addr;
     // If $cidr is set, replace $addr for its broadcast address
     if ($cidr != "")
     {
         // Check whether $cidr is valid
         if ((!ctype_digit($cidr)) || ($cidr < 0) || ($cidr > 32))
         {
             $error = "Input error: CIDR subnet mask is not a number within the range of 0 till 32.<br>\n";
             return $error; // false
         }
         // Convert $cidr from one decimal to one inverted binary array
         $inverted_binary_cidr="";
         for ($a=0; $a<$cidr; $a++) $inverted_binary_cidr .= "0"; // Build $inverted_binary_cidr by $cidr * zeros (this is the mask)
         $inverted_binary_cidr = $inverted_binary_cidr.substr("11111111111111111111111111111111",0,32-strlen($inverted_binary_cidr)); // Invert the mask (by postfixing ones to $inverted_binary_cidr untill 32 bits are filled/ complete)
         $inverted_binary_cidr_array = str_split($inverted_binary_cidr); // Convert $inverted_binary_cidr to an array of bits
         // Convert IP address from four decimals to one binary array
         $addr_byte = explode('.', $addr); // Split IP address into an array of (four) decimals
         $binary_addr="";
         for ($a=0; $a<4; $a++) {
             $pre = substr("00000000",0,8-strlen(decbin($addr_byte[$a]))); // Prefix zeros
             $post = decbin($addr_byte[$a]); // Postfix binary decimal
             $binary_addr .= $pre.$post;
         }
         $binary_addr_array = str_split($binary_addr); // Convert $binary_addr to an array of bits
         // Perform a bitwise OR operation on arrays ($binary_addr_array & $inverted_binary_cidr_array)
         $binary_broadcast_addr_array="";
         for ($a=0; $a<32; $a++) $binary_broadcast_addr_array[$a] = ($binary_addr_array[$a] | $inverted_binary_cidr_array[$a]); // binary array of 32 bit variables ('|' = logical operator 'or')
         $binary_broadcast_addr = chunk_split(implode("", $binary_broadcast_addr_array),8,"."); // build binary address of four bundles of 8 bits (= 1 byte)
         $binary_broadcast_addr = substr($binary_broadcast_addr,0,strlen($binary_broadcast_addr)-1); // chop off last dot ('.')
         $binary_broadcast_addr_array = explode(".", $binary_broadcast_addr); // binary array of 4 byte variables
         $broadcast_addr_array="";
         for ($a=0; $a<4; $a++) $broadcast_addr_array[$a] = bindec($binary_broadcast_addr_array[$a]); // decimal array of 4 byte variables
         $addr = implode(".", $broadcast_addr_array); // broadcast address
     }
     // Check whether $port is valid
     if ((!ctype_digit($port)) || ($port < 0) || ($port > 65536))
     {
         $error = "Input error: Port is not a number within the range of 0 till 65536.<br>\n";
         return $error; // false
     }
     // Check whether UDP is supported
     if (!array_search('udp', stream_get_transports()))
     {
         $error = "No magic packet can been sent, since UDP is unsupported (not a registered socket transport).<br>\n";
         return $error; // false
     }
     if (function_exists('fsockopen'))
     {
         // Try fsockopen function - To do: handle error 'Permission denied'
         $socket=fsockopen("udp://" . $addr, $port, $errno, $errstr);
         if($socket)
         {
             $socket_data = fwrite($socket, $buf);
             if($socket_data)
             {
                 $function = "fwrite";
 //                $sent_fsockopen = "A magic packet of ".$socket_data." bytes has been sent via UDP to IP address: ".$addr.":".$port.", using the '".$function."()' function.<br>";
                 $sent_fsockopen = "OK (fsockopen)" ;
 //                $content = bin2hex($buf);
 //                $sent_fsockopen = $sent_fsockopen."Contents of magic packet:<br><textarea rows=\"1\" name=\"content\" cols=\"".strlen($content)."\">".$content."</textarea><br>\n";
                 fclose($socket);
                 unset($socket);
                 return $sent_fsockopen; // true
             }
             else
             {
                 echo "Using 'fwrite()' failed, due to error: '".$errstr."' (".$errno.")<br>\n";
                 fclose($socket);
                 unset($socket);
             }
         }
         else
         {
             echo "Using 'fsockopen()' failed, due to denied permission.<br>\n";
             unset($socket);
         }
     }
     // Try socket_create function
     if (function_exists('socket_create'))
     {
         $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); // create socket based on IPv4, datagram and UDP
         if($socket)
         {
             $level = SOL_SOCKET; // to enable manipulation of options at the socket level (you may have to change this to 1)
             $optname = SO_BROADCAST; // to enable permission to transmit broadcast datagrams on the socket (you may have to change this to 6)
             $optval = true;
             $opt_returnvalue = socket_set_option($socket, $level, $optname, $optval);
             if($opt_returnvalue < 0)
             {
                 $error = "Using 'socket_set_option()' failed, due to error: '".socket_strerror($opt_returnvalue)."'<br>\n";
                 return $error; // false
             }
             $flags = 0;
             // To do: handle error 'Operation not permitted'
             $socket_data = socket_sendto($socket, $buf, strlen($buf), $flags, $addr, $port);
             if($socket_data)
             {
                 $function = "socket_sendto";
 //                $socket_create = "A magic packet of ".$socket_data." bytes has been sent via UDP to IP address: ".$addr.":".$port.", using the '".$function."()' function.<br>";
 //                $content = bin2hex($buf);
 //                $socket_create = $socket_create."Contents of magic packet:<br><textarea rows=\"1\" name=\"content\" cols=\"".strlen($content)."\">".$content."</textarea><br>\n";
                 $socket_create = "OK  ... Start eingeleitet um ";
                 socket_close($socket);
                 unset($socket);
                 return $socket_create; // true
             }
             else
             {
                 $error = "Using 'socket_sendto()' failed, due to error: '".socket_strerror(socket_last_error($socket))."' (".socket_last_error($socket).")<br>\n";
                 socket_close($socket);
                 unset($socket);
                 return $error; // false
             }
         }
         else
         {
             $error = "Using 'socket_create()' failed, due to error: '".socket_strerror(socket_last_error($socket))."' (".socket_last_error($socket).")<br>\n";
             return $error; // false
         }
     }
     else
     {
         $error = "No magic packet has been sent, since no functions are available to transmit it.<br>\n";
         return $error; // false
     }
 }
 //
 $Return_WakeOnLan = WakeOnLan($mac_address, $addr, $cidr, $port); // executes this function
 //
 ?>
  <!DOCTYPE HTML>
  <HTML>
   <HEAD>
   <base target="_parent">
    <meta name="robots" content="noindex">
    <meta http-equiv="expires" content="0">
    <LINK REL="SHORTCUT ICON" HREF="favicon.ico">
    <LINK REL="SHORTCUT ICON" HREF="favicon.gif">
    <TITLE>Server Startbefehl</TITLE>
    <base target="_top">


    <style type="text/css">
    .auto-style1 {
        font-size: small;
        color: #FF0000;
    }
    a {
    color: #0000FF;
}
    .auto-style3 {
    color: #1BC50A;
}
    .auto-style4 {
        font-weight: normal;
    }
    </style>

   </HEAD>
   <BODY TEXT="#000000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?" style="background-color: #F0F0F0; width: 769px; height: 269px;">
    <P style="width: 657px"><strong>STATUSMELDUNG:</strong><br><br>Der
    Startbefehl an den Server wurde erteilt.<div id="max" style="font-family: Times New Roman; font-size: 15; color: #000000; font-weight:;">
    </div>

  <script language="javascript">
var initi = window.setInterval ('downcount()', 1000);
var text = 'Einen Moment bitte, der Server wird ';
var zahl = 130;
var dokument="https://file.myDomain.nix";
function downcount()
{
zeige = text + 'in ' +zahl+ ' Sekunden bereit sein.';
window.status = zeige ;
// für den Internet Explorer
document.all['max'].innerHTML = zeige ;
// für die neuen Netscape Versionen
document.getElementById('max').innerHTML = zeige ;
zahl --;
if (zahl < 0 )
{
parent.location.href=dokument;
}
}
</script>

    Sie werden automatisch weitergeleitet wenn der
    Status<span class="auto-style3"> <strong class="auto-style4">online</strong></span>
    erreicht.<P>       <P>
    &nbsp;
    <?php
 // header("refresh:5;url=http://swiss.myDomain.nix/status/StarteServer.php/");
 
    echo"R&uuml;ckmeldung:   ",$Return_WakeOnLan;
     $TimeStamp = time();
  //   $datum = date("d.m.Y",$timeStamp);
     $uhrzeit = date("H:i:s",$TimeStamp);
     echo "   ",$uhrzeit," Uhr";

echo(".<br />\n");
   
 //   sleep(130);
 //   header('Location: https://file.myDomain.nix');   // Nur weiterleiten wenn online

 // header("refresh:5;");
$ip = "file.myDomain.nix"; // [url] ohne www....[/url]
$port = "443";

if (!@$fp = fsockopen($ip, $port, $errno, $errstr, 1)){
// echo "Server ist Offline";
// echo '<font color="#990033">Server ist noch Offline</font>';
}
else {
// echo '<font color="#339933">Server ist jetzt Online</font>';
//echo "Server ist Online";
}
fclose($fp);


    ?><P class="auto-style1"> <br>Ihrer IP: <?php echo $_SERVER["REMOTE_ADDR"]; ?> wurde im Systemprotokoll gespeichert
    !</P>
   </BODY>
  </HTML>

### Zusammenführung Doppelpost ###


so sieht das ganze grafisch im Browser aus ...
nasstart.png nasstart2.png

// edit by stoney
5.10 Keine Aneinanderreihung eigener Beiträge (auch "Schieben" genannt) innerhalb von 24 Stunden; hier ist die "Bearbeiten"-Funktion zu verwenden.
 
Zuletzt bearbeitet von einem Moderator:
Na dann ist es doch erst recht easy ... die ganze "WakeOnLan"-Funktion muß nur noch aus dem Aufruf des erwähnten "ctlmgr_ctl" mittels "system" bestehen - da keine Daten vom Benutzer kommen, ist das nicht mal ein Security-Problem, wo man mit irgendeiner "escapeshell..."-Funktion gegensteuern müßte bzw. könnte. Wenn das NAS tatsächlich über den GUI-Button gestartet werden kann, dann sollte es auch über dieses Kommando funktionieren - denn das ist am Ende dasselbe, was hinter dem GUI-Button steckt.

Um den ganzen Rest der Funktion (vom Erstellen des "magic packets" bis zu seinem Versand) kümmert sich die Box selbst. Solange diese PHP-Seite nur mit passenden Credentials zugänglich ist und die Leute bereits an ihre Benutzung gewöhnt sind, ist das sogar besser als das automatische Wecken durch die FRITZ!Box (es gibt ja auch FRITZ!OS-Versionen, wo dieses automatische WOL funktioniert), wenn extern auf die Box zugegriffen wird.
 
hier mein PHP Script
Danke für das Script, aber das hat sich ja inzwischen erledigt. Siehe oben.
Wieweit das Freetzen die üblichen Box-Funktionen beeinflusst hat, kann ich nicht beurteilen.

Aber, wie ich beobachte, gibt es hier im Forum für solche Fälle Hellseher und Alleswisser, die können Dir alle Fragen beantworten, hauptsächlich die, die nicht gestellt werden!
 
Na dann ist es doch erst recht easy ... die ganze "WakeOnLan"-Funktion muß nur noch aus dem Aufruf des erwähnten "ctlmgr_ctl" mittels "system" bestehen

ich muss ein wenig grinsen , wenn es so einfach ist wie du sagst, was muss ich wie wo machen mit dem "ctlmgr_ctl" das WOL über eine Webseite funktioniert ?
Weiss nämlich wirklich nicht wo ich da ansetzen soll :(
In eine PHP Script oder nur in HTML oder noch was ganz anderes ???

Freetz hat ich auch mit der alten FritzBox 7270 und eben dieses PHP Script, was nun so nicht mehr funktioniert.

Danke - Peter

Oh morgen ist Weihnachten vorbei :D
 
Es ist letzlich Deine Entscheidung, wielange Du noch rumbasteln willst, ohne dass es vorangeht. Wenn Du nicht darauf angewiesen bist, kannst Du ja den Rest Deines Lebens damit verbringen.

Wenn Du Dir aber selbst einen Gefallen tun willst, dann vergiss PHP-Script, Freetzen und den ganzen (für Dich) offensichtlich zu komplizierten Kram, bringe die Box wieder in den Originalzustand und benutze dann die dafür von AVM vorgesehenen Weg. Die haben schließlich den besten Überblick über ihre eigenen Boxen und jahrelange Erfahrung dazu.

Erst wenn das nicht funktioniert, kann man Dir weiterhelfen.

Die Freetzerei ist was für Leute mit 150%igem Durchblick und unendlich viel Zeit. Ob Du Zeit hast, weiss ich nicht. Den vollen Durchblick hast Du jedenfalls nicht. Soviel ist klar!

Tschüss!
 
@it-fisi:
Das ist dann - unabhängig von Jahreszeit und Feiertagen - tatsächlich wieder eine Frage, wo ich jedem nur empfehlen kann, einfach mal eine Suchmaschine zu bemühen.

Da braucht man weder unmäßig viele Vorkenntnisse noch irgendwelche Expertise bei der Internet-Recherche ... Du bist 100% weder der Erste noch der Letzte, der sich die Frage stellt, wie man aus einem PHP-Skript heraus (wieso ein derartiger Mix von PHP- und HTML-Code - wie oben gezeigt - überhaupt funktioniert, fällt dann als Info quasi nebenbei mit ab) ein Kommando auf dem System ausführen kann ... mir wäre glatt so, als hätte ich meinerseits die dafür vorgesehene Funktion bereits weiter oben benannt.

Nicht böse sein und vor allem nicht persönlich nehmen ... aber da bleibe ich auch meinen eigenen Grundsätzen treu. Ich bin selbst weder PHP-Crack noch sonst irgendwie Fan dieser Sprache und benutze sie auch nur (eher widerwillig), wenn ich irgendetwas in PHP verstehen/korrigieren/analysieren will oder muß ... also bin ich zu 100% auch der Falsche, wenn es um die Beantwortung einer solchen Frage geht bzw. ich könnte das immer nur vieeel schlechter erklären, als das diverse Quellen im Internet (sowohl in Deutsch als auch in Englisch) bereits tun.

Warum sollte es hier also irgendeine Anleitung in dieser Richtung im IPPF geben (zumindest von mir, auch wenn das mit drei Beispielzeilen vielleicht schon um wäre)? Das ist ja nicht das Unterforum "Wie programmiere ich in PHP?" und damit wäre es (meiner eigenen Meinung nach jedenfalls) einfach auch der vollkommen falsche Ort.

Mit "Basteln" hat das jedenfalls praktisch gar nichts zu tun, wenn Du bereits den Webserver am Laufen hast und nur noch daran scheiterst, daß die bisher praktizierte Art des Weckens in diesem Falle nicht mehr funktioniert. Wenn Du mal ganz genau nachliest, was ich oben bereits geschrieben habe, dann steht da schon sehr deutlich, daß der Inhalt der Funktion "WakeOnLan" sich dann auf diesen Aufruf beschränken kann ... so schwer kann es jetzt nicht sein, in der Datei zu ermitteln, was die Funktion "WakeOnLan" sein könnte - damit klärt sich dann auch automatisch die Frage, wo man das nun einfügen/ändern soll.
 
Hast viel geschrieben ... Danke
Du brauchst dich nicht rechtfertigen, gehe dein Weg und alles ist gut.
und persönlich nehme ich gar nix mehr im Leben, ich bin glücklich und zufrieden.

schönes neues Jahr
 

Statistik des Forums

Themen
244,881
Beiträge
2,220,088
Mitglieder
371,611
Neuestes Mitglied
Mandylion73
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.