Nous devons réveiller certains ordinateurs de notre réseau local, à partir d'Internet.
Nous avons un routeur quelque peu fermé, avec très peu de façons de le configurer.
J'aimerais utiliser netfilter (iptables) pour ce faire car il n'implique pas de démon ou similaire, mais d'autres solutions sont correctes.
Ce que j'ai en tête:
- l'ordinateur externe émet un paquet WOL (Wake-On-LAN) à l'adresse IP publique (avec le bon MAC à l'intérieur)
- le port correct est ouvert sur le routeur (par exemple 1234), redirigeant les données vers une boîte Linux
- la boîte Linux transforme le paquet de monodiffusion UDP en paquet de diffusion (exactement le même contenu, seule l'adresse de destination est modifiée en 255.255.255.255 ou 192.168.0.255)
- le paquet de multidiffusion vient à chaque NIC, et l'ordinateur souhaité est maintenant réveillé
Pour cela, une règle de netfilter très simple est:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Hélas, Netfilter semble ignorer la transformation en diffusion. 192.168.0.255 et 255.255.255.255 ne donne rien. Également testé avec 192.168.0.0 et 0.0.0.0,
j'ai utilisé tcpdump pour voir ce qui se passe:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
et rien d'autre. Je devrais avoir une deuxième ligne comme:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
Si je redirige vers une adresse non multicast, tout va bien. J'ai les 2 lignes attendues. Mais évidemment, cela ne fonctionne pas pour WOL.
Existe-t-il un moyen de dire à netfilter d'émettre des paquets de diffusion?
D'autres méthodes auxquelles je pense:
- utilisez iptables pour faire correspondre les paquets souhaités, enregistrez-les et utilisez un démon pour surveiller le fichier journal et déclencher le paquet de diffusion
- utilisez iptables pour rediriger les paquets souhaités vers un démon local, qui déclenche le paquet de diffusion (plus simple)
- utiliser socat (comment?)