github hoaxisr/awg-manager v2.16.5

2 hours ago

Исправления

  • Перезапуск интерфейса в 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 с этими тремя исправлениями; в самом теге они отсутствуют. Обновлённый модуль загружается после перезагрузки роутера — до неё ядро продолжает работать со старым.

Don't miss a new awg-manager release

NewReleases is sending notifications on new releases.