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?)
la source
Réponses:
socat
est un utilitaire tueur. Mettez quelque part dans vos scripts d'initialisation:Certains utilisateurs ont des problèmes avec UDP-LISTEN, donc utiliser UDP-RECV semble mieux (avertissement: pourrait envoyer les paquets de diffusion dans une boucle sans fin):
fork
permettent de garder socat à l'écoute des prochains paquets.T1
limiter la durée de vie des sous-processus fourchus à 1 seconde.255.255.255.255
est plus général que 192.168.0.255. Vous permettant de simplement copier-coller sans penser à votre structure réseau actuelle. Mise en garde: cela envoie probablement les paquets diffusés à toutes les interfaces.Comme vous, j'ai remarqué que WOL fonctionne avec n'importe quel port. Je me demande si c'est fiable. Beaucoup de documents ne parlent que des ports 0, 7 et 9.
Cela permet d'utiliser un port non pivotant, afin que vous puissiez exécuter
socat
avec l'utilisateurnobody
.Merci
lgeorget
Hauke Laging
etGregory MOUSSAT
d'avoir participé à cette réponse.N'hésitez pas à ajouter des détails.
la source
Le trafic de diffusion est par définition destiné à la machine locale. Cela signifie que le paquet est DNAT à 192.168.0.255, puis le noyau voit le paquet et décide qu'il est destiné au routeur lui-même, vous verrez donc ce paquet dans la chaîne INPUT. Le routeur (et tout autre périphérique) pensera que les paquets 192.168.0.255 sont destinés à lui-même et ne les transmettra plus. Les paquets de diffusion ne sont pas acheminés / transmis par conception.
Il existe une excellente solution de contournement avec l'astuce ARP mentionnée. Vous "perdrez" une adresse IP. Je vais utiliser factice
192.168.0.254
dans cet exemple - n'oubliez pas de ne jamais attribuer192.168.0.254
à aucun appareil de votre réseau:Créez une entrée ARP statique sur l'interface LAN pour l'adresse IP que vous n'utiliserez jamais pour aucune machine:
DNAT votre WDP Wake-On-Lan UDP sur l'interface WAN à cette adresse IP factice:
Cela fonctionne parfaitement pour les paquets WOL. Cette solution de contournement fonctionne également sur les produits basés sur le noyau Linux, comme les périphériques Mikrotik et les périphériques openwrt. J'utilise cette astuce sur les appareils Mikrotik pour réveiller ma machine à distance avec mon téléphone portable.
la source
J'ai trouvé cette question sur Serverfault .
Je n'ai pas réussi à obtenir un tel trafic de diffusion via mon routeur. Les paquets DNATted ne sont même pas arrivés à ma chaîne FORWARD. Il y a peut-être une étrange option de noyau qui interdit cela.
Mais l'idée ARP est intéressante. Je suppose que cela devrait être accompagné d'une règle dans OUTPUT qui interdit les paquets à cette adresse afin qu'elle ne puisse être atteinte qu'avec du trafic transféré.
la source
Socat OpenWRT
Socat a déjà été indiqué comme réponse, mais la réponse indiquée n'a pas fonctionné pour moi sur ma plate-forme, OpenWRT, avec une adresse WAN dynamique.
Mon objectif est de transmettre des paquets de réveil sur réseau local monodiffusion depuis le port UDP 9 de l'interface WAN vers un sous-réseau diffusé sur 192.168.20.255.
Les cassés (iptables)
Moi aussi, j'ai essayé avec iptables, mais chaque fois que j'ajoute une règle qui se termine par 255, la règle est transformée en bouillie avec l'adresse de destination 0.0.0.0 lorsque j'imprime avec:
Je crois qu'iptables n'est pas capable de multiplexer le trafic, comme requis dans une conversion monodiffusion à diffusion.
Le mauvais (fausses entrées d'arp)
La simulation d'entrées d'arp n'est pas si mauvaise, car les paquets atteignent tout le monde sur le segment Ethernet, mais cela présente les inconvénients suivants
Remarque: Cela peut être fait avec la
arp
commande ou laip neigh
commande.Le bon
socat, comme indiqué par la réponse précédente, est un dur à cuire. Cependant, dans la réponse précédente de Socat, j'ai rencontré quelques problèmes.
J'ai pu me lier à 0.0.0.0 (toutes les adresses) et éviter la tempête de diffusion en ajoutant une règle iptables pour empêcher la diffusion entrante de rebondir dans socat du côté LAN. Cette règle, en plus d'une règle iptables pour accepter le trafic sur le port UDP 9, et d'une règle iptables pour le journaliser, nous obtenons les trois règles suivantes en plus de la commande socat.
Pour les OpenWRTers, coller cela
/etc/firewall.user
et émettre/etc/init.d/firewall restart
est suffisant.Félicitations, WoL devrait maintenant fonctionner pour votre réseau depuis n'importe où sur le Web.
la source
En fait, netfilter ne peut faire aucune diffusion, le mécanisme de routage le fait.
Mais il supprime toute diffusion retransmise par défaut.
Il est devenu possible de transmettre une diffusion UDP dirigée dans un noyau Linux récent (vers la version 5.0)
Vous devez modifier le
bc_forwarding
paramètre de diffusion de l'interface réseau:(Remarque: il semble que l'option net.ipv4.conf. All .bc_forwarding ne fonctionne pas)
Alors maintenant, le noyau sur 5.0 + iptables devrait vous suffire
la source