Cette page relate, à la première personne, les investigations de Pouetpouete pour :
Mon but initial était de réveiller mon serveur à distance par une commande Wake On LAN (WOL).
Cette commande revient à broadcaster (envoyer sur le réseau sans destination précise, ou plutôt à destination de tout le monde) le “paquet magique” contenant la trame suivante :
FF FF FF FF FF FF + 16 fois l'adresse MAC du PC à allumer, le tout sur le port 9.
Premier problème, mon routeur ne supporte de faire passer ce message depuis l'internet vers le réseau local.
Mon idée a donc été de faire envoyer cette commande par une machine déjà allumée dans le réseau local : mon NAS !
Il s'agit d'un Stora de chez Netgear. A l'intérieur, il y a deux disques durs en RAID 1 (miroir) et un espace de 220Mo avec une RedHat.
Première chose à savoir, il faut se connecter en ssh avec une commande bizarre, contenant le numéro de série du Stora (les XXXX) :
ssh utilisateur_hipserv2_netgear_XXXX-XXXX-XXXX-XXXX@ip_du_stora
Puis passer en root :
sudo su -
Il se plaint que la Connection est refused, mais c'est bon quand-même.
Editer le fichier de configuration du serveur web apache :
vi /etc/httpd/conf/httpd.conf
Vers la ligne 1020, ajouter :
<VirtualHost *:9999>
DocumentRoot /var/www/wol
<Directory "/var/www/wol">
DirectoryIndex index.php
</Directory>
</VirtualHost>
J'ai choisi le port 9999 en lien avec le port 9 du WOL.
Aplication de la configuration du serveur :
/etc/init.d/httpd reload
Nous allons donc éditer un fichier index.php dans le répertoire /var/www/wol
vi /var/www/wol/index.php
Et voici son contenu :
<?php
class Wol{
private $nic;
public function wake($mac){
$this->nic = fsockopen("udp://192.168.0.2", 9); //mettre ici l'ip du serveur
if( !$this->nic ){
fclose($this->nic);
echo "erreur fsockopen <br/>";
return false;
}else{
f_write($this->nic, $this->pacquet($mac));
fclose($this->nic);
return true;
}
}
private function pacquet($Mac){
$packet = "";
for($i = 0; $i < 6; $i++){
$packet = $packet.ch_r(0xFF);
}
for($j = 0; $j < 16; $j++){
for($i = 0; $i < 12; $i=$i + 2){$packet .= ch_r(hexdec(substr($Mac, $i, 2)));}
}
return $packet;
}
}
$wol = new Wol();
$wol->wake('000000000000'); //mettre ici l'adresse mac du serveur
echo "Wake On Lan envoyé.";
?>
/!\ les fonctions f_write() et ch_r() n'ont pas de underscore ; ils sont là pour éviter un bug de dokuwiki.
Vous pouvez vous rendre sur la page ip_du_stora:9999 qui enverra pour vous le paquet magique.
Mais il sera bloqué par netfilter.
Ajouter cette règle :
iptables -I INPUT -p udp --dport 9 -j ACCEPT
Et ça marche !