У меня есть компьютер за маршрутизатором с динамическим IP-адресом, который я хочу настроить для пробуждения по локальной сети.
Как отправить волшебный пакет на ПК? Могу ли я настроить маршрутизатор на пересылку UDP-порта 6 на ПК? Как мне отправить пакет с другого ПК в сети? Как насчет ПК вне сети?
Это вообще возможно?
Обновить: вот соответствующий экран конфигурации моего маршрутизатора. Есть надежда?
Похоже, некоторые чтение на WOL наверное в порядке в первую очередь. Возможно, также будет уместно немного почитать об Ethernet, ARP и UDP / IP.
Поведение WOL в клиенте запускается «волшебным пакетом». Волшебный пакет может быть инкапсулирован в любой тип транспорта (UDP через IP, IPX и т. Д.). Последовательность байтов волшебного пакета просто должна быть в полезной нагрузке пакета, который будет получать активизированный сетевой адаптер.
Отправлять запросы WOL по локальной сети очень просто. Получите утилиту для создания волшебных пакетов (например, Mc-Wol для Windows) и стреляйте.
Отправка запросов WOL из Интернета более проблематична. Вы на правильном пути с перенаправлением порта UDP из Интернета в локальную сеть, но есть и другие проблемы.
У вас есть проблема с одноадресными запросами WOL из Интернета, а именно: MAC-адрес вашего клиентского компьютера WOL не будет в таблице ARP маршрутизатора, потому что, поскольку клиент WOL выключен, такая запись ARP устарела. . Когда ваш маршрутизатор получает IP-пакет, переадресованный портом на IP-адрес клиента WOL, в то время как клиент WOL выключен, а его MAC-адрес устарел из таблицы ARP, маршрутизатор не сможет доставить пакет клиенту. Для этой работы вам понадобится маршрутизатор со статической поддержкой ARP.
Маршрут трансляции еще менее вероятен. Поскольку у вас, скорее всего, нет общедоступной подсети за маршрутизатором, а вы используете NAT для совместного использования одного общедоступного IP-адреса в вашей локальной сети, нет возможности удаленно адресовать пакет на широковещательный адрес подсети вашей подсети локальной сети, чтобы маршрутизатор (если бы он мог пересылать направленные широковещательные сообщения) генерировал бы широковещательную передачу уровня 2 с пакетом WOL, чтобы позволить клиенту WOL "видеть" его.
WOL в вашей локальной сети будет легко. WOL в Интернете не так-то просто.
Статический ARP совершенно не нужен
Вы правильно поняли первую часть. Чтобы получить пакет WOL в сети, перенаправьте пакет, приходящий с определенного порта, на широковещательный адрес локальной сети (255.255.255.255) или любой другой диапазон подсети, в котором вы хотите разрешить доступ к WOL.
MAC-адрес пункта назначения пакета должен быть установлен на широковещательную передачу по сети Ethernet или FF: FF: FF: FF: FF: FF. Тип Ethernet пакета должен быть 0x0842 (Wake On Lan).
Итак, куда же девается MAC-адрес просыпаемого компьютера?
В самом волшебном пакете. Пакеты WOL действительно предназначались для отправки по локальной сети. Они слепы к любому протоколу выше канального уровня. Чтобы обойти это ограничение, они осуществляют широковещательную рассылку (широковещательная передача по сети Ethernet, а не широковещательная передача IP) на все компьютеры в сети, и каждый компьютер считывает волшебный пакет, чтобы узнать, вызваны ли они.
Содержимое волшебного пакета содержит 16 копий MAC-адреса компьютера, который просыпается.
Структура кадра следующая:
DA -> SA -> Type -> Magic Packet
Куда:
DA = FF:FF:FF:FF:FF:FF
SA = [whatever the source MAC is]
Type = 0x0842
Magic = [The actual destination MAC repeated 16x]
Если вы хотите проверить, что приходящие пакеты имеют правильный формат, используйте следующий фильтр в Wireshark:
ether dst FF:FF:FF:FF:FF:FF and ether proto 0x0842
По сути, приложение WOL должно быть способно создавать пакет, который подделывает адрес назначения Ethernet. В Интернете есть инструменты, которые могут это сделать, но я с ними не знаком.
Примечание. Я так много знаю об этом потому, что я являюсь автором парсера WOL для SharpPcap (оболочка pcap на C #). Если есть достаточный спрос, я мог бы расширить свое консольное приложение, включив в него отправку пакетов (в настоящее время оно только прослушивает) и сделать его доступным как проект OSS.
Обновление: @Evan Anderson сделал хорошее замечание, о котором я забыл упомянуть. Широковещательная рассылка входящих пакетов по локальной сети - это вообще плохая идея. Это решение будет работать, но это всего лишь хитрость, позволяющая обойти ограничения протокола Wake On Lan.
Описанный мною метод будет работать на любом компьютере в локальной сети, как был разработан WOL, но потенциально может открыть вашу сеть для использования в качестве усилителя атаки (Smurf / Fraggle / Papasmurf), если кто-то отправит специально созданный пакет. в порт WOL.
Подход Эвана Андерсона технически более безопасен, но ограничен одноадресной передачей.
Вместо того, чтобы повторять, почему у вас могут возникнуть проблемы, я просто опишу, как я преодолел те проблемы, которые уже объяснил Эван.
Мой брандмауэр / маршрутизатор основан на Linux, что означает, что я могу запускать на нем команды. Чтобы разбудить машины в локальной сети, я сначала подключаюсь к брандмауэру по SSH, а затем запускаю Perl-сценарий, который создает волшебный пакет и отправляет его в локальную сеть. MAC-адрес цели может быть передан как параметр командной строки или жестко закодирован, в зависимости от ситуации.
Конечно, если вы не можете выполнять команды на своем маршрутизаторе, вам нужно будет найти альтернативное средство.
Как уже писали Эван и Джон, WoL через Интернет вряд ли будет работать.
Вам нужно какое-то устройство внутри брандмауэра, которое может отправлять пакеты от вашего имени. Мы используем веб-приложение, размещенное в нашей интрасети. Похоже, это не вариант, поэтому на ум приходят только три других варианта:
Недавно я обнаружил, что порт перенаправляет порт UDP на x.x.x.255
работал на одном роутере, а на другом нет.
Я добавил статическую запись ARP на роутере через telnet arp add x.x.x.y FF:FF:FF:FF:FF:FF
за неиспользуемый внутренний IP x.x.x.y
к FF:FF:FF:FF:FF:FF
(широковещательный MAC), как указано Вот а порт перенаправил UDP-порт WOL на этот неиспользуемый IP-адрес, который у меня работает для WOL из Интернета.
Это то, что я сделал на своем raspberry pi, который я использую для сервера openvpn
iptables -A PREROUTING -p udp --dport 9 -d x.x.x.255 -j DNAT --to-destination x.x.x.255
Некоторые маршрутизаторы (cisco) могут пересылать направленные широковещательные сообщения UDP.
Ядро Linux, начиная с версии 5.0, может это делать. Вам просто нужно указать параметр для конкретного сетевого интерфейса:
sudo sysctl -w net.ipv4.conf.eth1.bc_forwarding=1
(Примечание: похоже, что опция net.ipv4.conf.все.bc_forwarding не работает)
И вам нужно сделать DNAT с iptables на маршрутизаторе, если ваш компьютер находится за NAT.