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, що відключає живлення мережевої карти.
Видаляйте запис, коли змінюється мережева карта, і оновлюйте його, коли переносите машину на іншу адресу. Постійне зіставлення це навмисний виняток, а виняток, про який ніхто не пам'ятає, це шлях, яким майбутній ноутбук починає отримувати кадри, призначені списаному настільному комп'ютеру.