Wake-on-LAN (WOL) é um padrão para redes Ethernet que permite que um computador seja ligado - ou "acordado" - por um pacote de rede.
O padrão Wake-on-LAN é uma implementação na placa-mãe do computador, sendo assim, independe da ação do sistema operacional para controlar seu comportamento.
Para ser utilizado, o Wake-on-LAN deve ser ativado na seção gerenciamento de energia, no utilitário de configuração da BIOS.
Fonte:
Wake-on-LAN – Wikipédia, a enciclopédia livre
Após configurar a BIOS do computador a ser "acordado", pode ser necessário configurar também a placa de rede pelo sistema operacional para aceitar a conexão.
No
GNU/Linux:
# ethtool -s eth0 wol g
No Windows:
- Botão direito do mouse em "Meu Computador";
- Clique em: Propriedades → Gerenciador de dispositivos (ou hardware);
- Ache a sua placa de rede na lista e clique com o botão direito;
- Clique em "Propriedades";
- Primeiro, vá em "Gerenciamento de energia" e marque a caixa "Allow this device to wake the computer" ou equivalente;
- Depois vá na aba "Advanced" e procure a opção "Wake From Shutdown" e marque como "On";
- Procure logo abaixo a opção "Wake-Up Capabilities" e coloque o valor como "Magic Packet";
- Pressione "OK" e deve estar configurado (como alguém em sã consciência acha Windows fáil? rs).
Após estes passos, o computador a ser "acordado", ou servidor, já está pronto para o funcionamento.
O funcionamento do Wake-on-LAN (WOL) depende basicamente de um pacote UDP especial, chamado "pacote mágico". A placa de rede do servidor, mesmo quando o computador estiver desligado, ficará em stand-by à espera deste pacote. Quando recebido, o "pacote mágico" irá deflagrar o boot do servidor.
Este "pacote mágico" consiste basicamente em um pacote de broadcast, cujo payload é composto por 6 Bytes FF (255 em hexadecimal), seguidos de 16 repetições do endereço MAC do servidor a ser "acordado".
Este pacote, geralmente, é enviado para o endereço de broadcast da rede, nas portas 7 ou 9 UDP.
Todos os hosts da LAN irão receber este pacote, porém, só aquele com o endereço MAC definido irá ligar. Para fazer este procedimento, geralmente utiliza-se programas como o
ether-wake, WOL, WakeOnLan, entre outros.
Veja aqui:
Porém, como aqui a intenção é a 'escovação' de Bits e aprender como funciona o protocolo, vamos fazer o pacote na mão e enviaremos com o
Netcat ou o
socat. Mãos à obra.
Suponha que o endereço MAC do servidor seja:
aa:bb:cc:dd:ee:ff
Devemos fazer um pacote (pacote mágico, muito prazer) iniciado por "FFFFFFFFFFFF" e seguido de 16 repetições deste endereço MAC, sem os dois pontos (aabbccddeeff), e após isso, converter de hexadecimal para binário. Aqui usarei a ferramenta
xxd (se não tiver instalada, instale-a agora antes de prosseguir).
A forma didática é assim:
ETHER="aa:bb:cc:dd:ee:ff"
$ ETHER2=`echo $ETHER | sed "s/://g"`
$ ETHER3="${ETHER2}${ETHER2}${ETHER2}${ETHER2}"
$ ETHER4="FFFFFFFFFFFF${ETHER3}${ETHER3}${ETHER3}${ETHER3}"
$ echo ${ETHER4} | xxd -r -p > wake.packet
E o seu pacote mágico já estará salvo no arquivo "wake.packet". Contudo, uma forma mais fácil e simplificada, que eu prefiro, seria assim:
echo aa:bb:cc:dd:ee:ff | sed -e 's/://g' -e 's/^.*$/FFFFFFFFFFFF&&&&&&&&&&&&&&&&/' | xxd -r -p > wake.packet
O pacote já está feito. Se você utilizar o
cat para ler o arquivo "wake.packet", você verá conteúdo binário incompreensível.
Para visualizar o arquivo, você deve utilizar o
xxd, que deverá ter uma saída parecida com a seguinte:
# xxd wake.packet
0000000: ffff ffff ffff aabb ccdd eeff aabb ccdd ................
0000010: eeff aabb ccdd eeff aabb ccdd eeff aabb ................
0000020: ccdd eeff aabb ccdd eeff aabb ccdd eeff ................
0000030: aabb ccdd eeff aabb ccdd eeff aabb ccdd ................
0000040: eeff aabb ccdd eeff aabb ccdd eeff aabb ................
0000050: ccdd eeff aabb ccdd eeff aabb ccdd eeff ................
0000060: aabb ccdd eeff ......
E agora que o pacote já está feito, o próximo passo será enviá-lo via
socket para o endereço de broadcast da rede na porta 7/UDP. O computador com o endereço MAC correspondente, se estiver configurado corretamente, irá acordar.
Aqui vamos usar o Netcat:
# netcat -c -v -u -n -x -p 80 192.168.1.255 7 < wake.packet
Onde "192.168.1.255" é o endereço de broadcast da sua rede.
Uma coisa que eu percebi aqui em meus testes, é que algumas versões do Netcat não possibilitam o envio de pacotes UDP para o broadcast, porém, algumas versões sim (no Windows funciona).
Caso não funcione na sua, você pode utilizar o Socat como alternativa para enviar o pacote:
http://www.dest-unreach.org/socat/
O Socat é conhecido também como "netcat++" (extended design, new implementation).
A última versão do Netcat é de janeiro de 2004 (versão 0.7.1), ou seja, o Socat (netcat++) tem bem mais opções.
O comando é o seguinte:
# socat - UDP-DATAGRAM:192.168.1.255:7,broadcast < wake.packet
Ou se você, como eu, gosta de comandos one-liners, pode fazer direto assim com apenas esse comando:
# socat - UDP-DATAGRAM:192.168.1.255:7,broadcast < <(echo aa:bb:cc:dd:ee:ff | sed -e 's/://g' -e 's/^.*$/FFFFFFFFFFFF&&&&&&&&&&&&&&&&/' | xxd -r -p)
Onde, novamente,
aa:bb:cc:dd:ee:ff é o endereço MAC do servidor e
192.168.1.255 é o endereço de broadcast da sua rede.
Espero com isso, ter ajudado a esclarecer o funcionamento deste protocolo tão útil.
Obrigado.
Referências