Wake-on-LAN через VPN перестал работать? Исправьте запись ARP
Магические пакеты проходят через туннель, но маршрутизатор отбрасывает их после истечения записи ARP. Сравните три пути доставки и навсегда закрепите MAC-адрес.
Отправьте пакет пробуждения сразу после выключения, и компьютер вернётся; та же команда на следующее утро ничего не делает. В конфигурации VPN ничего не изменилось, и проброс порта по-прежнему указывает на правильный адрес. Разница во времени: таблица соседей маршрутизатора забыла спящую машину, поэтому у неё нет MAC-адреса, который можно вписать в кадр. Именно это истечение, а не туннель, объясняет большинство сбоев Wake-on-LAN через VPN.
Первое пробуждение работает, следующее нет
Маршрутизатор передаёт кадр на частный адрес, отыскивая назначение в своей таблице соседей. Пока машина работает, она отвечает на ARP, поэтому сопоставление остаётся свежим. Как только она выключается, никто не отвечает, запись устаревает через несколько минут, и последующие кадры на этот адрес отбрасываются, хотя IP и проброс порта остаются действительными.
Схема подсказывает, какой у вас сбой. Пробуждение, которое не работает никогда, указывает на доставку: неверный порт, неверное назначение или межсетевой экран, отбрасывающий пакет до того, как он попадёт в LAN. Пробуждение, которое срабатывает один раз, а затем часами не работает, указывает на запись соседа. Пробуждение, которое работает до смены аренды DHCP, указывает на адресацию, и это исправляет резервирование.
Убедитесь, что адрес стабилен, прежде чем трогать ARP. Если спящая машина получит новый адрес после истечения аренды, закреплённая запись соседа для старого адреса будет одновременно постоянной и бесполезной. Сначала настройте резервирование DHCP, чтобы адрес пережил перезагрузки.
Что нужно магическому пакету от сети
Полезная нагрузка проста: 102 байта из шести байтов 0xFF, за которыми шестнадцать раз идёт целевой MAC-адрес, обычно отправляемые на порт UDP 9. В плоской LAN он выходит широковещательно, каждый порт его получает, а выключенная сетевая карта узнаёт собственный адрес.
Через VPN пакет приходит на маршрутизатор как одноадресная передача на частный адрес или как широковещательная передача, направленная в подсеть. В одноадресном случае маршрутизатор должен преобразовать назначение в MAC-адрес, прежде чем поместить кадр в LAN, и именно это преобразование не удаётся, пока хост спит.
Некоторые инструменты отправляют на порт 7 вместо 9, а некоторые устройства по умолчанию блокируют направленное широковещание. Это сбои доставки, а не ARP, поэтому проверьте назначение и порт, прежде чем менять таблицу соседей.
Три пути к спящему хосту
Есть три практических способа доставить кадр в LAN, и правильный выбор зависит от того, что вы контролируете.
| Method | What it needs | Where it breaks |
|---|---|---|
| Subnet-directed broadcast | A wake tool that accepts a broadcast address and a router that forwards it | Broadcast filtering, or a tool that only takes a MAC |
| Helper on the LAN | An always-on host such as the VPN server | No suitable host, or the host cannot reach the target VLAN |
| Permanent neighbour entry | Router shell access and the target MAC | NIC replacement or address change |
Выберите вспомогательный хост, если он есть, потому что он широковещательно передаёт в звене и не требует исключения на маршрутизаторе. Выберите направленное широковещание, если маршрутизатор уже разрешает его, а инструмент пробуждения принимает адрес. Выберите статическую запись, если ни то, ни другое недоступно и вы можете выполнить команду на маршрутизаторе.
Эти варианты не исключают друг друга. Постоянная запись также позволяет одноадресному пути пережить сон, что полезно, когда клиент VPN может отправлять только на определённый адрес.
Сделайте запись соседа постоянной
На маршрутизаторе с оболочкой Linux одна команда закрепляет сопоставление. Значения здесь относятся к примеру LAN и должны быть заменены вашими:
ip neigh replace 192.168.50.23 lladdr 3c:7c:3f:12:9a:4e dev br0 nud permanent
ip neigh show dev br0 | grep 192.168.50.23Состояние nud permanent удерживает запись сквозь тайм-ауты ARP и используется для пересылки, пока машина выключена. Вторая команда доказывает, что запись существует, и показывает интерфейс, к которому она относится, что важно на маршрутизаторах с отдельным гостевым мостом или VLAN.
Сделайте её устойчивой к перезагрузке через любой хук, который предлагает прошивка: скрипт в /jffs/scripts на Asuswrt-Merlin, модуль systemd oneshot на сервере Linux в роли шлюза, Neighbor= stanza в systemd-networkd или запись в /etc/ethers, которую читают локальные инструменты. Команда, набранная в оболочке, исчезает при следующей перезагрузке, и это самая частая причина, по которой работающее исправление как будто перестаёт работать.
Проверьте снаружи и знайте, когда удалять
Усыпите машину и подождите не меньше десяти минут, этого достаточно, чтобы любая динамическая запись устарела. Затем отправьте запрос пробуждения с клиента VPN и наблюдайте за обеими сторонами маршрутизатора:
tcpdump -ni tun0 udp port 9
tcpdump -ni br0 ether proto 0x0806 or udp port 9Первая запись доказывает, что пакет пришёл из туннеля; вторая, что маршрутизатор поместил кадр в LAN. Корректный магический пакет выглядит как 102 байта с повторённым MAC, поэтому проверяйте и длину, и назначение. Если кадр покидает мост LAN, а машина остаётся выключенной, оставшаяся проблема в устройстве: быстрый запуск, глубокий сон или настройка BIOS, отключающая питание сетевой карты.
Удаляйте запись при смене сетевой карты и обновляйте её, когда переносите машину на другой адрес. Постоянное сопоставление это намеренное исключение, а исключение, о котором никто не помнит, это путь, по которому будущий ноутбук начинает получать кадры, предназначенные списанному настольному компьютеру.