Что нового в 0.9.12
Релиз собирает 103 коммита: автоматические обновления с откатом, отчёт для поддержки, подмена HWID для подписок, DNS-секции с пулом серверов, аварийный переход напрямую и ускорение интерфейса.
Автообновления с откатом
NetShift и sing-box-extended обновляются сами — после загрузки роутера и/или по расписанию. Перед обновлением и после него проверяется, что связь и секции работают; если после обновления перестало работать, ставится прежняя версия, а сломавший роутер выпуск запоминается и пропускается. Стандартное ядро из прошивки не трогается.
Источник обновлений выбирается: стабильные выпуски или тестовые сборки форка, с зеркалами GitHub для загрузок — на случай, когда GitHub режет адрес роутера.
Отчёт для поддержки
Вкладка «Диагностика» собирает версии, настройки, конфиг и журналы в один текст, из которого убраны пароли, ссылки и адреса серверов: серверы становятся host-N, списки — <N entries>, скрываются подсеть ECS и идентификаторы DNS-провайдера. Отдельная команда get_crash_log достаёт из системного журнала последнее падение sing-box со стеком.
Подписки
- Подмена HWID и устройства. Панели вроде Remnawave выдают подписку только конкретному приложению и проверяют заголовки
X-HWID,X-Device-OS,X-Ver-OS,X-Device-ModelиUser-Agent. Теперь секция может представиться нужным клиентом, а встроенный генератор заполнит поля так, как их шлёт Happ на Android, iOS, Windows, macOS или Android TV, либо INCY. - Предпросмотр фильтров — видно, сколько серверов останется после применения фильтров по словам, протоколу, транспорту и защите, ещё до сохранения.
- Большие ленты разбираются одним проходом jq, несколько слов фильтра можно писать в одной записи через
|. - Плановое обновление больше не перезапускает sing-box, если у узлов сменились только имена.
DNS
- Свой DNS у каждой секции (
own_dns_server). - Несколько серверов в DNS-секции —
dns_pool_serverс режимамиpriorityиparallel. - Таблица DNS-серверов со своим маршрутом для каждого сервера.
Маршрутизация
- Аварийный переход напрямую (
failover_direct): пока отвечает хоть один сервер секции, всё идёт как обычно; когда не отвечает никто — трафик секции уходит вdirect-out, и возвращается, как только сервер ответил. - Ссылки TUIC и AnyTLS.
- Port hopping Hysteria2 из ссылки —
mport/portsиhop-interval. - Звонки по Wi-Fi напрямую (
wifi_calling_directдобавляет UDP 500 и 4500 к прямым портам).
Интерфейс и скорость
Настройки, которые не влияют на работающий сервис (источник обновлений, зеркала, уведомление о версии, плитки дашборда, интервал монитора), применяются без перезапуска. Страница NetShift открывается заметно быстрее: меньше вызовов к роутеру, тест DNS и список соединений запускаются только когда открыта их вкладка, sing-box version спрашивается один раз и кешируется.
Исправления
- Трафик самого роутера (wget, opkg) для проксируемых доменов не проксировался —
mangle_outputне имел правил маркировки. block_leaks: изменённые пересылки DNS по зонам не доходили до dnsmasq.- Адрес прокси-сервера больше не резолвится через DNS, чей detour — этот же прокси.
independent_cacheне пишется для sing-box 1.14+ (опция устарела).exclude_ntpдействует и на синхронизацию времени самого роутера.- Обращение из LAN к собственному адресу роутера не маркируется.
- Плановые обновления списков и подписок запускают cron на новом роутере.
- Уведомление о новой версии не залипает после обновления; ответ DNS или GitHub на последней попытке не считается провалом; воркер повторных попыток подписки не копится после сбоев.
- Обновление сохраняет установленное ядро, а «unsupported links» называет ядро в журнале.
- Первый запуск без подключения показывает понятную подсказку вместо ошибки.
- Секции показывают только то, что к ним относится.
Обновление
sh <(wget -O - https://raw.githubusercontent.com/yandexru45/netshift/refs/heads/main/install.sh)Обновление через пакет сохраняет конфиг и установленное ядро. Если ставите вручную, ставьте все три пакета: netshift, luci-app-netshift и luci-i18n-netshift-ru.
Участники релиза: @yandexru45, @cergo666, @kjljxybr — спасибо за код, тесты и ревью. Полный список — в README, раздел «Участники».