Cómo encender el PC de forma remota

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:

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 adecuadoSimplemente 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:

    1. Tratar de introducir una entrada estática en la tabla ARP del router en cuestión
    2. 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.

Fuente: vicente_navarro

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: