C'est la que le wake on lan intervient (tadam ! :grin: ).

Le wake on lan va permettre de réveillé ce PC (qui dort traquillement). Cette méthode est implémenté dans toute les carte réseau.

Le principe, une machine A envoie à une machine B un "paquet magique". Ce paquet, si on analyse sa trame, est la suivante.

paquet-wol.jpg

C'est un paquet de type "echo", c'est comme un paquet ICMP. Il se décompose en plusieurs couche, nous allons en voir quelques une (selon le modèle TCP/IP).

La couche 1-2 (accès réseau) contient les adresse MAC destination et source. L'adresse MAC est sur 48 bits et codé en hexadécimal. Ici, la destination est FF:FF:FF:FF:FF:FF, ça signifie que tout les pc du réseau vont recevoir ce paquet.

La couche 3 (internet )contient l'IP source et destination. La destination de ce paquet est 192.168.1.255, ce qui correspond à une adresse de broadcast. Tous les ordinateur du réseau vont recevoir ce paquet.

La couche 4 (transport), c'est le protocole UDP, aucune connexion établi et non fiable. Si le paquet se perd en cours de route, tanpis, il est perdu (c'est balo :patch: )En général, un paquet "wake on lan" est sur le port 7 ou 9.

Et enfin, la couche 7 (application) contient le message. echo suivi de FF FF FF FF FF FF et de 16 fois l'adresse MAC du PC à réveillé. Sur l'exemple, l'adresse MAC du PC est 00 D0 59 10 D5 35. Donc, on obtient FF FF FF FF FF FF 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 00 D0 59 10 D5 35 . Voila le message recu par la carte réseau de la machine B.

La carte réseau du PC B reçoit ce message, le traite, et s'allume ! Magique :D

La théorie c'est beau, et maintenant, comment l'implémenter ? :blink:

En général, cette fonction est activé, mais si elle ne l'est pas, il faut aller dans le bios de la carte mère. Référez vous a votre manuel. La fonction se situe dans le menu gestion de l'énergie.

Plusieurs méthode s'offre a nous, on peut utiliser un logiciel, passer par le routeur ou bien via un script PHP sur le net. Je vais montré via le routeur et le web.

Via un routeur

Certains routeur possède des fonctionnalité avancé comme avec le WRT54GS de Linksys. Je lui ai collé un firmware (micrologiciel) modifié : DD-WRT.

interface-wol-dd-wrt.png

Via l'interface de gestion, il suffit d'ajouter des hôtes. Il suffit d'insérer l'adresse MAC du PC sont nom et son brodcast. Pour trouver ces informations, il suffit d'ouvrir une console. Sous windows la touche Windows+R (ou Démarrer->Executer) et cmd . Ensuite, taper ipconfig //all.

cmd-mac.png

Il y a tout ce qu'il faut, sauf le brodcast. En général, les IP utilisé en réseau personnel sont de type 192.168.x1.x2 . x1 étant fixé une fois pour tout le réseau, x2 varie suivant le PC. Dans l'exemple x1 vaut 1, soit 192.168.1.x2. Etant donné que le paquet magique est en brodcast, l'adresse de brodcast est 192.168.1.255.

Une fois que tout est en place, il suffit d'appuyer sur le bouton réveiller, et le paquet est généré et envoyé par le routeur. Il ne faut pas oublier que le routeur est comme un PC, on peut donc le remplacer par un PC, serveur ou autre machine capable de générer ce paquet.

Si tout ce passe bien, le pc devrait se réveiller. Sur ce routeur, il y a un daemon, un service qui permet de réveiller à une heure fixe le pc, pour justement permettre la mise en place d'un système de sauvegarde automatisé.

Avec un script PHP

Sinon, on peut utiliser un script PHP. Evidement, il faut bien héberger ce script sur un serveur. En local, ou à distance.

