Нам нужно разбудить некоторые компьютеры во внутренней локальной сети из Интернета.
У нас есть несколько закрытый маршрутизатор, и у него очень мало способов его настройки.
Я хотел бы использовать netfilter (iptables), чтобы сделать это, потому что он не включает демон или подобное, но другие решения в порядке.
Что я имею в виду:
- внешний компьютер выдает пакет WOL (Wake-On-LAN) на общедоступный IP-адрес (с правильным MAC-адресом внутри)
- правильный порт открыт на маршрутизаторе (скажем, 1234), перенаправляя данные в окно Linux
- коробка Linux преобразует одноадресный пакет UDP в широковещательный пакет (точно такой же контент, только адрес назначения изменяется на 255.255.255.255 или 192.168.0.255)
- пакет многоадресной рассылки поступает на каждый сетевой адаптер, и нужный компьютер теперь не спит
Для этого очень простое правило сетевого фильтра:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255
Увы, 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 (как?)