Wake on LAN mit Hilfe von PHP bei Server mit mehreren NICs

H

HBNuke

Grünschnabel
Hallo zusammen,

ich habe schätzungsweise nun eine Knalleraufgabe und zwar besitze ich einen Server mit mehreren Netzwerkkarten, die an unterschiedlichen Subnetzen angeschlossen sind. Aufgabe ist es nun mit einer Weblösung (sprich mit PHP) den Server dazu zu benutzen, dass er bestimmte Rechner per WOL (Wake on LAN) aufwecken kann. Hauptfrage ist für mich natürlich, wie ich befehlen kann, wann welche Netzwerkkarte benutzt werden soll. Habe einmal ETH1, die im Netz 10.115.25.0 (SM 255.255.255.0) angeschlossen ist und einmal BOND0 (ETH2 & ETH4), die im Netz 10.115.26.0 (SM 255.255.255.0) angeschlossen ist. (ETH1 hat zur Zeit keine IP aktiviert, weil sonst Linux immer Routing betreibt. Die ETH1 soll ausschließlich für WOL des Netzes 10.115.25.0 benutzt werden.)

Mein Code mit dem sich leider nur alle Computer aus dem Netz 10.115.26.0 wecken lassen, aber nicht aus dem Netz 10.115.25.0 (außer wenn die IP des Computers noch im ARP-Cache des Routers steht) lautet:

PHP:
<?php
// IP und MAC werden über eine Eingabemaske im HTML-Teil übergeben
if (($_POST['WakeUp'] == "Wake Up!") && ($_POST['IP'] != "") && ($_POST['MAC'] != ""))
 {

 function WakeOnLan($addr, $mac)
  {
   $addr_byte = explode(':', $mac);
   $hw_addr = '';

   for ($a=0; $a < 6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));

   $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);

   for ($a = 1; $a <= 16; $a++)    $msg .= $hw_addr;

   // send it to the broadcast address using UDP
   // SQL_BROADCAST option isn't help!!
   $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
   if ($s == false)
    {
     echo "Error creating socket!\n";
     echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
    }
   else
    {
     // setting a broadcast option to socket:
     $opt_ret =  socket_set_option($s, 1, 6, TRUE);
     if($opt_ret < 0)
      {
       echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
      }
     $e = socket_sendto($s, $msg, strlen($msg), 0, $addr, 2050);
     socket_close($s);
     echo "Magic Packet sent (".$e.") to ".$addr.", MAC=".$mac;
    }
  }

//if you have switch or other routing devices in LAN, sendign to
// the local IP isn't helps! you need send to the broadcast address like this:

WakeOnLan($_POST['IP'], $_POST['MAC']);


 }
?>

Vielen Dank für eure Hilfe!
HBNuke

P.S.: Wenn es die Möglichkeit gibt einfach einen Broadcast mit dem "Magic Packet" über alle Netzwerkkarten zu verschicken, hätte ich schon die ersehnte Lösung - Aber wie? :(
 

Ähnliche Themen

Windows clients können nicht mehr auf lange laufendes System zugreifen

Routing Problematik

Modulfehler?

Festplatte friert ein nach suspend/resume

Wake-on-LAN funktioniert nicht.

Zurück
Oben