Новые возможности
-
Имена клиентов WireGuard-серверов в списке соединений (#639) — имя клиента резолвилось только по MAC через таблицу устройств NDMS, а трафик из туннеля приходит без MAC: пиры показывались голым IP и в таблице, и в сводке «По клиентам». Теперь берутся те же источники, что уже питают монитор соединений sing-box: описания пиров системных WG-серверов по их адресу и managed-серверов по tunnel IP. Имя из таблицы устройств остаётся приоритетным, поиск по имени пира тоже работает.
-
Прямой переход в редактирование политики sing-box (#573) — кнопка «Управление устройствами» была только в простом режиме и открывала список политик. Теперь она есть и в панели движка экспертного режима, а ведёт сразу в редактор текущей политики: вкладка «Политики доступа» принимает имя политики параметром адреса.
-
Вкладка «Политики доступа» доступна на всех прошивках и уровнях интерфейса — вкладка скрывалась на KeeneticOS 4.x и ниже «Расширенного» уровня. Ограничение по версии было скопировано с соседней вкладки NDMS, где оно обосновано (dns-proxy с object-group есть только в 5.x); политики же работают одинаково на обеих ветках прошивки, и бэкенд их никогда не гейтил.
-
Поддержка DNS-механизма sing-box 1.14 в sb-router — DNS-правила принимают
evaluate/match_response/race/speculative,ip_cidrиresponse_rcode/response_answer/response_ns/response_extra; цепочки проверяются на согласованность до применения конфига. Новые поля редактируются в UI: в модалке DNS-правила действие выбирается изМаршрут/Блокировка/Evaluate/Respond(прежние подписи «Резолвить»/«Заблокировать» переименованы), под выбранное действие открываются только применимые поля — цельevaluateи тег ответа, матчеры по DNS-ответу (rcode, IP ответа, RR-записи),race/speculative; строки правил в обоих списках показывают действие цепочки и чипыrace/spec. Трейс «Проверка DNS» учитывает цепочки:evaluateбольше не считается финальным совпадением, а правила, матчащиеся по ответу, помечаются как статически непроверяемые с предупреждением, что вживую они могут перехватить запрос раньше найденного правила. -
DNS-пресеты sb-router: «Отказоустойчивый» и «Анти-подмена» — цепочки правил из механизма 1.14 собираются одним переключателем в панели «DNS-серверы» вместо ручной сборки четырёх правил. «Отказоустойчивый» опрашивает прямой и туннельный резолверы параллельно и отдаёт ответ первого успевшего (упавший резолвер перестаёт быть отказом); «Анти-подмена» переспрашивает через туннель только те ответы прямого резолвера, чей IP попал в редактируемый список подозрительных подсетей (сид —
0.0.0.0/32,127.0.0.0/8,10.10.34.34/32,10.10.34.35/32), остальные отдаёт как есть; если прямой резолвер молчит вовсе, «Анти-подмена» доспрашивает через туннель, а не проваливается на финальный сервер — иначе при типовой настройке (финальный сервер = тот же прямой) защита от подмены молча выключилась бы. Правила пресета помечены бейджем «пресет», не редактируются и не удаляются вручную, а при каждой записи конфига переносятся в конец списка, чтобы добавленные позже пользовательские правила срабатывали раньше цепочки. Рядом — кнопка «LAN-имена → локальный DNS», которая одним нажатием заводит локальный DNS-сервер и правило для однословных имён. Пресет работает в обычном режиме sb-router; в режиме FakeIP карточка заблокирована.
Исправления
-
Исключения DNS-правил больше не требуют совпадения с включённым доменом — сервер отклонял exclude, если он не был поддоменом одного из доменов списка, и это же закрывало исключения для доменов из подписок. Проверка снята: запись уходит на роутер как есть, решение принимает NDMS. Это даёт обход известной особенности NDMS, где сопоставление идёт по суффиксу без границы по точке (правило на
x.comзахватываетyandex.com). Заодно исправлено давнее: исключения попадали только в первую object-group списка и для списков длиннее 300 доменов просто не срабатывали — теперь они есть в каждой группе. -
Тулбар в режиме дашборда занимает всю ширину (#607) — элементы жались к левому краю, справа оставалась пустота. Поиск и переключатели остались слева, кнопки действий прижаты к правому краю. Заодно исправлено переполнение на ширине 761–1000 пикселей, где тулбар вылезал за край экрана и кнопка «Создать» была недоступна: строка переносится, правая группа уезжает целиком.
-
Длинные имена туннелей в столбце «Маршрут» (#643) — столбец был фиксированной ширины, под чип оставалось 76 пикселей, и имя обрезалось рубленым краем без многоточия начиная с 13 символов. Столбец теперь растёт за счёт свободного места, остаток режется многоточием, полное имя доступно в подсказке.
-
QoS-маршрутизация: таймаут UDP-сессии и анализ трафика теперь действуют и на классы DSCP (#554) — sing-box склеивает файлы конфигурации по имени, поэтому правила QoS-слота идут раньше системных, а правило класса обрывает перебор: помеченный DSCP трафик не доходил ни до правила с таймаутом, ни до анализа трафика. UDP-сессии такого трафика не закрывались по простою вообще — таймаут, заданный на самом перехватчике, лишь помечает запись во внутреннем кэше sing-box, а выселяется она только при появлении новой сессии на том же перехватчике, — и в списке соединений у них не было ни протокола, ни домена. Теперь QoS-слот несёт собственные копии обоих правил, сужённые до своих перехватчиков, чтобы не перехватить DNS раньше системного правила. Заодно исправлена подпись пункта по умолчанию в «UDP таймаут сессии»: там 5 минут, а не 3 — значение подняли ещё до релиза 2.16.0.
-
FakeIP: маршруты в туннель больше не ставятся там, где sing-box 1.14 правило уже не матчит — в 1.14 набор правил (
rule_set) вливается в ссылающееся правило, только если состоит ровно из одного простого правила безinvertи вложенногоrule_set; в остальных случаях он проверяется отдельно и лишь после того, как совпали собственные условия правила (раньше совпадения складывались по ИЛИ). Поэтому правило вида «свойip_cidr+ набор» перестало ловить пакеты по IP: они уходили вdirect, ядро возвращало их в tun по нашему же маршруту — и получалась петля. Такие наборы штатно порождает мастер «умного списка», когда в него смешивают домены и IP. Теперь петлебезопасность считается по тем же правилам, что и в sing-box: CIDR отправляется в туннель, только когда совпадение правила по этому адресу гарантировано. -
TProxy: штатный NDM netfilter reload больше не пересобирает все правила и не «отравляет» UDP-потоки (#627) — каждый reload (DHCP renew раз в пол-lease, изменение UPnP) сносил PREROUTING-джампы одной таблицы, а хук в ответ разбирал и восстанавливал обе; на время пересборки перехват отсутствовал. Хуже того, UDP-поток, чей первый пакет попадал в это окно, получал в conntrack прямой NAT в WAN c offload-шорткатом и обходил tproxy до конца жизни — для звонка это «меня перестали слышать до конца разговора». Теперь хук восстанавливает только реально сломанную таблицу из отдельного файла правил (окно сокращается до долей секунды), а после восстановления TPROXY новый скрипт
awgm-ctclean.shвыселяет из conntrack успевшие утечь UDP-потоки (ценой одного пакета поток пересоздаётся уже через tproxy); он же вызывается после установки правил при старте движка. В policy-режиме выселение фильтрует ядро по connmark политики, в режиме «все устройства» — отбор поmac=(LAN-происхождение). Диагноз, механизм «отравления» и вариант фикса — tomas1pit с контролируемыми экспериментами на NC-1812. Пакет получил зависимостьconntrack. -
Подписку снова можно удалить, когда на её outbound ссылается другой раздел (#633) — если «VPN для устройств» (или композит маршрутизации) выбирал выход из подписки, её удаление падало с «Ошибка удаления (500): … could not isolate outbound», и подписка становилась неудаляемой: предварительная проверка конфигурации судила соседние разделы по состоянию на диске, где ссылка ещё жива, тогда как реальное применение конфига такие висячие ссылки на селекторы самолечит. Теперь проверка моделирует то же самолечение (не трогая диск): чинимые ссылки не блокируют операцию, а нечинимые (правило маршрутизации на удалённый выход, ручные правки в 90-user.json, селектор из одних висячих членов) по-прежнему честно отклоняются.