Ici, nous allons construire le paquet (c'est la que la théorie est parfois bien utile ^_^ ).

On a une belle fonction WakeOnLan, elle a déja été créé, mais on va la modifier un peu.

On possède plusieurs élément, l'adresse IP de destination, c'est l'adresse IP de notre connexion internet, et l'adresse MAC. L'adresse MAC au format XX:XX:XX:XX:XX:XX. Il faut supprimer les ":". Cette étape peut être facultative si l'on décide d'avoir en entrée une adresse qui ne contient pas les ":".

  1. $add_byte = explode(':', $mac);

Construisons le paquet magique. D'après la trame du paquet, le message est une succession de 6 FF et de 16 fois l'adresse MAC. Il faut convertir chaque partie de l'adresse MAC en ASCII.

  1. //Génération de la première partie du message
  2. $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
  3.  
  4. //Génération de l'adresse MAC
  5. for($i=0; $i<=6; $i++){
  6. $hw_addr .= chr(hexdec($addr_byte[$i]));
  7. }
  8.  
  9. //Génération du message
  10. for ($i = 1; $i <= 16; $i++){
  11. $msg .= $hw_addr;
  12. }

Une fois le paquet généré, il faut l'envoyé. Pour cela, il faut ouvrir une connexion.

  1. $connexion = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

D'après la doc php, ouverture d'un socket :

  • AF_INT : Protocole IPv4
  • SOCK_DGRAM : Le type de socket, datagramme
  • SOL_UDP : en UDP.

Si l'a connexion est établi, $connexion vaut true sinon false.

  1. if ($connexion == false) {
  2. echo "Erreur de création de la connexion!\n";
  3. echo "Code erreur : '".socket_last_error($connexion)."' - " . socket_strerror(socket_last_error($connexion));
  4. return false;
  5. }

On à l'affiche du code erreur en cas d'échec ainsi qu'une explication.

Il faut ensuite faire passer des paramètres.

  1. $option = socket_set_option($connexion, 1, 6, TRUE);

Il y a plusieurs options à faire passer pour configurer cette connexion. Tout d'abord la variable de connexion (socket). Le second paramètre (qui vaut 1), c'est le protocole utilisé. L'UDP correspond à 1. On peut le retrouver grâce à la fonction getprotobyname('udp'). Troisième option, 6, ça je sais pas... :huh: . Et enfin, 4ème option, true (idem, no idea). $option vaut true en cas de succes, sinon false.

  1. if($option == false) {
  2. echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
  3. return false;
  4. }

Enfin ! On arrive au bout, paquet généré, connexion établi et configurer, il ne reste plus qu'a envoyé le tout.

  1. socket_sendto($connexion, $msg, strlen($msg), 0, $toAddress, $portNumber);

Pour envoyé le paquet, il nous faut bien sur la connexion qui est contenu dans $connexion, le message $msg, la taille du message strlen($msg) en octet, l'adresse de destination $toAddress et le numéro de port (en général 7 ou 9) $portNumber.

Voila, le script a été décortiqué. Et nous pouvons le résumé.

  1. <?
  2. # Wake on LAN - (c) HotKey@spr.at, upgraded by Murzik
  3. # Modified by Allan Barizo http://www.hackernotcracker.com
  4. function WakeOnLan($addr, $mac,$socket_number) {
  5.  
  6. $addr_byte = explode(':', $mac);
  7.  
  8. $hw_addr = '';
  9.  
  10. for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
  11.  
  12. $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
  13.  
  14. for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
  15.  
  16. $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
  17.  
  18. if ($s == false) {
  19. echo "Error creating socket!\n";
  20. echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
  21. return FALSE;
  22. } else {
  23. $opt_ret = socket_set_option($s, 1, 6, TRUE);
  24.  
  25. if($opt_ret <0) {
  26. echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
  27. return FALSE;
  28. }
  29.  
  30. if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number)) {
  31. echo "Magic Packet sent successfully!";
  32. return TRUE;
  33. } else {
  34. echo "Magic packet failed!";
  35. return FALSE;
  36. }
  37. }
  38. }
  39.  
  40. $socket_number = "7";
  41. $mac_addy = "00:12:4G:SF:12:13";
  42. $ip_addy = gethostbyname("myhomeserver.dynamicdns.org");
  43.  
  44. WakeOnLan($ip_addy, $mac_addy,$socket_number)
  45. ?>

Voila, une présentation du wake on lan. Avec lui, il est possible de faire moulte chose :mdr: Et le prochain article portera sur le contrôle à distance de pc, que l'on vient tout juste de réveiller.

Signature