Necesitamos activar algunas computadoras en nuestra LAN interna, desde Internet.
Tenemos un enrutador algo cerrado, con muy pocas formas de configurarlo.
Me gustaría usar netfilter (iptables) para hacer esto porque no involucra un demonio o similar, pero otras soluciones están bien.
Lo que tengo en mente:
- la computadora externa emite un paquete WOL (Wake-On-LAN) a la dirección IP pública (con el MAC correcto dentro)
- el puerto correcto está abierto en el enrutador (digamos 1234), redirigiendo los datos a una caja de Linux
- el cuadro de Linux transforma el paquete de unidifusión UDP en un paquete de difusión (exactamente el mismo contenido, solo la dirección de destino se modifica a 255.255.255.255 o 192.168.0.255)
- el paquete de multidifusión llega a cada NIC y la computadora deseada ahora está activa
Para eso, una regla muy simple de netfilter es:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Alas netfilter parece ignorar la transformación para transmitir. 192.168.0.255 y 255.255.255.255 no dan nada. También probé con 192.168.0.0 y 0.0.0.0
. Usé tcpdump para ver qué sucede:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
y nada más. Debería tener una segunda línea como:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
Si redirijo a una dirección que no es de multidifusión, todo está bien. Tengo las 2 líneas esperadas. Pero obviamente esto no funciona para WOL.
¿Hay alguna manera de decirle a netfilter que emita paquetes de difusión?
Otros métodos en los que pienso:
- use iptables para hacer coincidir los paquetes deseados, regístrelos y use un demonio para monitorear el archivo de registro y disparar el paquete de difusión
- use iptables para redirigir los paquetes deseados a un demonio local, que dispara el paquete de difusión (más simple)
- usar socat (¿cómo?)