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: 16.423 ]

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

i3 - Tilling Window Manager

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

ZFS no GNU/Linux

Leitura recomendada

Executando (entre outras funcionalidades) qualquer vídeo no Mozilla a partir do add-on Media Player Connectivity

Pequena solução para backup em redes mistas

Instalando Redmine 2.x no Debian Wheezy com Apache Passenger

Capturando vídeo através do mencoder

Instalando programas utilizando os fontes no seu Slackware com o checkinstall

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts