Весь разговор с ядром steer — в одном блоке функций stl_* (слой steer):
бекенд отдаёт ему свою модель (выход WARP или VPN, сервисы и их списки,
подписка с узлом и маркерами) и спрашивает состояние на своём языке, а слой
пишет спеку v2 в /etc/steer/spec.json и зовёт клиент steer, который отдаёт
команды демону steerd.
- Ядро: steer-core и только нужные модули (VLESS — когда есть подписка)
вместо steer-extended; версия — stable 2.x из splify2/releases
(version.json, с проверкой sha256), не ниже 2.0.0. Переход с 1.x:
apk — одной транзакцией, opkg — снятием прежнего пакета; спека остаётся.
Удаляются только пакеты, которые ставил Zapret Manager.
- Применение: проверка демоном (ctl check), затем steer apply через демона —
он сам трогает только изменившееся. Убраны костыли 1.5.9: srs-read и
перевод .srs в текст, сумма спеки и сверка outputs, выбор между reload и
restart, перезапуск при fail-open, kmod-tun руками, чтение набора nft.
- WARP — группа pick: latency из туннелей (один туннель — выход-устройство),
без IPv6, как и прежде. VPN — tunnel vless: маркеры узлов уходят в
exclude_name, скрытые и закреплённый узел — в nodes без предела 16.
- Состояние — из steer status (failed, device, probe), diag и explain — через
слой. Блокер: ядро ведёт steer-box-connector (podkop, forkop) или чужая
спека v1/v2/yaml.
- Прежняя спека ZM (v1) ядро 2.0 читает как есть; при первом применении
слой пишет её заново в v2. Автоперезапуск по cron и обновление панели
идут через backend.sh.
- Фронтенд: три подсказки про steer-extended переписаны под ядро 2.0.
- docs/autobypass: перестановка туннелей рвёт соединения сменой туннеля, а
не перезапуском ядра.
Committed-by: agy-cli (autonomous, run #96)
Zapret Manager 1.96 — исправления
- Исправлена ошибка «Object not found» после обновления (LuCI: «RPC call to zapret-manager/status failed with error -32000», Web UI: «Роутер не отвечает: Object not found»).
- Установщик теперь проверяет, что rpcd подхватил панель и новый список методов, и при необходимости сам перезапускает rpcd.
- Сторож (раз в 2 минуты) следит не только за входом в LuCI, но и за самой панелью: если rpcd её потерял, он перезапускает rpcd.
- LuCI и Web UI при «Object not found» больше не показывают ошибку сразу, а повторяют запрос несколько секунд, пока rpcd запускается.
- После обновления больше не нужно сбрасывать кэш браузера: панель сама замечает новую сборку, обновляет свои файлы в кэше и один раз перезагружает страницу.
- Файлы панели при обновлении заменяются целиком за один шаг — открытая страница больше не может запустить наполовину записанный скрипт.
- На странице входа Web UI вместо «Object not found» выводится понятное сообщение, что rpcd ещё запускается.
- Версия движка Steer — 1.5.8: таблица правил заменяется одним действием, при упавших
туннелях трафик каналов идёт через zapret. Запасная версия tgws — 0.3.1.
- Установленный движок раньше не обновлялся никогда: при «уже установлен» установка
выходила сразу. Теперь движок, который поставил Zapret Manager, обновляется до его
версии — при установке Steer и в начале автообхода. Чужой движок (splify2) не трогается.
Работающий Steer после обновления перезапускается, а не выключается.
Сторож DNS для ИИ-сервисов шёл задачей redbtn: затирал журнал последнего автообхода и выглядел
на странице идущим автообходом. Теперь у него своя задача redbtn_geo; автообход и кнопка
«Подобрать DNS заново» ждут его, «Выключить» просит повторить. После неудачного подбора резолвер
снимался, и сторож молчал навсегда при живой строке cron — теперь пробует снова раз в два часа,
а если пакет удалён или zm-geodns выключен в автозапуске, снимает свою строку сам. Подбор
резолвера — не больше RB_PARALLEL проб разом.
Удаление панели зовёт redbtn_panel_gone: служба zm-geodns, её файл dnsmasq и строка cron
снимаются. Steer, туннели и warp.lst моста остаются — они переживают удаление панели намеренно.
Замер стратегий: цели внешнего набора без схемы идут по https://, а не по HTTP на 80-й; 451 и
000 — отказ, как в _rb_check_one; файл исключений качается, только если его нет или он пуст.
Мёртвое: запись «pkg tgws» в owned, geoblock.lst в установщике, состояние off и ветка для
снятых в Steer сервисов, до которой подбор не доходил.
warp.up писался в порядке номеров туннелей, хотя комментарий обещал «лучший первым», а порядок
читают все, кому нужен один туннель: _st_warp_first, мост Telegram (warp.lst — первый живой) и
движок (devices в spec решают ничьи в пределах допуска prefer: latency). Разведка теперь отдаёт
ключ качества (разряд запаса, потери, круг), и _st_warp_order ставит туннели по нему. Если ни
один туннель не разведан заново, порядок прежний: перестановка по дрожанию пинга меняла бы spec
и перезапускала движок на каждом «Применить».
Второй найденный порт из warp.ports стал запасным: не дала точка рукопожатия при окончательной
привязке — тот же адрес пробуется на нём, прежде чем туннель сдаётся.
_st_warp_handshake, _st_warp_hs_epoch и _st_warp_colo нигде не вызывались — убраны.
- Фоновое сравнение при равном итоге переключало на стратегию, которая шла в списке первой:
на тестовом роутере v4 и v7 сошлись на 137, подбор ставил v7, видел, что сервисов
открывается меньше, и возвращал v4. Теперь при равенстве применённая остаётся.
- Российская колония: выход у неё внутри страны, за теми же ТСПУ, — через неё не
снимается ни геоблок, ни остальные блокировки. Так и сказано в журнале.
- docs/autobypass.md — как устроен автообход: порядок подбора, перебор стратегий и счёт,
сравнение близких, выбор колоний WARP, списки, ИИ-сервисы, мост Telegram, ограничения.
- Список туннелей WARP для stgws (/etc/stgws/warp.lst, без российских колоний) пишется
после подъёма туннелей и стирается при выключении и удалении Steer.
- Туннели проверяются в конце любого подбора, если стоит Steer, даже когда сервисам WARP
не понадобился: мосту они нужны всегда, а российский туннель так разводится заново.
- Нажатая кнопка снимает ручные выключения: выключенный Steer и сервисы, снятые на его
странице, снова участвуют в подборе.
- Дополнительный замер: --fail-early и пять секунд на запрос — срок curl считался на
каждый из десяти запросов, и стратегия, рвущая соединения, мерилась по часу.
- pkill в busybox OpenWrt нет — процессы ищутся через ps; установщик снимает фоновое
сравнение всем деревом процессов, иначе его цикл продолжал запускать curl.
- В фоновое сравнение идут стратегии не ниже 90 % от основного счёта лучшей; первыми —
открывшие больше адресов неоткрывшихся сервисов, всего до шести. Итоговый счёт =
основной + дополнительный, побеждает больший.
- Дополнительный замер — как в dpi-detector (core/tcp16_scanner.py): по одному
соединению десять запросов HEAD с X-Pad по 4 КБ, SNI из списка или example.com, узел
засчитывается, если соединение пережило все десять. Прежнее «скачать 64 КБ с голого
адреса» у всех стратегий давало одинаковые 3 из 37. Узлы — весь список, 110.
- Живой туннель WARP в российской колонии разводится заново: Cloudflare со временем
стал отвечать на прежний адрес из DME, а туннель держался, потому что жив.
- Задача считается живой, только пока в её журнале нет __DONE__: номер завершившегося
подбора достался проверке гео-DNS из cron, и установщик отказывался ставиться.
- Установщик под set -e молча обрывался на kill уже завершившегося фонового сравнения.
- Полный подбор после быстрого не проверял ни одной стратегии: перебор шёл только когда
что-то не открывалось, а после быстрого открывалось всё. Теперь полный идёт всегда.
- Бэкенд из rpcd работал с umask 077, и списки zapret, которые он переписывал, получали
права 600: nfqws после сброса прав их не читал, и каждая стратегия «не запустилась», а
общий обход после перезапуска молча терял списки. umask 022, права чинятся при
перезапуске zapret и перед подбором.
- Счёт стратегий — общий («открылось N из 54»); при равном выше та, что открыла больше
адресов неоткрывшихся сервисов.
- Равные лучшие сравниваются уже после подбора, в фоне, по узлам CDN из списка
dpi-detector (Runnin4ik): обход к этому моменту работает, на странице — «Лучшая
стратегия определится позже». Стратегия меняется, только если другая набрала строго
больше и сервисов открывается не меньше.
- На роутерах меньше 256 МБ пробы идут по четыре, а не по восемь.
- Запасная версия tgws — 0.2.9.
Градиент кнопки повторялся под прозрачной рамкой, и слева виднелся его
противоположный конец. Фон теперь начинается от края рамки и не повторяется.
Название движка в текстах интерфейса — Steer.