forum

www.SAMURAJ-cz.com 

20.11.2008 Nikola kategorie: VÍTEJTE V MÉM SVĚTĚ

Články

Wake on LAN - lokální i vzdálený subnet

Neděle, 10.08.2008 20:42 | Samuraj | sítě
Asi každý má představu o tom, co je to Wake on LAN, tedy vzdálené zapnutí (probuzení) počítače. Když jsem ale začal přemýšlet o použití WOL na počítač, který je v jiném subnetu a je tedy mezi ním router, tak jsem si uvědomil řadu komplikací. Prostudoval jsem množství článků a diskuzí a zjistil jsem, že většinou je popis neúplný a často dokonce nesprávný. Proto v tomto článku shrnuji komplexně celou problematiku, kterou jsem nastudoval. Popisuji řešení pro probuzení počítače ve stejném, ale i vzdáleném (třeba přes internet) subnetu. A uvádím také příklad skriptu v PHP.

Vytvořil jsem webovou verzi aplikace, která provádí dále popsaný Wake on LAN. Dostupná je na adrese Wake On LAN (WoL) - turning on your computer remotely (v AJ).

Wake on LAN (WOL) funguje na Ethernetu a je nezávislý protokolu (TCP/IP, IPX či jiný). Jak by název napovídal, tak buzení funguje v rámci lokální sítě. LAN dříve představoval jeden subnet, takže vše bylo jednoduché a dále je popsáno v první variantě. Dnes je však lokální síť velmi často dělena do řady subnetů a jako LAN se označuje určitá geografická lokalita. Takže se WOL řeší do jiného subnetu, občas se označuje jako WOL over the internet, a tuto situaci popisuji v dalších variantách.

Pozn.: V článku různě používám termíny rámec (frame) a paket (packet), často (ne vždy) se dají zaměnit, záleží na tom, zda nás v daném kontextu zajímají i MAC adresy nebo pouze IP adresy a výše. Podrobněji v článku TCP/IP - model, encapsulace, paket vs. rámec.

Co musí splňovat klient - zapnutí WOL

Nejprve začnu tím, co musí splňovat klient, tedy buzený počítač, aby jej bylo možné vzdáleně zapnout.

Je potřeba podpora u základní desky a u síťové karty (NIC). Funguje to tak, že i když je počítač vypnutý, tak síťová karta je stále napájena a poslouchá komunikaci, zda nepřišel speciální rámec (frame), který se jmenuje Magic Packet. Síťová karta pracuje ve speciálním režimu Magic Packet Mode. Ve chvíli, kdy zachytí Magic Packet, který je určen pro ni (podle MAC adresy, viz dále), tak pošle signál základní desce, aby zapnula počítač.

Dříve se pro externí síťové karty používal speciální kabel, který je spojoval se základní deskou. Později se tento budící signál začal posílat po PCI sběrnici (od verze PCI 2.2). Dnes máme síťovou kartu integrovanou na základní desce, takže je vše jednodušší (ale stejně to ve skutečnosti funguje po PCI či PCIe).

Většinou stačí v BIOSu zapnout funkci Wake On LAN, která bývá nazvána různě, například na mé domácí základní desce se skrývá v AMI BIOSu pod Power - APM Configuration - Power On By PCIE Device, protože integrovaná síťová karta je na PCI Express sběrnici.

Někdy je třeba ještě nastavit síťovou kartu, což můžeme udělat z Windows pod Control Panel - System - Hardware - Device Manager - daný síťový adaptér - Properties - Advanced - zde nastavení Wake Up Capabilities, případně ještě Wake From Shutdown.

Důležité je, že standardně musí být síťová karta přepnuta do speciálního režimu Magic Packet Mode (to se provede nastavením bitu v interním registru), kdy kontroluje síťový provoz, zda nepřišel Magic Packet. To dosáhneme korektním vypnutím počítače (při zapnutí se tento speciální mód automaticky vypne), někde se tomu říká Soft Shutdown. K tomu nedojde například při přerušení dodávky elektrické energie nebo při vypnutí počítače dlouhým podržením Power Button. Vše ještě záleží na to, zda do Magic Packet Mode přepíná ovladač síťové karty, pak vše musí být nastaveno v tomto ovladači a operační systém musí být korektně ukončen. Nebo je to řešeno v hardwaru či BIOSu.

