Wake-on-LAN (WOL) utilizando Netcat - Dissecando o protocolo

Este artigo visa explicar o funcionamento do protocolo Wake-on-LAN, através da construção e envio de forma manual de pacotes de dados.

[ Hits: 14.051 ]

Por: Fernando em 26/07/2013 | Blog: https://github.com/phoemur/


Wake-on-LAN



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


   

Páginas do artigo
   1. Wake-on-LAN
Outros artigos deste autor

ZFS no GNU/Linux

i3 - Tilling Window Manager

Honeypot Kippo 0.8 - Instalação e utilização

Leitura recomendada

GNU Emacs (Intro)

UNIX - Definição e História

Monitorando a temperatura do computador com lm_sensors + MRTG

Virtualização com Proxmox VE

Instalando Debian através de um win32 executável

  
Comentários
[1] Comentário enviado por lcavalheiro em 26/07/2013 - 01:45h

Assim é que se faz, Fernando! Escovação de bits, coisa digna do nosso povo! Parabéns, o artigo está ótimo!

[2] Comentário enviado por phoemur em 26/07/2013 - 12:21h

Só esclarecendo a questão do Netcat...

A versão que não funciona é o GNU netcat (http://netcat.sourceforge.net/), versão 0.7.1, pois ele não tem a opção -b que possibilita enviar pacotes UDP para o broadcast..

A versão que funciona é o netcat 1.10 (http://nc110.sourceforge.net/) que é o netcat original, sem ser da GNU, padrão dos BSD, Unix e instalável no Windows...

Para mandar o pacote seria:
nc -b -u 192.168.1.255 7 < wake.packet


Também tentei mandar o pacote com a implementação socket do bash, porém por questões de segurança ele não permite, então não coloquei no artigo, mas o comando seria algo assim:
exec 3<> /dev/udp/192.168.1.255/7 cat wake.packet >&3

[3] Comentário enviado por thyagobrasileiro em 27/07/2013 - 01:40h

Otimo artigo!

Para recriar os datagramas, ja tentasse utilizar o Hping3?

[4] Comentário enviado por phoemur em 27/07/2013 - 19:39h

Deve funcionar, depois eu testo:
hping3 -c 1 --udp -p 7 192.168.1.255 -E wake.packet -d 102

Não tenho experiência com essa ferramenta

*Edit: O comando acima com hping3 está funcionando aqui

[5] Comentário enviado por gpxlnx em 29/07/2013 - 10:49h

Phoemu Meus sinceros parabens pelo artigo, estou com algumas duvidas

1, ao criar o pacote e visualizalo com o xdd me retornou o seguinte resultado

" 000000: ffff ffff ffff 5404 a62c 5664 5404 a62c ......T..,VdT..,
0000010: 5664 5404 a62c 5664 5404 a62c 5664 5404 VdT..,VdT..,VdT.
0000020: a62c 5664 5404 a62c 5664 5404 a62c 5664 .,VdT..,VdT..,Vd
0000030: 5404 a62c 5664 5404 a62c 5664 5404 a62c T..,VdT..,VdT..,
0000040: 5664 5404 a62c 5664 5404 a62c 5664 5404 VdT..,VdT..,VdT.
0000050: a62c 5664 5404 a62c 5664 5404 a62c 5664 .,VdT..,VdT..,Vd
0000060: 5404 a62c 5664 T..,Vd"

Percebe o monte de Vdt, saio diferente da sua saida, ja aconteceu com vc? saberia me dizer o que pode ser?

2. Utilizando o nc 1.10 mesmo a opcao -b -c nao esta disponivel achei estranho mas estou testando outras versoes.

3. utilizo uma topologia um pouco diferente e quero saber se vc ja teve alguma situacao parecida. Aqui meu pc esta ligado via cabo de rede porem o cabo de rede vem de um adptador wireless AP ovslink que esta logado na rede wifi. Queria saber se isso pode influir no wake.

Agradeco a atencao se puder responder e obg mais uma vez.

[6] Comentário enviado por phoemur em 29/07/2013 - 11:33h

é normal as coisas depois, no exemplo só não tem nada depois porque o mac é aabbccddeeff, veja aqui o meu:

0000000: ffff ffff ffff 60eb 6933 a20d 60eb 6933 ......`.i3..`.i3
0000010: a20d 60eb 6933 a20d 60eb 6933 a20d 60eb ..`.i3..`.i3..`.
0000020: 6933 a20d 60eb 6933 a20d 60eb 6933 a20d i3..`.i3..`.i3..
0000030: 60eb 6933 a20d 60eb 6933 a20d 60eb 6933 `.i3..`.i3..`.i3
0000040: a20d 60eb 6933 a20d 60eb 6933 a20d 60eb ..`.i3..`.i3..`.
0000050: 6933 a20d 60eb 6933 a20d 60eb 6933 a20d i3..`.i3..`.i3..
0000060: 60eb 6933 a20d

Quanto a topologia da rede, o computador a ser acordado precisa ser ligado com cabo, com wireless não dá pois o protocolo teria que ser outro, o WoWLAN...
Já para mandar o pacote tanto faz, como cliente eu aqui mando com o notebook ligado via wireless...

Pra fazer wake-on-LAN pela internet você terá que configurar o roteador para direcionar as portas 7 e 9 UDP para o endereço de broadcast, permitir isso no firewall pois geralmente é bloqueado, e ter configurado DNS ou ip-fixo... É meio enjoado mas dá certo...

Agora a intenção do artigo foi só mostrar como funciona, pois para uso rotineiro é mais fácil usar as ferramentas prontas como o ether-wake por exemplo...
abraços

[7] Comentário enviado por rhind em 13/10/2013 - 16:22h

Cara, eu ligo minha máquina a primeira vez tranquilamente.

Em seguida desligo com um shutdown -h now, ai quando vou ligar novamente não funciona mais.

Ai se eu tiro o cabo da fonte, conecto e mando o pacote magico ela liga.

Alguém sabe porque isso está acontecendo?


Contribuir com comentário