github hoaxisr/awg-manager v2.17.0

latest releases: v2.17.1, latest
5 hours ago

Новые возможности

  • Режим маршрутизации «Политики + tun» — третий способ завести трафик в sing-box, рядом с TPROXY-правилами и FakeIP. Роутер поднимает OpkgTun-интерфейс и регистрирует его в NDMS как обычный с глобальным приоритетом и маршрутом по умолчанию (ipv4/v6), после чего интерфейс становится доступен для выбора в политиках доступа Keenetic. Кого пускать через sing-box, решаются в политиках доступа на вкладке «Политики доступа» или веб-интерфейс роутера,а не правила netfilter: перехвата TPROXY в этом режиме нет вовсе, как нет и подмены адресов FakeIP-пулом. Внутри sing-box работают те же правила, outbound'ы и итоговое действие, что и в TProxy: переключение между двумя режимами не теряет ни одного правила маршрутизации. (Общие правила маршрутизации и наборы rulesets, общие правила DNS резолвинга, отличие только в секции ingress)

    Выбор устройств для которых будет работать этот режим осуществляется через добавление в политику доступа с созданным OpkgTun интерфейсом; kill-switch получается сам собой, т.к. устройство в политике, где разрешён только этот интерфейс, при остановленном sing-box остаётся без сети. Тумблер «Маршрутизация через sing-box» на карточках WireGuard- и WDTT-серверов работает и здесь: трафик их клиентов уходит в туннель отдельной таблицей маршрутизации, а их DNS-запросы перенаправляются на резолвер туннеля. Главный вопрос «включил, а трафика нет» разбирается без журнала: если интерфейс не разрешён ни в одной политике, карточка режима говорит об этом прямо и показывает, под каким именем интерфейс виден в политиках.

    Важно знать: доменные правила работают по подсмотренному имени (SNI/Host), поэтому трафик, где имя не видно, а именно ECH (Ecnrypted Client Hello), не-HTTP-протоколы, маршрутизируется по IP-адресу; ping (ICMP) клиентов через туннель не проходит и на слабых процессорах растёт нагрузка (стек userspace у singbox, в настоящее время единственными кандидатами для использования режима являются ARM роутеры не ниже 3811/3812 и их кинетикозаменители); перехват DNS работает по 53-му порту, поэтому клиент с собственным шифрованным DNS (DoH/DoT) резолвит мимо туннеля.

  • «Политики + tun»: интерфейс разрешается в политике сам, а его номер переживает выключение — раньше режим создавал OpkgTun<N>, но разрешить его выходом политики доступа приходилось руками, иначе трафик в туннель просто не заходил. Теперь разрешение ставится автоматически в выбранную политику и первым в списке выходов — туннель становится для её устройств выходом по умолчанию. Политика выбирается там же, в карточке режима; поле общее с режимом TPROXY. Замечание «интерфейс не разрешён» теперь смотрит именно на выбранную политику, а не на любую: разрешение, поставленное когда-то другой политике, больше не выдаётся за рабочую настройку.

    Выключение режима больше не удаляет интерфейс, а кладёт его и снимает адреса. Номер за режимом закрепляется, и следующее включение берёт тот же — а значит, разрешение в политике, привязанное к имени, не ломается. Интерфейс убирается там, где он действительно не нужен: при переключении на другой режим маршрутизации и при удалении пакета (вместе с маршрутом по умолчанию и возвратом исходного NAT сегментов).

    Чего продукт не делает: если номер всё-таки сменился (номер занял чужой интерфейс, пока запись была потеряна), старое разрешение остаётся в политике — снимать его автоматически мы не беремся, потому что под руку попало бы разрешение, выданное вручную и осознанно. Журнал в этом случае предупреждает, что номер сменился, и называет интерфейс, к которому запись относится. Неудачное включение при откате удаляет интерфейс, даже если он существовал до попытки, — разрешение в политике после такого стоит проверить.

  • QoS-классы работают и в режиме «Политики + tun» — sing-box не умеет разбирать DSCP-метку, поэтому классификация остаётся на netfilter, но набор правил урезан до необходимого: исключения (локальные сети, мультикаст, пользовательские bypass по адресам и портам) и правила по самой метке, без общего перехвата всего UDP и TCP и без blackhole-правила — fail-closed здесь обеспечивает политика. Пока активных классов нет, netfilter в этом режиме не трогается вообще.

  • «Сохранять адреса клиентов» — по умолчанию sing-box видит все устройства под одним адресом tun-шлюза (172.18.0.1): маскарад роутера срабатывает раньше, чем трафик доходит до нас, — отсюда ни статистики по клиентам, ни правил по адресу источника. Опция переводит выбранные сегменты локальной сети на static-NAT, при котором трансляция делается только на выходе в интернет, и адреса клиентов доезжают до sing-box настоящими. Перед включением показывается список сегментов с их текущим режимом NAT — сегменты на динамическом NAT предвыбраны, лишние можно снять.

    Исходный режим NAT каждого сегмента записывается и возвращается как был — при выключении опции, снятии режима и переключении на другой, — а не подменяется на «динамический» вслепую: сегмент, который держали на static-NAT или вовсе без NAT намеренно, останется таким же. Опция меняет NAT-режим сегмента, поэтому её стоит проверять вместе с пробросом портов и UPnP. Включение вступает в силу со следующего подъёма режима, выключение применяется сразу.

  • Обход по geoip в исключениях TPROXY — в исключениях перехвата можно отметить geoip-теги из подключённых гео-данных: подсети выбранных тегов уходят в WAN мимо sing-box прямо на уровне netfilter, не доходя до движка. Наполнение локальное — из тех же .dat-файлов, что использует маршрутизация, без запросов наружу и без ожидания резолва. Набор адресов (ipset AWGM-BYPASS) переживает и перестройку firewall роутером, и перезагрузку: он сохраняется на диск и восстанавливается тем же хуком, что возвращает наши цепочки. Рядом с выбором показан суммарный размер и предел набора — выбор больше предела не сохраняется.

    Обход полный, как у «Доп. подсетей»: под него попадает и DNS, поэтому клиент с DNS-сервером из выбранных диапазонов выпадает из DNS-перехвата вместе со всем, что от него зависит. Изменения действуют на новые соединения; уже установленные без пакета conntrack-tools доживут по прежнему пути до таймаута. Нужен пакет ipset — поставить его можно кнопкой рядом, как и conntrack-tools. В режиме «Политики + tun» раздела нет: правил перехвата там не ставится вовсе.

  • FreeTurn/WDTT: серверы поднимаются сами после перезагрузки — флаг «должен работать» теперь сохраняется и для серверов, а не только для клиентов: запуск сервера ставит его, ручная остановка снимает. На загрузке роутера все инстансы с этим флагом стартуют автоматически, там же, где и раньше стартовали клиенты — после готовности NDMS/WAN и DNS.

    Если сервер FreeTurn когда-то сохранялся с включённым флагом в старом конфиге, после обновления он поднимется на первой же загрузке. Чтобы этого не происходило, остановите его кнопкой — ручная остановка флаг снимает.

  • Watchdog для прокси-процессов — раз в 30 секунд проверяется, жив ли процесс каждого включённого клиента и сервера FreeTurn/WDTT; упавший поднимается заново. Остановленные пользователем инстансы не воскресают. Неудачные попытки старта разводятся по времени (30 с, минута, две… до 15 минут), поэтому сломанный конфиг или занятый порт не превращаются в бесконечный цикл перезапусков с NDMS-вызовами и потоком записей в журнал.

  • Перезапуск клиента без живого пира — если у запущенного клиента нет ни одной активной сессии несколько проверок подряд, он перезапускается: так лечится «висящий» клиент, потерявший связь с сервером. Ожидание после старта — 3 минуты у FreeTurn и 5 у WDTT (там дольше идёт VK-авторизация), ожидание капчи у FreeTurn перезапуск откладывает. Когда клиент вообще не сообщает статистику, состояние считается неизвестным и перезапуска не происходит — иначе под нож попадал бы исправно работающий туннель.

  • WDTT: режим Raw — клиент и сервер могут работать без WireGuard: трафик идёт напрямую через wt-client, AWG-туннель не создаётся и WG-порт на сервере не используется. Режим требует бинарей с его поддержкой (на стороне сервера — редеплой); со старыми бинарями запуск завершится ошибкой о неизвестном флаге, а сам режим по умолчанию — прежний, WG.

  • Кнопка «освободить порт» — рядом с listen-адресом инстанса показывается PID и имя процесса, занявшего порт, и его можно остановить, не заходя по SSH. Остановить разрешено только процесс на порту, который прописан в настройках инстанса FreeTurn/WDTT; чужие порты (RCI, DNS, SSH роутера) ручка отклоняет.

  • Синхронизация endpoint связанных AWG-туннелей — при смене listen-порта клиента Endpoint связанного туннеля обновляется автоматически. Порт клиента переназначается сам, когда прежний занят — после перезагрузки роутера это случается регулярно, — и раньше туннель оставался настроенным на старый порт: связка молча переставала работать до ручной правки. Теперь новый адрес доезжает и до работающего туннеля, и до карточки в интерфейсе, а не только до файла настроек. Сохранение настроек клиента сверяет endpoint так же, как это делал запуск.

  • WDTT: адреса для режимов WG и Raw хранятся раздельно — у режимов разные порты сервера, и раньше переключение затирало адрес соседнего: вернувшись обратно, приходилось вводить его заново. Теперь каждый режим помнит свой адрес, а в экспертном виде оба видны сразу. Если адрес для нужного режима ещё не вводили, поле остаётся пустым — вместо молчаливой попытки подключиться на порт другого режима.

  • Баннер-дисклеймер ограничений NDMS-маршрутизации — на вкладке «Маршрутизация → NDMS» перед списком правил теперь показывается баннер с шестью ограничениями встроенного DNS-движка NDMS: работа только в «Политике по умолчанию», обход через собственный DoH/DoT на устройстве или в браузере, гонка первого запроса с попаданием адреса в таблицу маршрутизации, совпадение по суффиксу домена, короткий TTL и стороннее ПО в Entware, перехватывающее DNS-запросы. Ссылки под списком ведут на две профильные темы форума Keenetic.

    Кнопка «Я прочитал — проверить себя» открывает мини-квиз из трёх вопросов с одним вариантом ответа; неверный ответ подсвечивается и объясняется, а вопрос остаётся открытым до правильного. После трёх верных ответов баннер схлопывается в строку «Ограничения NDMS-маршрутизации приняты» со ссылкой «Показать», которая разворачивает список обратно. Виден баннер только на OS5, где и существует сам движок NDMS-маршрутизации.

    Особенности: подтверждение хранится в localStorage браузера, а не на роутере — на другом устройстве или после очистки данных сайта баннер и квиз появятся снова. Прохождение квиза ничего не блокирует: правила DNS-маршрутизации создаются и без подтверждения, оно работает как памятка, а не как гейт.

Исправления

  • Правило «готовый набор + свои домены и подсети» снова работает — если к правилу из каталога (Discord, Telegram, Roblox, WhatsApp) дописать собственные подсети или домены, правило переставало ловить хоть что-нибудь: sing-box требует совпадения И по набору, И по вашему списку одновременно, а не по любому из них. Со стороны это выглядело как «правило исчезло»: инспектор маршрутов показывал «не подходит» и для домена из набора, и для адреса из вашей подсети, а трафик уходил напрямую. Помогало только убрать свои адреса из правила или завести их отдельным правилом без пресета.

    Теперь такое правило сохраняется в форме «набор или ваши адреса» — срабатывает любая из сторон, как и ожидается от одной строки с обоими списками. Правила, уже сохранённые в сломанном виде, чинятся сами при первом запуске обновлённого пакета; редактировать их вручную не нужно. Сужающие условия (порт, протокол, TCP/UDP, адрес источника) по-прежнему обязательны — они ограничивают правило целиком, а не одну его сторону.

    Затронуты были не все пресеты: правило ломалось с наборами, внутри которых больше одного условия. У остальных (YouTube, Netflix, OpenAI, X и прочих) сочетание с собственными адресами работало и раньше — sing-box сливает такой набор с правилом сам.

  • Инспектор маршрутов больше не объявляет рабочее правило нерабочим — он проверял все условия правила «через И», тогда как sing-box объединяет домены и подсети одного правила «через ИЛИ». Правило со списком доменов и списком подсетей сразу инспектор считал несовпавшим для любого запроса, хотя движок его исполнял. Заодно инспектор научился точным доменам (domain) — раньше правило с одним таким условием он считал пустым и молча пропускал — и логическим правилам, которые до сих пор не разбирал вовсе.

  • Инспектор учитывает ограничение по TCP/UDP — условие «Сеть (L4)» в правиле он не смотрел вовсе, поэтому правило «только UDP» отчитывалось совпадением и для TCP-проверки. Теперь выбранный в проверке протокол сверяется именно с этим условием. Условия, которых при ручной проверке взяться неоткуда — прикладной протокол (его определяет сниффер) и привязка ко входу, — больше не выдаются за совпадение и честно помечаются как непроверяемые: правило с ними показывается несовпавшим, а не «подходящим наугад».

  • Принудительное удаление набора больше не превращает правило в «пропустить всё через туннель» — если у правила удаляемый набор был единственным условием (обычное «пресет → туннель»), после удаления оно оставалось вообще без условий. Правило без условий sing-box считает подходящим для любого соединения, так что весь трафик роутера молча уходил в указанный туннель. Теперь такое правило удаляется вместе с последним своим условием — и в маршрутизации, и в DNS-правилах. Правила, не ссылавшиеся на удаляемый набор, не трогаются.

  • Редактор правила больше не теряет то, чего не показывает — правило пересобиралось из полей формы, поэтому сохранение выбрасывало всё, для чего в форме нет поля: точные домены, прикладной протокол, признак локальной сети, привязку ко входу. Достаточно было открыть импортированное правило и нажать «Сохранить», ничего не меняя. Теперь такие условия переносятся как есть.

  • Ручной редактор конфигурации предупреждает о правиле, которое не сработает — если в слоте эксперта записано правило с готовым набором и собственными адресами сразу, проверка и применение теперь возвращают замечание с номером правила. Сам текст слота не переписывается: он ваш, и правки в нём остаются вашими.

  • «Политики + tun»: DNS-запросы клиентов больше не уходят мимо туннеля — в этом режиме трафик заворачивает сама политика доступа роутера, то есть уже после того, как принято решение о маршрутизации, а DNS-запрос клиент адресует самому роутеру — до туннеля он не доходил вовсе. Со стороны это выглядело как «правила по доменам работают вполсилы»: имя резолвил обычный резолвер роутера, и в туннель уходил уже готовый адрес, о котором правило ничего не знает. Теперь запросы на 53-й порт от устройств политики перенаправляются на резолвер туннеля; то же включено и клиентам серверов, у которых поднят тумблер «Маршрутизация через sing-box».

    Перехват держится собственным хуком (52-awgm-policytun-dns.sh) и восстанавливается после того, как роутер перестраивает свой firewall. Хук намеренно работает без проверки «жив ли sing-box»: когда движка нет, у членов политики не работает и весь остальной трафик, поэтому чинить в одиночку один DNS незачем. Перехват идёт по 53-му порту — клиент с собственным шифрованным DNS (DoH/DoT) по-прежнему резолвит мимо.

  • «Маршрутизация через sing-box» у сервера теперь работает и в режиме FakeIP — переключатель на карточке WDTT- и WireGuard-сервера сохраняет интерфейс в списке захвата, но пользовался этим списком только режим tproxy: он помечает трафик интерфейса меткой политики. В FakeIP правил netfilter не ставится вовсе, поэтому переключатель не делал ничего. Со стороны это выглядело как «работает наполовину»: маршрутизация по IP-адресам у клиентов таких серверов шла — адреса из правил движка разложены статическими маршрутами в туннель для всего роутера, — а по доменам нет: DNS-запросы клиентов уходили мимо резолвера FakeIP, и домен превращался в настоящий адрес ещё до того, как правило могло сработать.

    Теперь в FakeIP переключатель делает то же, что и в tproxy. DNS-запросы клиентов перенаправляются на резолвер туннеля независимо от того, какой сервер прописан у них в конфигурации, включая адрес самого роутера. Остальной трафик уходит в туннель отдельной таблицей маршрутизации, и решение принимают правила движка, а не глобальные маршруты; обращения в локальную сеть роутера из заворота исключены, поэтому «Доступ в LAN» у сервера работает как прежде. Правила восстанавливаются сами после того, как роутер перестраивает свой firewall, и снимаются при выключении режима, смене состава серверов и удалении сервера.

    Цена включения описана прямо у переключателя: весь трафик клиентов идёт через sing-box, отчего растёт нагрузка на процессор, ping (ICMP) через туннель не проходит, а при остановленном sing-box клиенты остаются без сети. Перехват работает по 53-му порту — клиент с собственным шифрованным DNS (DoH/DoT) по-прежнему резолвит мимо; IPv6-трафик не заворачивается.

  • Правила «VPN для устройств» видны в окружении диагностики (#663) — на странице «О системе» строка «VPN для устройств» показывала на самом деле прокси SOCKS5/HTTP: это разные подсистемы, а имя у строки было от вкладки с правилами. Сколько правил заведено и сколько из них включено, не показывалось нигде. Теперь это две отдельные строки — «Прокси для устройств» и «VPN для устройств» со счётчиком «включено / всего».

  • Туннель Keenetic с доменным адресом сервера возвращается к жизни сам (#702) — после смены адреса за именем (DDNS, переезд сервера) туннель ложился навсегда: карточка бесконечно показывала «Запуск...», встроенный мониторинг раз за разом перезапускал интерфейс, а счётчик перезапусков при этом стоял на нуле. Причин было три, и чинятся они по отдельности.

    Первая: в конфигурацию роутера, уходило само доменное имя. Роутер резолвит его сам и при неудаче молча не поднимает интерфейс и ни строки в его журнале,а однажды разрезолвленный адрес больше не обновляет. Теперь AWG-M передает адрес, а не доменное имя, и следит за ним: как только адрес за доменным именем меняется, новый доводится туда, где он реально работает, в конфигурацию роутера на прошивках с нативным WireGuard ASC 2.0 и в слот прокси-модуля на остальных. Слежение переживает перезапуск AWG-M и не трогает остановленные туннели. Адрес IPv6 роутер в конфигурации не принимает вовсе, поэтому там стоит заглушка, а настоящий адрес выставляется при запуске через wg утилиту Entware; на старом прокси-модуле без поддержки IPv6 живой туннель ради заведомо неудачной пересборки больше не роняется.

    Вторая: состояние «интерфейс поднят, но пира нет» считалось запуском без ограничения по времени. Теперь через пять минут в таком виде туннель честно показывается сломанным и на карточке, и в мониторинге; замена конфигурации сломанного туннеля снова его перезапускает.

    Третья: перезапуски интерфейса силами роутера не считались (уходила константа) и не были видны на карточке туннеля. Теперь счётчик настоящий, показывается в подсказке «Восстановление (N)» и не обнуляется от самих перезапусков.

    Сверх этого: если три перезапуска подряд не дали ни одной удачной проверки, туннель перезапускается целиком — так же, как это делается кнопкой, но не чаще раза в 15 минут. Полный перезапуск подчиняется настройке «Перезапуск при dead»: выключена — ничего не трогаем.

  • FreeTurn/WDTT: автостарт переживает и обновление пакета, и перезагрузку роутера — до сих пор он ломался в трёх местах сразу. Сохранение настроек гасило флаг «должен работать»: форма присылает конфиг целиком вместе со снятой галкой, прочитанной ещё до запуска, — теперь флаг ставится и снимается только кнопками «Запустить»/«Остановить», а сохранение настроек его не трогает. После opkg upgrade клиенты и серверы продолжают работать, но новый демон их уже не видит: журнала процесса нет, статистика не читается, watchdog слеп — такие процессы теперь перезапускаются, чтобы вернуться под надзор (ценой короткого разрыва трафика на обновлении). И наконец, pid-файл лежит на флешке и переживает перезагрузку, а после неё тот же номер процесса достаётся кому угодно: раньше это выглядело как «прокси уже запущен» и автостарт молча не срабатывал. Теперь номер сверяется с именем процесса в /proc, чужой процесс не считается нашим и — что важнее — не получает от нас сигнала остановки.

    Сам автостарт на обновлении демона теперь отложен так же, как на холодной загрузке (пауза и повтор), а не выполняется мгновенно: DNS и туннели к этому моменту могут быть ещё не готовы.

  • WDTT: клиент поднимается сам после перезапуска сервера — с той стороны сессии обрываются, но клиент этого не замечает: воркеры числятся активными, наверх продолжают уходить keepalive-пакеты, а снизу не приходит ни байта. Такое состояние само не лечится — только перезапуском клиента. Теперь оно распознаётся, но осторожно: живой, но простаивающий туннель выглядит точно так же, поэтому перезапуск происходит, лишь если входящего трафика нет около десяти минут подряд.

  • TProxy: UDP-инбаунд больше не зацикливает сам себя (#689) — tproxy-in слушал на 0.0.0.0, хотя правила TPROXY направляют пакеты строго на 127.0.0.1. Открытый на всех адресах сокет принимал и обычные UDP-пакеты, адресованные роутеру на этот порт; sing-box считал такой пакет перехваченным и честно пересылал «получателю» — то есть самому себе. Один случайный пакет заводил самоподдерживающуюся лавину: тысячи UDP-потоков dst=<WAN>, разбухший conntrack, процессор на 90-100% в обработке пакетов и обрывы TCP у устройств в политике. Теперь tproxy-in и tproxy-инбаунды QoS-классов слушают на 127.0.0.1 — перехваченный трафик доставляется как и раньше, а посторонние пакеты до сокета не доходят. redirect-in остаётся на 0.0.0.0: NAT REDIRECT переписывает адрес назначения на адрес интерфейса, и loopback-листенер его бы не увидел. Диагноз до строки кода и проверка обхода на NC-1812 — vanomilah.

  • TProxy: перестройка netfilter больше не убивает уже идущие UDP-потоки (#684) — продолжение #627. Тот фикс закрыл потоки, рождённые в окне без перехвата: они получали прямой NAT в WAN, и awgm-ctclean.sh выселяет их из conntrack. Но поток, живший до перестройки, NAT не имеет — он был перехвачен tproxy, — и под выселение не попадал. На время окна такой поток уходит из-под перехвата, и его подхватывает аппаратный движок PPE как обычный форвард: дальше пакеты коммутируются железом и в netfilter не входят вообще. Ни восстановление правил, ни удаление записи из conntrack не помогают — таблица PPE своя, и она же продолжает обновлять счётчики conntrack, поэтому запись не протухает. Со стороны это снова «меня перестали слышать до конца разговора»: клиент шлёт, ответов ноль, при этом TCP и новые UDP-потоки через тот же туннель работают.

    Теперь после возврата перехвата сбрасывается таблица аппаратного offload — каждый offload-поток один раз идёт медленным путём и переучивается уже через tproxy. Сброс делается там же, где выселение из conntrack: в netfilter.d-хуке после восстановления цепочек, при установке правил на старте движка и при самолечении. Только когда джамп перехвата реально на месте — сброс при отсутствующем джампе просто отправил бы те же потоки в offload заново. На платформах без узла /proc/sys/net/hwnat/ppe_flush шаг пропускается. Диагноз, измерения и вариант фикса — tomas1pit: на NC-1812 у мёртвого потока счётчик conntrack прошёл 8444 пакета при нулевых счётчиках правил mangle, а после сброса PPE поток ожил в ту же секунду; проверка фикса — 8 перестроек netfilter за две минуты без единого разрыва.

  • Исключение KeenDNS/CrazeDNS больше не уводит на роутер чужие адреса — пресет исключал из перехвата адрес 78.47.125.180, и домены Keenetic снова открывались локально. Но этот адрес общий: на него указывают A-записи всех KeenDNS-имён, а не только своих. Любое обращение к чужому *.keenetic.pro или *.netcraze.pro с устройства в политике попадало не к его владельцу, а на веб-интерфейс собственного роутера. Важно: В прошивках 5.2 Альфа сменили адрес который применялся годами, поведение будет неожидаемым, т.е. эта настройка не будет работать. Какое будет финальное решение разработчиков неизвестно. Использовать 5.2 Альфа на рабочем устройстве не рекомендуется.

    Теперь пресет работает иначе: имя роутера берётся из настроек KeenDNS в NDMS, и sing-box отвечает на запросы этого имени, его поддоменов и порталов локального доступа my.keenetic.net / my.netcraze.net адресом роутера в локальной сети — ровно так же, как это делает собственный DNS-сервер роутера. Чужие имена резолвятся как обычно. Записи видны в списке DNS-перезаписей с пометкой владельца; править и переносить их вручную нельзя, снимаются они выключением пресета. Если KeenDNS не забронирован, записей не появляется и в журнал пишется предупреждение; при временной недоступности NDMS или пропавшем адресе локальной сети прежние записи сохраняются, а не сбрасываются.

    Цена перехода: решение работает через DNS, поэтому клиент со своим шифрованным резолвером (DoH/DoT в браузере, Private DNS в Android) или с уже закэшированным ответом резолвит имя мимо роутера и по-прежнему уходит в туннель — прежнее исключение по адресу работало независимо от способа резолва. В ответе отдаётся адрес роутера в основном сегменте (br0): клиентам из других перехватываемых сегментов он может быть недоступен по правилам межсегментного доступа.

  • Клиенты WDTT-сервера больше не пропадают из списка — заведённые в разделе «Раздача» клиенты жили только в panel.db, базе, которую пишет и сам wdtt-server. На старте он читает её целиком в память, а затем записывает обратно полной перезаписью таблицы. Если чтение по какой-то причине не удавалось — оборванный журнал SQLite после потери питания, занятый на тот момент файл, — сервер поднимался с пустой базой в памяти и тут же сохранял её на диск. Все клиенты с отдельными паролями исчезали навсегда, оставался только основной пароль сервера — тот, которым подключение продолжало работать.

    Теперь список клиентов хранится в настройках awg-manager и оттуда же восстанавливается: перед каждым запуском сервера panel.db пересобирается по нему, а строки, заведённые мимо awg-manager, наоборот подхватываются в настройки, а не теряются. Если база не читается, список всё равно показывается — с пометкой, что данные взяты из настроек и попадут в базу при следующем запуске. Сам wdtt-server пересобран: после неудачного чтения он больше не переписывает panel.db тем, что не смог прочитать.

  • Смена пароля WDTT-сервера отзывает прежний — старый пароль оставался в panel.db отдельной строкой и продолжал пускать клиентов, пока его не удалишь вручную; сам wdtt-server эту строку не убирает. Теперь при смене пароля она снимается вместе с привязанными к ней устройствами.

  • Основной пароль сервера виден в списке клиентов, а его ссылка восстановима — список показывал только клиентов с отдельными паролями, поэтому основной пароль, которым по умолчанию подключаются все, не был представлен вообще ничем. Ссылка wdtt:// для него жила ровно до перезагрузки страницы: адрес и VK-хеши нигде не сохранялись, и собрать ту же ссылку заново можно было только по памяти. Теперь основной пароль — первая строка списка со своей кнопкой «Ссылка» и без кнопки удаления, а адрес и VK-хеши последней ссылки сохраняются в настройках сервера.

  • WDTT-сервер: клиенты подчиняются маршрутизации роутера (HR, политики,sing-box). Сеть OpkgTun приведена к пулу клиентов (10.66.0.1/16), SNAT работает на любом egress (не только WAN), DNS клиентов заворачивается на роутер, правила переживают перезапись netfilter NDM. (#697)

  • Мёртвые процессы wdtt/freeturn больше не висят зомби — надзор ждал, пока дочитаются логи процесса, и если выживший хелпер держал их открытыми, умерший процесс не хоронился, а супервизор считал его работающим и не перезапускал. Теперь процесс хоронится сразу по смерти, выжившие члены его группы добиваются, а утечка дескрипторов на каждом старте закрыта. (#697)

  • Автовосстановление wdtt/freeturn не устраивает штормов — повторные попытки лечения (пересоздание интерфейса, рестарты по health-пробам и застою трафика) теперь затухают экспоненциально вместо бесконечного цикла каждые полминуты; ручное сохранение конфига снимает паузу немедленно. Заодно: усыновление живого процесса после рестарта демона больше не пересоздаёт интерфейс впустую, а MTU клиента переживает восстановление (раньше жёстко ставился 1300). (#697)

  • Страница перестала «залипать» при прокрутке на мобильном (#701) — прокручивалась не сама страница, а её содержимое внутри блока высотой ровно в экран. Мобильный Chrome прячет адресную строку и обрабатывает прокрутку за край только для настоящей прокрутки страницы, поэтому после докрутки вниз и обратно вверх интерфейс обрывался на середине карточки: снизу оставалась пустая полоса, сверху часть страницы закрывала адресная строка. Заметнее всего это было в «Настройках» как самой длинной странице, но касалось всех. Теперь прокручивается страница целиком; защита от горизонтального сползания, ради которой всё и было заведено, сохранена.

  • Роутеры с ARM-процессором больше не перезагружаются раз в несколько часов при IPsec рядом с AWG-туннелем — модуль шифрует пачку пакетов за один заход, занимая на это время блок ускорения NEON, и внутри этого захода уступал процессор другим задачам. На прошивке Keenetic такая уступка приводит к тому, что задача засыпает, оставив NEON помеченным как занятый: следующий, кто попробует им воспользоваться, падает вместе с ядром. Жертвой оказывалось шифрование IPsec — оно уходит на тот же блок и занимает его безусловно. Отсюда и картина, по которой дефект невозможно было связать с AWG: в отчёте о крахе видно только IPsec, а сам AWG-туннель при этом работает.

    Теперь NEON освобождается перед уступкой процессора и берётся обратно после — заснуть с занятым блоком стало нельзя. Проявлялось только на моделях с ARM (MT7622/MT7981/MT7988), только при одновременной нагрузке на IPsec и AWG, и не встречается в штатном WireGuard-модуле роутера, который такой уступки внутри работы с NEON не делает. Дефект есть и в исходном AmneziaWG. Два роутера с постоянным IPsec-туннелем рядом с нагруженным AWG перезагружались каждые 5-6 часов; с исправлением они отработали 48 часов без единого краха.

    Отдельная благодарность Nikolai Gridnev (@user241215) — за issue о перезагрузках и за пять дней самоотверженного тестирования: сборка за сборкой на боевых роутерах, со снятием отчётов о каждом крахе. Дефект воспроизводился раз в несколько часов и только под настоящей нагрузкой, поэтому без этого терпения найти его было нельзя.

    Модули пересобраны из тега v3.0.20260805 с этим исправлением; в самом теге его нет. Сам тег приносит ещё одно: keepalive-пакеты определялись по нулевой длине, поэтому при включённом ContentPaddingAddition переставали быть пустыми и отбрасывались — на туннеле без полезного трафика это выглядело как «связь есть, а счётчики стоят». Обновлённый модуль загружается после перезагрузки роутера — до неё ядро продолжает работать со старым.

  • Kernel-режим заработал на KN-2010, KN-2110, KN-2112, KN-2410, KN-2510 и KN-3610 — на этих моделях туннель в режиме ядра не поднимался вообще. Модуль сверял тип входящего пакета, не переставив байты в порядок процессора, а у этих моделей он обратный остальным: мимо проверки проходили все четыре типа сообщений, включая рукопожатие, и роутер молча отбрасывал всё, что присылал сервер. Происходило это при любых настройках, а не только при своих значениях H1-H4, так что режим был неработоспособен целиком. Дефект есть и в исходном AmneziaWG — он исправлен в ветке 3.1, ещё не влитой в основную. Модули для этих моделей пересобраны с исправлением; на остальных перестановка байтов ничего не меняет, и их модули не трогали. NativeWG на этих роутерах работал и до исправления — поэтому дыра так долго не всплывала. Обновлённый модуль применяется после перезагрузки роутера.

Изменения работы (в т.ч. Breaking Changes)

  • Селективный перехват убран — идея была заворачивать в sing-box только адреса, стоящие за доменами из правил маршрутизации, а всё остальное отправлять прямо в WAN. Адреса для этого роутер добывал сам, резолвя домены правил со своей стороны, и перехватывалось только то, что попало в набор. В поле набор оставался пустым, то есть перехватывать было нечего, — механизм убран целиком вместе со своим ipset, слотом конфигурации и API. Настройка selectiveBypass в старых settings.json игнорируется, оставшиеся от неё артефакты снимаются при первом запуске.

    Поведение после обновления меняется. У тех, кто держал селектив включённым, через sing-box пойдёт весь трафик политики, а не почти ничего, как это было при пустом наборе. Стоит заранее посмотреть на нагрузку процессора и на правила маршрутизации: то, что раньше уходило мимо движка само собой, теперь решается его правилами. Точечно вывести адреса из перехвата можно «Доп. подсетями», а большие диапазоны — обходом по geoip.

  • sing-box обновлён до 1.14.0-beta.14-awgm.10 — сборка форка перенесена на upstream v1.14.0-beta.14. Из апстрима: клиент AnyTLS больше не отправляет серверу метаданные о себе (открытый сервер их не использует, но по ним профилировали пользователей), при необходимости их можно задать вручную. Дальше по бетам шли только исправления — заметных для нас четыре: QUIC-клиенты (hysteria2, TUIC, xhttp поверх HTTP/3) перешли на привязанный сокет и больше не рвут соединение, когда буфер отправки переполнен; DNS-кеш перестал сбрасываться при сбросе сети; починен размер буфера DNS-ответа.

    Наши AmneziaWG/AWG3 и mieru перенесены без изменений. В xhttp пришлось подогнать вызов под новый интерфейс QUIC-клиента и заодно закрыть утечку: под HTTP/3 UDP-сокет оставался открытым и при неудачном подключении, и после закрытия соединения.

  • Туннель к серверу по доменному имени переживает смену его адреса — раньше домен разрешался один раз, при создании туннеля, и выбранный адрес оставался единственным до перезапуска sing-box: сервер за динамическим DNS после переезда становился недостижим, а из нескольких адресов в ответе использовался только первый — если он не отвечал, туннель не поднимался. Теперь имя разрешается заново на каждой попытке хендшейка, попытка уходит сразу на все полученные адреса, и туннель закрепляется за тем, откуда пришёл ответ. Работает и для WireGuard-туннелей (пришло из апстрима), и для AmneziaWG/AWG3 — там мы перенесли ту же механику в свою сборку.

    Заодно обновлена библиотека mieru — 3.34.1 → 3.35.0. В ней появился режим низкой энтропии (маскировка тела пакета против DPI, который ловит шифрованный трафик по «слишком случайному» содержимому). Режим выключен по умолчанию и включается только паттерном трафика от сервера, поэтому подключения к серверам mita прежних версий продолжают работать как раньше; если же паттерн его включает, сервер тоже должен быть не старше 3.35.0.

    Разборщик подписок в панели обновлён до той же версии mieru. Иначе импорт клиентского JSON от панели mieru молча терял бы новую настройку: незнакомые поля при разборе отбрасываются, и туннель к серверу с включённым режимом оставался бы без трафика без единой ошибки в журнале. Импорт mieru://- и mierus://-ссылок и подписок Clash этому не подвержен — там паттерн переносится как есть.

    Туннели hysteria2 теперь маскируются под Chrome. QUIC-хендшейк по умолчанию повторяет хендшейк браузера: DPI сложнее выделить hysteria2 из обычного трафика. Цена — окна приёма QUIC теперь тоже как у Chrome, а они меньше прежних (поток 8 → 6 МБ, соединение 20 → 15 МБ): на очень быстрых каналах это может стать потолком скорости. Вернуть прежнее поведение отдельному туннелю можно полем "disable_chrome_parrot": true в его конфигурации sing-box.

    Две комбинации TLS такая маскировка не переживает и обрывает подключение: disable_sni без insecure и клиентский сертификат. Такие туннели панель помечает disable_chrome_parrot сама — и новые, и уже сохранённые, при первом запуске после обновления. Править конфигурацию руками не нужно, тем более что у туннелей из подписки правка не пережила бы её следующее обновление.

  • FreeTurn обновлён до 2.1.1-1 — установка из панели ставит сборку нашего форка поверх апстрима v2.1.1. Из апстрима: решатель VK-капчи приведён в соответствие с текущей версией виджета (прежний уже расходился с ним в запросах и подписи), попытки слайдера разнесены по дорожке, а эскалация «чекбокс → слайдер» перестала жечь персону — то есть капча в среднем решается с меньшего числа заходов. Все наши доработки перенесены: пять авто-раундов, один слот капчи на роутер, отсутствие фатала на холодном старте, VKCalls-путь в обход капчи и время в журнале по часовому поясу роутера.

    Кто уже пользуется FreeTurn — карточка предложит обновление; старая версия продолжает работать, пока обновление не запущено.

  • AWG3: на простаивающем туннеле стороны больше не перебрасываются keepalive'ами — при включённом ContentPaddingAddition отправитель дописывает padding и к keepalive, поэтому тот доезжает не пустым. Обе стороны считали его данными и заводили в ответ собственный keepalive, тоже с padding'ом. Прошлая сборка чинила только приём, теперь исправлены обе стороны. Видимые следствия: на простое пропадает лишний трафик и мусор packet with invalid IP version в журнале.

Don't miss a new awg-manager release

NewReleases is sending notifications on new releases.