Pozn.: To, že je síťová karta napájena i při vypnutém počítači poznáme podle toho, že má stále link state (svítí dioda na síťové kartě i na portu switche, na switchi se hlásí jako connected).

Základní princip WOL - Magic Packet

Wake on LAN funguje tak, že z nějaké řídící stanice odešleme speciální rámec (frame) tzv. Magic Packet. Magic Packet je standardní rámec, který obsahuje zdrojovou adresu, cílovou adresu, která může být adresou cílové stanice nebo multicastovou (tzn. i broadcast) adresou. Datový obsah paketu musí kdekoliv uvnitř (ale většinou zde jiný obsah není) obsahovat synhronizační stream, což je 6 bytů o hodnotě FF. Následovaný 16 krát zopakovanou MAC adresou cílové stanice (bez oddělovače).

Rámec se odesílá jako UDP a doporučuje se použít port 9 discard nebo 7 echo, ale většinou se port nekontroluje, takže se může použít libovolný od 0 do 65535. Zdrojový port je dynamický.

WOL v lokálním subnetu

Pomocí broadcastu

Pokud jsou obě stanice (vysílající i buzená) ve stejném subnetu, tak je situace jednoduchá a bezproblémové. Běžně to funguje tak, že se Magic Packet pošle jako broadcast. Tedy hodnoty v rámci jsou na L2 (druhá vrstva dle OSI modelu) zdrojová MAC = vysílající stanice, cílová MAC = FF:FF:FF:FF:FF:FF. L3 zdrojová IP adresa = vysílající stanice, cílová IP = 255.255.255.255.

Wake On LAN - broadcast packet

Pozn.: Z toho je vidět, že pro použití potřebujeme znát pouze MAC adresu probouzené stanice.

Pozn.: Pokud bychom Magic Packet v rámci stejného subnetu chtěli poslat jako unicast, tak dojde k problému. Když fyzická vrstva síťového rozhranní vytváří rámec a nezná MAC adresu pro zadanou IP adresu (z lokální ARP tabulky), tak odešle ARP dotaz (broadcast), na který nedostane odpověď, takže rámec nikdy nevytvoří. My sice MAC adresu známe (a navíc není důležitá), ale to bychom museli vytvořit rámec sami na nižší vrstvě (než asi běžně použijeme v nějakém programovacím jazyku).

WOL do vzdáleného subnetu (přes internet)

Složitější situace nastane, pokud buzená stanice není ve stejném subnetu, to znamená, že v cestě se nachází jeden nebo více routerů. Vše plyne z principu komunikace v síti (nebo funkce aktivních síťových prvků), podrobněji se můžete dočíst v článku TCP/IP a ethernet - cesta v síti, aktivní síťové prvky.

První věc je, že router odděluje broadcastové domény, jednodušeji řečeno, broadcasty se skrze router nešíří (standardně, dá se to obejít speciální konfigurací routeru). Aplikace, které se dají získat na internetu, většinou nabízí i možnost zadání IP adresy buzené stanice (a bohužel většinou bez popisu co jak zadávat). A od toho se na internetu vede řada diskusí. Vždyť přece vypnutá stanice nemá IP adresu, síťová karta má pouze svoji hardwarovou adresu, tedy MAC adresu. Ale použití této IP adresy neslouží k identifikaci stanice, ale k identifikaci subnetu.

Pozn.: Síťová karta v Magic Packet Mode se většinou nedívá na L2, L3 ani L4, ale pouze do datového obsahu rámce.

Pomocí unicastu

