Исправления
-
Перезапуск интерфейса в NDMS больше не выключает туннель насовсем — NDMS сам опускает и поднимает интерфейс (например, когда его ping-check не досчитался ответов; такой перезапуск настраиваем ему мы же), и делает это теми же событиями, какими сопровождается ручное отключение в веб-интерфейсе роутера. Мы принимали такое событие за намерение пользователя: туннель останавливался, статические и клиентские маршруты снимались, а в настройках он помечался выключенным. Обратно его не поднимало ничто — периодической сверки, возвращающей туннели к заданному состоянию, в демоне нет, а единственный автоматический путь наверх, событие «интерфейс снова включён», из опущенного нами же интерфейса прийти уже не мог. Туннель лежал до тех пор, пока владелец не включал его руками.
Теперь событие о выключении выдерживается несколько секунд, и перед остановкой мы спрашиваем NDMS напрямую, что с интерфейсом сейчас: включён — значит это перезапуск, и туннель не трогаем. Прямой вопрос спасает и тогда, когда событие «снова включён» до нас не дошло или пришло позже. А если оно приходит ровно в момент нашей остановки, оно больше не теряется: дожидается её конца и поднимает туннель обратно.
-
Галочка debug в журнале WDTT больше не ломает запуск сервера — переключатель достался журналу WDTT от FreeTurn, но
wdtt-serverфлага-debugне понимает: разбор аргументов сразу завершал процесс с ошибкой, и сервер не поднимался, покаdebugне убрать изwdtt.jsonруками. Подробного лога у бинаря нет вовсе, поэтому переключатель убран. -
Удалённый сервер больше не заставляет роутер писать ошибку в журнал каждые полминуты — тумблер захвата входящего трафика на карточке WireGuard-сервера сохраняет ссылку на этот интерфейс в настройках маршрутизации sing-box, а удаление сервера её не снимало. Каждая сверка маршрутизации, а она идёт раз в тридцать секунд, пыталась превратить ссылку в имя интерфейса ядра и спрашивала о нём NDMS — роутер отвечал в журнал
unable to find WireguardN in "Network::Interface::Base". Убрать ссылку из веб-интерфейса было нельзя: тумблер исчез вместе с карточкой сервера. Теперь ссылка снимается вместе с сервером, а оставшиеся от прошлых удалений — при старте демона. -
Роутеры на MIPS больше не уходят в цикл перезагрузок в kernel-режиме — на всех моделях с процессорами MediaTek MT7621/MT7628 и EcoNet EN75xx первая же настройка AWG-туннеля роняла ядро. Модуль AmneziaWG 3.0 не инициализировал блокировку header protection, а на MIPS ядро собрано с реализацией read-write-семафоров, для которой неинициализированная блокировка означает разыменование нулевого указателя. На aarch64 та же самая нулевая структура читается как свободная блокировка, поэтому на моделях с MT7622/MT7981/MT7988 дефект не проявлялся и не был виден при проверке на стенде. Роутер перезагружался, при следующем старте настройка повторялась — и так по кругу.
-
Настройка исчезнувшего интерфейса больше не роняет ядро — модуль обращался к блокировке внутри кода ошибки, не проверив его, поэтому
awg setconfилиawg setпо удалённому интерфейсу (или по интерфейсу чужого типа, каким NDMS пересоздаётOpkgTunпосле перезагрузки) вызывал панику. Сюда же приводил мониторинг туннелей: при потере связности он переприменял endpoint, не убедившись, что интерфейс ещё жив. Теперь ядро возвращает ошибку, а мониторинг не трогает интерфейс, который не удалось положить. -
Junk-пакеты с
JminбольшеJmaxбольше не портят память ядра — размер случайного пакета выбирался из диапазона, границы которого никто не сверял, и при перевёрнутом диапазоне он мог превысить выделенный буфер до 65535 байт. Ядро падало позже и в другом месте, что делало причину неочевидной.
Модули пересобраны из тега v3.0.20260731-04 с этими тремя исправлениями; в самом теге они отсутствуют. Обновлённый модуль загружается после перезагрузки роутера — до неё ядро продолжает работать со старым.