Le Wake-on-LAN (WOL) ou mise en marche du PC depuis le réseau est une technologie développée par AMD et IBM, permettant à un ordinateur mis en veille d'être démarré à distance par l'envoi d'un "magic-packet" sur la carte réseau supportant le Wake-on-LAN.
Plus techniquement, le réveil est déclenché quand la carte Ethernet de l'ordinateur reçoit un "magic packet" qui est une trame de données Ethernet contenant les octets FF FF FF FF FF FF suivis de seize répétitions de l'adresse MAC de la cible, puis d'un mot de passe (si nécessaire) de quatre ou six octets
Cet article vous explique comment configurer votre machine Ubuntu à réveiller1) et comment installer l'application wakeonlan pour démarrer un ordinateur distant (toutes plate-formes) depuis votre distribution Ubuntu.
Pour la suite des opérations, des pré-requis sont nécessaires :
Le WOL doit être activé pour la carte réseau. Ce n'est pas toujours le cas pour des raisons évidentes de sécurité, puisque n'importe qui pourrait démarrer un ordinateur en connaissant uniquement l'adresse mac. L'activation s'effectue dans le BIOS de l'ordinateur à démarrer.
Sous Ubuntu, pour voir si votre carte réseau supporte le WOL, installer le paquet ethtool et exécuter la commande:
sudo ethtool eth0 | egrep "^[[:blank:]]*Wake-on: (g|d)"
Vous devez obtenir la ligne suivante:
Wake-on: g
Si vous obtenez la ligne
Wake-on: d
c'est que votre carte réseau n'est pas activée pour le WOL. Pour l'activer taper la commande :
sudo ethtool -s eth0 wol g
Avec certaines versions d'Ubuntu et/ou certains matériels, lors de l'extinction, le système désactive les interfaces réseaux.
Après essais, si le WOL ne fonctionne pas, pour supprimer cette sécurité2), un des moyens est d'écrire la ligne de commande suivante dans le fichier /etc/rc.local :
/sbin/ethtool -s eth0 wol g
A mettre avant la ligne :
exit 0
Ainsi à chaque démarrage, la ligne de commande est exécutée, activant la carte réseau pour le prochain démarrage.
Un autre moyens est d'écrire les lignes de commande suivante dans le fichier /etc/network/interfaces :
auto lo iface lo inet loopback up ethtool -s eth0 wol g
Un autre moyen est d'écrire les lignes de commande suivante dans un fichier /etc/network/if-up.d/wol_fix :
#!/bin/sh /sbin/ethtool -s [votre-carte] wol g
puis rendre executable
sudo chmod +x /etc/network/if-up.d/wol_fix
Note : le script ne sera exécuté que si le paquet ifupdown est installé.
L'adresse MAC de la carte réseau est un identifiant unique attaché à chaque matériel réseau. Pour réveiller l'ordinateur vous devez connaître l'adresse MAC de sa carte réseau où nous enverrons le paquet magique.
Si vous avez un accès au pc (distant ou local), la commande3)
ifconfig eth0
vous indiquera l'adresse MAC. Elle est précédée du champ HWaddr dans la première ligne.
Pour notre exemple, l'adresse MAC est 00:15:60:B1:DB:D4 :
eth0 Lien encap:Ethernet HWaddr 00:15:60:B1:DB:D4 inet adr:192.168.1.xx Bcast:192.168.1.255 Masque:255.255.255.0 adr inet6: fe80::215:60ff:feb1:2316/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Packets reçus:4722 erreurs:0 :0 overruns:0 frame:0 TX packets:2971 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 Octets reçus:918022 (896.5 KiB) Octets transmis:329459 (321.7 KiB) Interruption:169
Si vous n'avez pas d'accès à la machine, essayez la commande suivante qui devrait vous renvoyer une liste d'adresses mac associées aux adresses ip sur le réseau :
arp -a
Si vous avez une carte réseau intégrée dans une carte mère à chipset NVidia4) (par exemple : ASUS M2NPV-VM ou M2N-SLIdeluxe) et que l'envoi de paquet magique ne produit aucun effet, avant de casser tous les scripts de votre machine, essayez simplement d'envoyer l'adresse MAC à l'envers, exemple 00:1a:9f:81:ce:a4 ⇒ a4:ce:81:9f:1a:00.
Les modifications à faire sont extrêmement simples pour faire marcher le WOL (peut-être que ces commandes fonctionnent encore avec les nouvelles versions d'Ubuntu) :
Si vous avez une carte mère Asus, et que votre ordinateur redémarre à chaque fois que vous l'éteignez, installer le paquet laptop-mode-tools peut résoudre votre problème5).
Pour cela, il nous faut installer un logiciel capable de construire la trame de donnée. Les dépôts Ubuntu contiennent deux logiciels :
Contrairement à wakeonlan, le paquet etherwake ne permet pas de démarrer un pc en passant par internet. Nous installerons donc wakeonlan disponible dans le dépôt universe.
Il existe une interface graphique nommée GWakeOnLan permettant de gérer une liste de machine à réveiller.
Installez le paquet gwakeonlan. Autrement vous pouvez installer une des solution suivante à la place : - C501 Wake On Lan ; - Scription d'activation et installation de WOL.
Après avoir installé le paquet wakeonlan vous pouvez réveiller une machine avec la commande (adaptez avec votre adresse MAC)
wakeonlan 00:15:60:B1:DB:D4
Si cela ne fonctionne pas alors que cela fonctionne avec etherwake, essayez de renseigner l'adresse de Broadcast de votre réseau grâce à l'option -i. Le calculateur d'adresse IP d'isiweb.org pourrait vous aider à déterminer la bonne adresse (dans cet exemple : 192.168.0.255) :
wakeonlan -i 192.168.0.255 00:0D:9D:9B:BA:xx
Pour réveiller une machine en passant par internet, exécutez la commande suivante dans un terminal, en remplaçant l'adresse IP par votre IP publique, visible sur hostip.fr et l'adresse MAC par celle du poste à démarrer :
wakeonlan -i 78.yyy.xxx.zzz 00:0D:9D:9B:BA:xx
Pour démarrer plusieurs stations sur le lan, exécutez la commande suivante dans un terminal en séparant les adresses mac par des espaces :
wakeonlan 00:0D:9D:9B:BA:xx 00:0D:9D:9B:yy 00:0D:9D:9B:zz
Pour démarrer une station derrière un pare-feu, pensez à paramétrer dans votre routeur un transfert du port que vous utiliserez dans la ligne de commande grâce à l'option -p (9 par défaut)
Si tout s'est bien passé, la machine distante devrait être en train de démarrer. Si vous avez besoin de plus d'information sur la commande wakeonlan, consultez son manuel avec la commande
man wakeonlan
Il peut être intéressant pour tester son installation de se faire envoyer un packet magique depuis internet,notamment si l'ordinateur que l'on souhaite réveiller est derrière un routeur.
sudo tcpdump -i eth0 port 9
eth0 étant le nom de votre interface réseau. Il faut que tcpdump soit installé.
Vous pouvez ainsi réveiller votre ordinateur à l'aide de n'importe quel autre ordinateur possédant seulement un navigateur. Ceci peut être pratique quand on n'a pas tous les droits sur un réseau et que l'on souhaite réveiller son ordinateur chez soi pour accéder à ses ressources. Cela évite aussi de se souvenir de ses adresses MAC et IP.
Il vous suffit de modifier la fin du code en l'adaptant à votre installation. Changez le port, l'adresse MAC en mettant celle de votre carte réseau et l'adresse IP ou le nom de domaine de l'ordinateur à réveiller.
<?php # Wake on LAN - (c) HotKey@spr.at, upgraded by Murzik # Modified by Allan Barizo http://www.hackernotcracker.com flush(); function WakeOnLan($addr, $mac,$socket_number) { $addr_byte = explode(':', $mac); $hw_addr = ''; for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a])); $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255); for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr; // send it to the broadcast address using UDP // SQL_BROADCAST option isn't help!! $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); if ($s == false) { echo "Error creating socket!\n"; echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s)); return FALSE; } else { // setting a broadcast option to socket: $opt_ret = socket_set_option($s, 1, 6, TRUE); if($opt_ret <0) { echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n"; return FALSE; } if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number)) { echo "Magic Packet sent successfully!"; socket_close($s); return TRUE; } else { echo "Magic packet failed!"; return FALSE; } } } // Port number where the computer is listening. Usually, any number between 1-50000 will do. Normally people choose 7 or 9. $socket_number = "9"; // MAC Address of the listening computer's network device $mac_addy = "XX:XX:XX:XX:XX:XX"; // IP address of the listening computer. Input the domain name if you are using a hostname (like when under Dynamic DNS/IP) $ip_addy = gethostbyname("my.dns.domain.com"); WakeOnLan($ip_addy, $mac_addy,$socket_number); ?>
Selon votre besoin parfois il est utile d'utiliser la fonctionnalité du WOL sans le paquet magique. pour cela il y a différentes variables.
ethtool -s eth0 wol V
(En remplaçant V par une lettre ci-dessous)
p Réveil dès moindre activité physique u Réveil dès réception d'un message unicast m Réveil dès réception d'un message multicast b Réveil dès réception d'un message broadcast a Réveil dès réception d'un ARP g Réveil dès réception d'un MagicPacket(tm) s Réveil dès réception d'un message SecureOn(tm) (mot de passe) pour MagicPacket(tm) d Désactiver
On peut vouloir désactiver le WOL pour des raisons de sécurité ou plus généralement pour éviter de consommer de l'énergie sur un appareil mobile par exemple. Par défaut les systèmes récents l'activent. la commande powertop (paquet powertop) rappelle qu'il vaut mieux le désactiver pour réduire la consommation électrique de la carte réseau).
Il faut pour cela utiliser la même commande mais avec l'option d :
sudo ethtool -s eth0 wol d
Vous pouvez remplacer l'exemple précédent de conservation permanente en remplaçant le g par le d en fin de commande, comme ici.