我们需要从Internet唤醒内部局域网上的一些计算机。
我们有一个封闭的路由器,几乎没有配置它的方法。
我想使用netfilter(iptables)来执行此操作,因为它不涉及守护程序或类似程序,但是其他解决方案也可以。
我的想法:
- 外部计算机向公共IP地址发出WOL(局域网唤醒)数据包(内部带有正确的MAC)
- 在路由器上打开了正确的端口(例如1234),将数据重定向到Linux机器
- Linux盒将UDP单播数据包转换为广播数据包(内容完全相同,只有目标地址被修改为255.255.255.255或192.168.0.255)
- 多播数据包到达每个NIC,所需的计算机现在处于唤醒状态
为此,一个非常简单的netfilter规则是:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
las netfilter似乎忽略了广播的转换。192.168.0.255和255.255.255.255没有任何内容。还使用192.168.0.0和0.0.0.0进行了测试,
我使用tcpdump查看发生了什么:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
仅此而已。我应该有第二行像:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102
如果我重定向到非多播地址,则一切正常。我有2条预期线。但是显然,这对WOL不起作用。
有没有办法告诉netfilter发出广播数据包?
我考虑的其他方法:
- 使用iptables匹配所需的数据包,将其记录下来,并使用守护程序监视日志文件并触发广播数据包
- 使用iptables将所需的数据包重定向到本地守护程序,该守护程序将触发广播数据包(更简单)
- 使用socat(如何?)