Está en la página 1de 10

Wake on LAN

Hoy en día hay mucha gente que tiene en casa un ordenador conectado a Internet casi siempre
encendido y al que se puede acceder desde cualquier lugar, normalmente por SSH en sistemas
UNIX (aunque también hay servidores SSH para sistemas Windows, son menos frecuentes,
porque las posibilidades que tenemos en la shell de Windows son muy limitadas) y por VNC o
RDP en Windows. En muchos casos, es bastante normal que además de ese ordenador
siempre encendido se tenga algún otro que sólo se enciende cuando se está en casa.
Pero hay veces que, estando lejos, nos puede interesar encender ese otro ordenador de forma
remota porque necesitamos un fichero que tenemos en él o necesitamos hacer algo en él. Para
esas situaciones, lo mejor es tener el Wake on LAN (WoL) preparado en esa máquina y las
utilidades necesarias para activarlo en la máquina que no solemos apagar.
El WoL es posible en los PCs actuales gracias a las fuentes de alimentación ATX que, cuando
el ordenador está apagado, siguen alimentando a ciertas partes de la placa base permitiendo
asimismo el Wake on Ring y la posibilidad de arancar el PC sólo pulsando una tecla del teclado
o que se encienda a una determinada hora.

Requisitos Hardware
Para que una tarjeta de red pueda hacer un WoL, es necesario que la tarjeta bien soporte el
estándar PCI 2.2, bien sea unida con un cable a un conector específico de la placa base:

En las placas base más modernas, con uno o más interfaces de red ya integrados en la propia
placa, no necesitamos hacer nada a nivel de hardware para que el WoL funcione.

Configurar la BIOS
Por tanto, el primer paso tras verificar que el hardware es apto, es configurar la BIOS para que
permita que dispositivos PCI despierten al ordenador. Las opciones tienen el siguiente aspecto
en las BIOS, y tenemos que permitir el Power On by PCI Devices o el Power On by PCI Cards:

Configurar la tarjeta de red en el sistema operativo


A continuación, es necesario decirle a la tarjeta de red que cuando apaguemos el ordenador,
ella se ha de quedar en espera de una señal de WoL. Esto lo hacemos a través del driver, tanto
en Windows como en Linux.
En Windows, accedemos al panel de propiedades del interfaz de red en cuestión:
En él le damos al botón de Configurar la tarjeta y nos aparece un nuevo diálogo con los
parámetros de la tarjeta que el driver nos deja cambiar. Estos parámetros son diferentes y
tienen distinto nombre según el fabricante, pero no nos es difícil localizar al encargado del WoL:
En Linux, para hacer esto mismo, la herramienta más indicada es el ethtool. Este comando nos
permite mostrar o cambiar parámetros de la mayoría de los drivers de las tarjetas Ethernet
incluidos en kernels >=2.4.
# ethtool eth1
Settings for eth1:
Supported ports: [ MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 9
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: d
Link detected: yes
Para cambiar los parámetros de WoL, tenemos varias opciones que podemos consultar en el
man ethtool, en función de bajo qué circunstancias queremos que el PC despierte:
wol p|u|m|b|a|g|s|d...
Set Wake-on-LAN options. Not all devices support this. The argument to this
option is a string of characters specifying which options to enable.
p Wake on phy activity
u Wake on unicast messages
m Wake on multicast messages
b Wake on broadcast messages
a Wake on ARP
g Wake on MagicPacket(tm)
s Enable SecureOn(tm) password for MagicPacket(tm)
d Disable (wake on nothing). This option clears all previous options.
Lo mejor para asegurarnos de que el PC sólo se despertará cuando nosotros queramos y no
por otro tipo de tráfico que podría aparecer en la red, es elegir que despierte con un
MagicPacket, que es una trama ethernet que comienza con FF FF FF FF FF FF y sigue con 16
repeticiones de la dirección MAC. Si la MAC fuera 01:02:03:04:05:06, el paquete mágico
contendría en el campo de datos:
FFFFFFFFFFFF010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506010203040506010203040506010203040506
010203040506010203040506
Por tanto, activamos el WoL para MagicPacket:
# ethtool -s eth1 wol g

# ethtool eth1
Settings for eth1:
Supported ports: [ MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: MII
PHYAD: 9
Transceiver: external
Auto-negotiation: on
Supports Wake-on: g
Wake-on: g
Link detected: yes
Antes de apagar el PC para probar el WoL, es necesario anotar la dirección MAC para poder
usarla en el sistema donde vamos a lanzar la petición. Para ello, desde la línea de comandos,
en Windows podemos ejecutar ipconfig /all, comando que, entre otras cosas, nos mostrará para
todos los interfaces la Physical Address. En Linux podemos ejecutar ifconfig ethX, que
también nos mostrará, entre otras cosas, la HWaddr para el interfaz elegido.
Es importante tener en cuenta que si la tarjeta no se queda configurada para el WoL, no
funcionará. Esto puede ocurrir en la mayoría de los casos en los que apaguemos el PC de
forma incorrecta (por botonazo).

En envío del paquete mágico


Finalmente, tras dejar el PC correctamente apagado, para despertarlo desde otro PC
necesitaremos alguna utilidad que mande el paquete mágico. El paquete se puede encapsular
en otros protocolos, como UDP/IP, lo que permite mayor interoperabilidad entre sistemas
operativos y la posibilidad de enviarlo sin ser root, ya que la mayoría de sistemas no permiten
enviar paquetes raw a usuarios normales. Esto podría permitir también que el paquete
atravesara redes y routers, pero es más sencillo hacerlo funcionar si ambos PCs están en la
misma red ethernet.
El wol – Wake On LAN client es un programa que funciona bien tanto en Linux como en
Windows. Para ambas plataformas es un programa para la línea de comandos. La versión de
Windows ha sido compilada usando Cygwin, por lo que necesita archivos adicionales como el
cygwin1.dll, pero ya vienen incluidos.
En la Wikipedia, Wake-on-LAN programs, Windows aparece una buena lista de programas que
mandan el paquete mágico desde el entorno gráfico. Quizás uno de los más conocidos sea el
Magic Packet Sender (necesita el .NET Framework de Microsoft).
En Debian tenemos dos utilidades ya empaquetadas a tiro de apt-get, el wakeonlan y el
etherwake:
# etherwake -u
usage: ether-wake [-i <ifname>] [-p aa:bb:cc:dd[:ee:ff]] 00:11:22:33:44:55

This program generates and transmits a Wake-On-LAN (WOL)


"Magic Packet", used for restarting machines that have been
soft-powered-down (ACPI D3-warm state).
It currently generates the standard AMD Magic Packet format, with
an optional password appended.

The single required parameter is the Ethernet MAC (station) address


of the machine to wake or a host ID with known NSS 'ethers' entry.
The MAC address may be found with the 'arp' program while the target
machine is awake.

Options:
-b Send wake-up packet to the broadcast address.
-D Increase the debug level.
-i ifname Use interface IFNAME instead of the default 'eth0'.
-p <pw> Append the four or six byte password PW to the packet.
A password is only required for a few adapter types.
The password may be specified in ethernet hex format
or dotted decimal (Internet address)
-p 00:22:44:66:88:aa
-p 192.168.1.1
# wakeonlan
Usage
wakeonlan [-h] [-v] [-i IP_address] [-p port] [-f file] [[hardware_address] ...]

Options
-h
this information
-v
displays the script version
-i ip_address
set the destination IP address
default: 255.255.255.255 (the limited broadcast address)
-p port
set the destination port
default: 9 (the discard port)
-f file
uses file as a source of hardware addresses

See also
wakeonlan(1)
Si ejecutamos por ejemplo etherwake 00:11:d8:c4:59:5e sin más opciones mientras en el PC
que debería estar apagado ejecutamos un tcpdump vemos el paquete llega en forma de
paquete ethernet raw:
12:17:01.636887 00:50:63:b5:0c:32 (oui Unknown) > 00:11:d8:c4:59:5e (oui Unknown),
ethertype Unknown (0x0842), length 116:
0x0000: ffff ffff ffff 0011 d8c4 595e 0011 d8c4 ..........Y^....
0x0010: 595e 0011 d8c4 595e 0011 d8c4 595e 0011 Y^....Y^....Y^..
0x0020: d8c4 595e 0011 d8c4 595e 0011 d8c4 595e ..Y^....Y^....Y^
0x0030: 0011 d8c4 595e 0011 d8c4 595e 0011 d8c4 ....Y^....Y^....
0x0040: 595e 0011 d8c4 595e 0011 d8c4 595e 0011 Y^....Y^....Y^..
0x0050: d8c4
Sin embargo, con el wakeonlan, lo que vemos es un paquete UDP al puerto de discard (9)
# wakeonlan 00:11:D8:C4:59:5E
Sending magic packet to 255.255.255.255:9 with 00:11:D8:C4:59:5E

12:19:33.017278 IP hostorigen.2482 > 255.255.255.255.discard: UDP, length 102


El etherwake es un programa en C de apenas 392 líneas cuyo estudio nos puede dar
información interesante sobre el tema: ether-wake.c (v1.09)

Para finalizar
Resumen de los que necesitamos para que el WoL funcione:
● Que el hardware lo permita
● Configurar la BIOS
● Configurar el interfaz de red para que acepte las peticiones de WoL
● Dejar el PC correctamete apagado
● Enviar la petición desde otro sistema
Curiosidades relacionadas:
● Niko y Matthieu se han hecho un circuitillo conectado al conector del WoL para
despertar el ordenador cuando ellos quieran.
● Cuando apagamos el PC los ventiladores se apagan de golpe, pero los componentes
siguen calientes. Como esto no es sano, hay dispositivos que usando el conector WoL
alimentan durante un rato más los ventiladores hasta que se enfrien.
● Documentos y programas para programar el temporizador de arranque de la BIOS:
MythTV ACPI Wakeup, NVRAM WakeUp para Linux, CMOSTimer para Windows.

Actualización 7/6/07: Sobre el WoL a través de routers domésticos. Ejemplo con


un Zyxel 660HW.
Con routers profesionales el tema de dejar pasar el paquete del WoL se puede solucionar de
diversas maneras, ya que tenemos muchas posibilidades de configuración y nos podemos ver
en muchos escenarios distintos.
Con los routers caseros, en los que normalmente el router tendrá la IP pública de Internet y
dentro tendremos una red privada, típicamente del tipo 192.168.X.X hacia la que el router hará
NAT, si queremos mandar el paquete WoL encapsulado en UDP hacia una de las máquinas
internas, tenemos dos problemas:
● Que el router mande el paquete al equipo adecuado
● Simplemente un tema de mapeo de puertos UDP a IPs internas, algo que todos los
routers domésticos soportan.
● Que el router sepa mandar el paquete estando el equipo que ha de recibirlo
apagado.
● El problema es que si el router, tras el mapeo de puertos, decide que ha de mandarle el
paquete a la IP 192.168.1.22 por ejemplo, lo primero que hace es una petición ARP
para averiguar la dirección MAC del sistema al que ha de mandar el paquete. Como el
sistema está apagado, no puede responder a la petición y, por tanto, el router no envía
el paquete por la red. Para salvar este obstáculo tenemos dos posibilidades:
a. Tratar de introducir una entrada estática en la tabla ARP del router en cuestión
b. Tratar de conseguir que el router mande un paquete broadcast por la red.
Si a modo de ejemplo nos centramos en el Zyxel Prestige 660HW-61, accediendo al interfaz de
línea de comandos (telnet al router, seleccionar 24, seleccionar 8), podemos poner:
Router> ip arp add 192.168.1.22 ether 00:11:D8:C4:59:5E

Router> ip arp status


received 4111 badtype 0 bogus addr 0 reqst in 3925 replies 28 reqst out 81
cache hit 11968503 (98%), cache miss 237220 (1%)
IP-addr Type Time Addr stat iface
192.168.1.22 10 Mb Ethernet 0 00:11:d8:c4:59:5e 43 NULL
192.168.1.24 10 Mb Ethernet 300 00:32:64:a1:ea:28 41 enif0
192.168.1.255 10 Mb Ethernet 0 ff:ff:ff:ff:ff:ff 43 NULL
y a continuación, tenemos que configurar en la tabla de mapeos NAT del router el puerto que
queremos usar para el paquete UDP del WoL:

Ahora con un simple wakeonlan desde una máquina de Internet externa a la red
despertaríamos a la máquina en cuestión. El tener configurada en el router la resolución
dinámica de la IP pública que el ISP le ha dado al router (con DynDNS o con cualquier otro
proveedor de este tipo de servicios) nos ayuda muchísimo para no necesitar saber siempre
dicha IP pública en el caso de que sea dinámica:
# wakeonlan -i pruebawol.dyndns.org -p 6789 00:11:D8:C4:59:5E
Sending magic packet to pruebawol.dyndns.org:6789 with 00:11:D8:C4:59:5E
Si quisiéramos ahorrarnos la molestia de alterar la tabla de ARP del router manualmente, en
este router en concreto funciona el poner una IP de broadcast en la tabla de mapeo de NAT:

Tras esto, el mismo comando wakeonlan de antes despertaría la máquina sin necesidad de
ningún cambio en el interfaz de línea de comandos del router.
Para finalizar la actualización, comentar que cuando estaba buscando qué comando usar para
alterar la tabla ARP del router, he encontrado este excelente tutorial en ADSLZone: WAKE ON
LAN/WAN (Encender remotamente un ordenador) (tienen más tutoriales sobre el 660HW), que
además de aportar muchos detalles muy interesantes comenta cómo modificar el autoexec.net
para que la entrada de la tabla ARP permanezca incluso después de reiniciar el router. En
cualquier caso, creo que la opción de la IP de broadcast es mucho más sencilla, aunque mucho
menos instructiva también.

También podría gustarte