Pokud je cíl v jiném subnetu, tak můžeme použít unicast, ale to funguje jen chvíli (možné časy jsou uvedeny dále) po vypnutí počítače. Při odesílaní paketu naše stanice zjistí, že cíl je v jiném subnetu, takže zprávu pošle na bránu (gateway nebo podle své routovací tabulky, do rámce se použije MAC adresa brány a IP adresa cíle, to řeší fyzická vrstva síťového rozhranní). Pokud router má v ARP tabulce uloženu danou cílovou IP adresu, tak použije správnou MAC adresu a odešle rámec. Pokud dostane rámec switch a v CAM tabulce (tabulka MAC adres a portů) nemá záznam, tak pošle zprávu na všechny porty mimo příchozího. Pokud ještě záznam má, tak pošle přímo na daný port.

Problém ale nastane, když router nemá záznam v ARP tabulce. Tehdy pošle broadcast, kde se ptá, kdo má danou IP adresu, ale protože nedostane odpověď (od vypnuté stanice), tak paket zahodí.

Pozn.: V tomto případě tedy potřebujeme MAC adresu cílové stanice a její poslední IP adresu. Teoreticky bychom mohli použít i jinou IP adresu z daného subnetu, ale jde o to, aby ji router měl ve své ARP tabulce (je nám jedno, že ji na L2 přiřadí jinou MAC adresu) a naopak switch, aby tuto přiřazenou MAC adresu neměl v CAM tabulce, protože by rámec odeslal jen na jiný port. Pokud bychom za routerem měli hub, tak bychom mohli použít IP adresu libovolné běžící stanice v daném subnetu a vždy by nám to fungovalo.

Pomocí směrovaného broadcastu

Abychom tedy dostali paket do cílového subnetu, můžeme použít směrovaný broadcast na subnet (Subnet Directed Broadcast, např. 10.0.0.255), který používá boradcastovou adresu daného subnetu, více v článcích TCP/IP - metody vysílání dat a TCP/IP - adresy, masky, subnety a výpočty. Ten by měl cestovat přes routery až na ten, který má daný subnet jako přímo připojený. Tento router upraví rámec na běžný broadcast a odešle jej na odpovídající rozhranní.

Pozn.: V tomto případě tedy potřebujeme MAC adresu cílové stanice a broadcastovou adresu subnetu, v kterém se nachází.

Protože však tato technika byla používána k útokům, tak bývá na routerech nebo i firewallech většinou zakázána. To se týká routeru, který by měl rámec převést na broadcast, přes ostatní by měl rámec projít normálně.

Pozn.: Nejběžnější je Smurf Attack, který má zařídit Denial of Services (DoS). Útočník odesílá množství paketů  ICMP echo reply s podvrženou zdrojovou adresou jako directed broadcast, všechny stanice v subnetu odpovídají echo reply a stanice, jejíž adresa je ta podvržená, je zahlcena.

Na novějších Cisco routerech a switchích (L3) je tato funkce defaultně zakázána, ale je možno ji povolit pro daný interface (port či VLANu). Následuje ukázka nastavení.

Switch(config)#interface vlan 100
Switch(config-if)#ip directed-broadcast   // povolení pro interface, může být následováno označením ACL
Switch(config-if)#exit 
Switch(config)#ip forward-protocol udp 9  // určení povoleného protokolu a portu (volitelně) pro directed broadcast

bezpečnostních důvodů se vždy doporučuje povolení směrovaných broadcastů doplnit o ACL (kde se povolí odesílání třeba jen z jedné IP adresy).

Pro zajímavost se může hodit informace o defaultním timeoutu hodnot na některých Cisco zařízeních. Timeout pro CAM tabulku bývá 5 minut, timeout pro ARP tabulku bývá 4 hodiny. Tyto hodnoty jsou nastavitelné.

Příklad skriptu Wake On LAN v PHP

Zde je uvedený jednoduchý příklad implementace Wake On LAN pomocí PHP. Pokud známe princip WOL, tak není nic těžkého takovýto skript napsat.

