LinuxParty
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:
- Tratar de introducir una entrada estática en la tabla ARP del router en cuestión
- 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.
-
Internet
- La muerte lenta del hipervínculo
- Cómo cambiar dirección IP (modo gráfico), por qué querría hacerlo y cuándo no debería hacerlo
- 10 comandos "IP" útiles para configurar interfaces de red
- Cómo configurar conexiones IP de red usando 'nmcli' en Linux
- Configuración de una IP Estática en una Tarjeta de Red en Linux.
- ¿Migrar a la nube? Marque esta lista de verificación
- Nuevo estándar de Internet L4S: el plan silencioso para hacer que Internet se sienta más rápido
- Nextcloud y Roundcube se Fusionan para Impulsar la Descentralización en la Productividad en la Nube
- Los 10 mejores servidores proxy inversos de código abierto para Linux
- Una guía para principiantes para crear conexiones (Bonding) y puentes de red (Bridging) en Linux
- Conectar dos redes Locales alejadas creando de un Puente Transparente
- Crear un puente de red transparente "bridge" para conectar dos redes locales remotas
- Crear un Puente de Red o Bridge
- La propuesta de la ICANN / Verisign permitiría a cualquier gobierno confiscar nombres de dominio
- Listado errores HTTP, estados de respuesta del servidor