Precisamos ativar alguns computadores em nossa LAN interna, a partir da Internet.
Temos um roteador um tanto fechado, com muito poucas maneiras de configurá-lo.
Eu gostaria de usar o netfilter (iptables) para fazer isso porque não envolve um daemon ou similar, mas outras soluções estão bem.
O que tenho em mente:
- o computador externo emite um pacote WOL (Wake-On-LAN) para o endereço IP público (com o MAC correto dentro)
- a porta correta está aberta no roteador (por exemplo, 1234), redirecionando os dados para uma caixa Linux
- a caixa Linux transforma o pacote unicast UDP em um pacote de broadcast (exatamente o mesmo conteúdo, apenas o endereço de destino é modificado para 255.255.255.255 ou 192.168.0.255)
- o pacote multicast chega a todas as placas de rede e o computador desejado agora está ativado
Para isso, uma regra muito simples de netfilter é:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Infelizmente, o netfilter parece ignorar a transformação para transmitir. 192.168.0.255 e 255.255.255.255 não oferecem nada. Também testado com 192.168.0.0 e 0.0.0.0
, usei o tcpdump para ver o que acontece:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
e nada mais. Eu deveria ter uma segunda linha como:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
Se eu redirecionar para um endereço não multicast, está tudo bem. Eu tenho as 2 linhas esperadas. Mas, obviamente, isso não funciona para o WOL.
Existe uma maneira de dizer ao netfilter para emitir pacotes de transmissão?
Outros métodos que eu penso:
- use iptables para corresponder aos pacotes desejados, registre-os e use um daemon para monitorar o arquivo de log e disparar o pacote de transmissão
- use iptables para redirecionar os pacotes desejados para um daemon local, que aciona o pacote de transmissão (mais simples)
- use socat (como?)