Pro „probouzení“ stroje v LAN je potřeba splnit několik požadavků, ale v podstatě se pracuje na 2. vrstvě ISO/OSI. Více zde. Při probouzení stroje z WAN do hry vstupuje další vrstva a po cestě musí magick paket překonat router, který ho pošle do správného subnetu.
Pokud máte veřejnou IP adresu (pro případ WOL musí být navíc i pevná) a vlastní router, nastavení na routeru bude vypadat následovně:
Na obrázku je screenshot z konfigurace routeru ASUS WL500g Premium. V nastavení „NAT Setting –> Virtual Server“ je otevřen port TCP/UDP 80 a směrován do LAN na rozhraní 192.168.1.10 port TCP/UDP 3389, což je port, který defaultně používá microsoftí vzdálená plocha (Remote Desktop Protokol).
Pro „probuzení“ stroje pak stačí zadat do nějaké online WOL aplikace na internetu (např. http://wake-on-lan.samuraj-cz.com) IP adresu na WAN rozhraní routeru, MAC adresu probouzeného stroje a port, v tomto případě port č. 80. I když je udáváno, že magick paket je posílán jako UDP datagram na port 0, 7 nebo 9, spolehlivě fungují i ostatní porty stejně jako v tomto případě UDP 3389 – což je nakonec výhodné z hlediska bezpečnosti a jednoduchosti konfigurace v tom, že pro dvě služby je otevřen jeden port.
{$A+,B-,C-,D-,E-,F-,G+,H-,I-,J+,K-,L-,M-,N+,O-,Q-,R-,S-,T-,V-,W-,X+,Y-}
program wake_on_lan;
uses Sockets, Winsock;
var
udaj : packed record
znacka : array [0..5] of byte;
mac : array[0..15, 0..5] of byte;
end;
i, x, y : integer;
addr : sockaddr_in;
S : cardinal;
delka : integer;
retezec : string;
cislo : byte;
optval : longint = 1;
begin
if paramcount <> 1 then
halt;
Retezec := UpCase(ParamStr(1));
with Udaj do
begin
for i := 0 to 5 do
begin
case Retezec[i*2+1] of
'0'..'9' : Cislo := Ord(Retezec[i*2+1])-48;
'A'..'F' : Cislo := Ord(Retezec[i*2+1])-55;
else Cislo := 0;
end;
Cislo := Cislo*16;
case Retezec[i*2+2] of
'0'..'9' : Inc(Cislo,Ord(Retezec[i*2+2])-48);
'A'..'F' : Inc(Cislo,Ord(Retezec[i*2+2])-55);
end;
Mac[0,i] := Cislo;
end;
end;
for i:=0 to 14 do
move(udaj.mac[0,0],udaj.mac[i+1,0],6);
FillByte(udaj.Znacka,SizeOf(udaj.Znacka), -1);
S:=Socket (AF_INET,SOCK_DGRAM,0);
if S <> 0 then
begin
addr.sin_addr.S_addr := inet_addr('255.255.255.255');
addr.sin_port := htons(9);
addr.sin_family := AF_INET;
fpsetsockopt(s,SOL_SOCKET,SO_BROADCAST,@optval,SizeOf(optval));
sendto(s, udaj, sizeof(udaj),0,addr, sizeof(addr));
end;
end.
Více o WOL:
http://cs.wikipedia.org/wiki/Wake_on_LAN
http://www.samuraj-cz.com/clanek/wake-on-lan-lokalni-i-vzdaleny-subnet/