// použití WakeOnLAN("00-02-A5-31-CE-5E");
// nebo    WakeOnLAN("00-02-A5-31-CE-5E", "192.168.10.15");
// nebo    WakeOnLAN("00-02-A5-31-CE-5E", "192.168.10.255");
// vrací   true - odeslání proběhlo OK (to neznamená, že cílová stanice přijala rámec)
//         false - došle k chybě při vytváření nebo odeslání rámce
function WakeOnLAN($mac, $ip = "255.255.255.255", $port = 9) {
  $mac = strtoupper($mac);          // převedeme písmena v MAC adrese na velká
  if(ereg("^([0-9|A-F]{2})[.|:|-]?([0-9|A-F]{2})[.|:|-]?([0-9|A-F]{2})[.|:|-]?([0-9|A-F]{2})[.|:|-]?([0-9|A-F]{2})[.|:|-]?([0-9|A-F]{2})$", $mac, $val)) 
    $mac = chr(hexdec($val[1])).chr(hexdec($val[2])).chr(hexdec($val[3])).chr(hexdec($val[4])).chr(hexdec($val[5])).chr(hexdec($val[6]));  // uloží MAC jako hexadecimální hodnoty
  else return false;                // MAC adresa je v neplatném tvaru
  $msg = str_repeat(chr(255), 6);   // úvodní synchronizační stream 6x FF
  $msg .= str_repeat($mac, 16);     // následovaný 16x zopakovanou MAC adresu cíle
  if(($s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) == false) return false;    // otevře UDP socket
  if(socket_set_option($s, SOL_SOCKET, SO_BROADCAST, true) == false) return false; // nastaví jako broadcast
  if(socket_sendto($s, $msg, strlen($msg), 0, $ip, $port) == false) return false;  // odešle Magic Packet na danou IP a UDP port
  socket_close($s);                 // uzavření socketu
  return true;
}

Tento kód můžeme doplnit o nějaké kontroly a vytvořit jednoduché webové rozhraní a máme aplikaci.

WOL webové rozhranní

Aplikace pro WOL

Samuraj Wake On LAN Command Line - sWOLcmd

Jako první musíme zmínit aplikaci, kterou jsem vytvořil po napsání tohoto článku (a kde jsem zúročil nabité zkušenosti). Podrobný popis naleznete v Samuraj Wake On LAN Command Line - aplikace sWOLcmd. Jedná se o WOL aplikaci pro příkazový řádek a funkční v 32 bitových Windows. Stáhnout si můžete komprimovaný archiv sWOLcmd.

sWOLcmd

Další aplikace

Aplikací, které slouží k probuzení počítače pomocí WOL, je velká řada. Ať už grafických nebo pro příkazovou řádku a pro rozličné operační systémy. Často je funkce WOL doplněna do různých aplikací pro správu síťového prostředí. Uvádím zde pár příkazů grafických aplikací pro Windows.

Odkazy

zobrazeno: 2079krát | Komentáře [12]

Související články:

Počítačové sítě - Computer networks

Tento seriál se věnuje základům počítačových sítí. Jsou zde stručně popsány důležité praktické aspekty, které by měl znát každý, kdo se o sítě zajímá.

Pokud se Vám článek líbil, tak mne potěšíte, když uložíte odkaz na některý server:
  linkuj.cz | zalinkuj.cz | jagg.cz | vybrali.sme.sk | del.icio.us.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže. Pokud chcete poradit s nějakým problémem či diskutovat na nějaké téma, tak použijte fórum.

Komentáře

  1. [1] lukas

    Moc dekuji za tento clanek, neco podobneho jsem hledal.

    Jen bych se chtel zeptat. Mam problem s tim ze ten php kod funguje pokud ho poustim na Apache/Win XP, ale kdyz ho pustim na IIS7/W2008 tak to sice posle pakety (Wake on Lan Monitor), ale nic se nestane. Nemate nekdo s timto zkusenost?

    Středa, 13.08.2008 17:18 | odpovědět
  2. [2] invader

    Ahoj,

    ja bych se chtel zeptat, zda by slo paket poslat proste unicastem na rozhrani routeru a na nem forwardovat vse co prijde na udp port treba 9 na adresu broadcastu insterni site, kde se nachazi pocitac, ktery chci zaptnout. To by melo jit taky?

    Pondělí, 18.08.2008 17:22 | odpovědět
  3. [3] Samuraj

    odpověď na [2]invader: No to je vlastně to, co dělá directed subnet broadcast. Ale třeba na Linuxovém routeru by to asi šlo nastavit.

    Pondělí, 18.08.2008 17:41 | odpovědět
  4. [4] Heron

    odpověď na [1]lukas: Z Windows Vista po SP1 take nelze posilat "WOL" packety. Proste to utnuli.

    Úterý, 19.08.2008 11:03 | odpovědět
  5. [5] Lukas

    odpověď na [4]Heron:

    Nejsem si jist jak myslis "utnuli" ,ale na komp nejaka sada dat prijde. a podle WOL monitoru vcelku podobne jako z XP pc. Nicmene nejsou tak "ucinna" :-( a pocitac se proste neprobudi..

    Úterý, 02.09.2008 09:26 | odpovědět
  6. [6] Lukas

    odpověď na [5]Lukas:

    PS: kdyz pouziju samurajovo program swolcmd tak pocitac z W2008 probudim. Spis mam podezreni na ten php kod a na to jestli "neco" neklape kdyz to bezi na IIS a ne na apache.. ale do toho ja uz moc nevidim :(

    Středa, 03.09.2008 15:09 | odpovědět
  7. [7] Samuraj

    odpověď na [6]Lukas: No zdá se mi to celé podivné. Ten můj prográmek je napsaný v PHP a základ je ten kód zde (i když doplněný). Na webovém serveru by nemělo záviset, je to otázka PHP interpretru a knihoven. Řekl bych, že to používá klasickou síťovou vrstvu Windows, takže na OS asi záleží.

    Ale pokud ten paket odejde OK, tak nevím v čem by mohl být problém. Jedině, že se paket nesestaví správně (například broadcast). Jinak určitě to ovlivňuje php extension php_sockets.

    Chci to na W2008 zkusit, ale pořád jsem nenašel čas.

    Středa, 03.09.2008 16:04 | odpovědět
  8. [8] Paia

    Trochu mi zatím není jasný, jestli se tímto postupem dá zapnout můj domácí komp z kompu v práci. Mám doma naštěstí veřejnou IP, router s NAT a kompy doma v rozsahu 192.168.xx.yy, přičemž xx je jiný než rozsah adres na síti v práci. A připojení v práci máme VPN tunelem do mateřský firmy 250 km daleko, takže po cestě ven do internetu je pár routerů a u nich firewall pro celou firmu.

    Čili, kdybych udělal na mým routeru cestu pro packet dle čísla portu na jednotlivý kompy, mohlo by to fungovat, no ne? Tedy pokud by packet prošel skrz firmu ven...

    Pátek, 05.09.2008 15:49 | odpovědět
  9. [9] Samuraj

    odpověď na [8]Paia: Teoreticky by to chodit mělo, jak píšete. Když to dojde až na váš domácí router, tak pak jen je otázka, aby ten z toho uměl udělat broadcast.

    Problém je, že na neveřejnou adresu nemůžete použít directed broadcast (nedošel by na router), takže jediná možnost je, poslat to na veřejnou adresu routeru a ten to musí transformovat.

    Pátek, 05.09.2008 16:40 | odpovědět
  10. [10] Karel Bordich

    Pro probuzení počítače přes internet, třeba z kavárny na dovolené, lze použít webovou aplikaci na adrese wol.vanis.cz/

    Sobota, 06.09.2008 18:14 | odpovědět
  11. [11] Samuraj

    odpověď na [10]Karel Bordich: Ano, ale jak jsem se snažil vysvětlit v článku, tak většině lidí to nebude fungovat.

    Neděle, 07.09.2008 12:35 | odpovědět
  12. [12] Paia

    odpověď na [9]Samuraj: Prima, tak jen musím najít, jak to transformovat, snad to půjde, má docela bohatou konfiguraci, jen se v ní vyznat (no, překlad portů pro VNC a dalších pár aplikací jsem v nastavení NATu zvládnul).

    Pondělí, 08.09.2008 09:54 | odpovědět
Přidat komentář

Vložit tag: strong em link

Vložit smajlík: :-) ;-) :-( :-O


Ochrana proti SPAMu, zdejte následující čtyři znaky image code

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách