Нам нужно разбудить некоторые компьютеры во внутренней локальной сети из Интернета.
У нас есть несколько закрытый маршрутизатор, и у него очень мало способов его настройки.
Я хотел бы использовать 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 (как?)
источник
Ответы:
socat
утилита-убийца Поместите где-нибудь в свои сценарии инициализации:У некоторых пользователей возникают проблемы с UDP-LISTEN, поэтому использование UDP-RECV выглядит лучше (предупреждение: может отправлять широковещательные пакеты в бесконечном цикле):
fork
Позволяет вести сокат прослушивание следующих пакетов.T1
ограничить срок службы разветвленных подпроцессов до 1 секунды.255.255.255.255
является более общим, чем 192.168.0.255. Позволяет вам просто копировать и вставлять, не думая о вашей текущей структуре сети. Предупреждение: это, вероятно, отправляет широковещательные пакеты на каждый интерфейс.Как и вы, я заметил, что WOL работает с любым портом. Интересно, это надежно? Во многих документах говорится только о портах 0, 7 и 9.
Это позволяет использовать порт без pivilegied, поэтому вы можете работать
socat
с пользователемnobody
.Спасибо
lgeorget
Hauke Laging
иGregory MOUSSAT
приняли участие в этом ответе.Не стесняйтесь добавлять детали.
источник
Широковещательный трафик по определению предназначен для локальной машины. Это означает, что пакет получает DNAT до 192.168.0.255, а затем ядро видит пакет и решает, что он предназначен для самого маршрутизатора, поэтому вы увидите этот пакет в цепочке INPUT. Маршрутизатор (и любое другое устройство) будет считать, что 192.168.0.255 пакетов предназначено для него, и не будет пересылать их дальше. Широковещательные пакеты не маршрутизируются / не пересылаются по проекту.
Существует отличный обходной путь с упомянутым трюком ARP. Вы «потеряете» один IP-адрес.
192.168.0.254
В этом примере я буду использовать пустышку - не забывайте никогда не назначать192.168.0.254
никакие устройства в вашей сети:Создайте статическую запись ARP на интерфейсе локальной сети для IP-адреса, который вы никогда не будете использовать для любой машины:
DNAT вашего UDP-трафика Wake-On-Lan по интерфейсу WAN по этому фиктивному IP-адресу:
Это прекрасно работает для пакетов WOL. Этот обходной путь также работает с продуктами, основанными на ядре Linux, такими как устройства Mikrotik и устройства openwrt. Я использую этот трюк на устройствах Mikrotik, чтобы дистанционно разбудить мою машину с помощью моего мобильного телефона.
источник
Я нашел этот вопрос на Serverfault .
Мне не удалось получить такой широковещательный трафик через мой маршрутизатор. Пакеты с DNAT даже не попали в мою цепочку FORWARD. Может быть, есть какая-то странная опция ядра, которая запрещает это.
Но идея ARP интересна. Я предполагаю, что это должно сопровождаться правилом в OUTPUT, которое запрещает пакеты по этому адресу, чтобы он мог быть достигнут только с переадресованным трафиком.
источник
Сокат OpenWRT
Сокат уже был заявлен как ответ, однако указанный ответ не работал для меня на моей платформе OpenWRT с динамическим адресом WAN.
Моя цель - пересылать одноадресные UDP-пакеты пробуждения по локальной сети от UDP-порта 9 интерфейса WAN в широковещательную рассылку подсети 192.168.20.255.
Сломанный (iptables)
Я тоже пытался с iptables, но каждый раз, когда я добавляю правило, заканчивающееся на 255, правило превращается в кашу с адресом назначения 0.0.0.0, когда я печатаю с:
Я полагаю, что iptables не способен мультиплексировать трафик, как требуется для преобразования одноадресной и широковещательной передачи.
Плохое (фальшивые записи арп)
Подделка записей arp не так уж плоха, потому что пакеты попадают ко всем в сегменте Ethernet, но имеет следующие недостатки
Примечание. Это можно сделать с помощью
arp
команды илиip neigh
команды.Хорошо
Сокат, как указано в предыдущем ответе, задира. В предыдущем ответе на сокат я столкнулся с несколькими проблемами.
Я смог привязаться к 0.0.0.0 (все адреса) и избежать широковещательного шторма, добавив правило iptables, чтобы блокировать возврат входящей трансляции обратно в socat со стороны локальной сети. Это правило, в дополнение к правилу iptables для приема трафика через UDP-порт 9 и правилу iptables для его регистрации, мы получаем три следующих правила в дополнение к команде socat.
Для OpenWRTers достаточно вставить это в
/etc/firewall.user
и выпускать/etc/init.d/firewall restart
.Поздравляем, теперь вы должны иметь WoL, работающий на вашу сеть из любой точки сети.
источник
На самом деле netfilter не может выполнять трансляцию, механизм маршрутизации делает это.
Но он отбрасывает любую переадресованную трансляцию по умолчанию.
Стало возможным переадресовывать направленную UDP-трансляцию в недавнем ядре Linux (около версии 5.0)
Вам необходимо изменить
bc_forwarding
параметр для сетевого интерфейса вещания:(Примечание: это кажется вариант net.ipv4.conf. Все .bc_forwarding не работает)
Так что теперь вам должно хватить ядра около 5.0+ iptables
источник