L×Box v2.25.10
A patch on top of v2.25.9.
The node row shows a Tailscale exit node (via <device>, exit offline, a
key-expiry warning) and a catalogue of public subscription sources is now
linked from the README. A round of audit fixes (tasks 594–607): subscriptions
and own servers, DNS and config build, backup, routing, WARP, anti-DPI, l10n
and shell. No core change — still v1.14.2-lx.11.
Патч поверх v2.25.9.
Строка узла показывает Tailscale exit node (via <устройство>, exit offline, предупреждение об истечении ключа), из README появилась ссылка на
каталог публичных источников подписок. Раунд фиксов по аудиту (задачи
594–607): подписки и свои серверы, DNS и сборка конфига, бэкап, роутинг,
WARP, anti-DPI, локализация и shell. Ядро не менялось — всё ещё
v1.14.2-lx.11.
🇬🇧 English
✨ Added
- Tailscale exit node in the node row (task 608).
With the VPN on, a node with an exit node readstailscale·via <device>; an
offline exit device showsexit offlinein orange instead of the endpoint
state. Less than 7 days before the device key expires, the row warns
key expires Nd/key expired(on a NETWORKS row — instead ofrunning).
Direct vs relay stays in the Network tab: the core's status carries no path
(#155). - Catalogue of public subscription sources (task 602),
EN+RU, linked from the README.
🔄 Changed
- A hop chain has one name, its tag (task 594).
The separate label is gone: the Direction filter and the editor title use
the same name the user sees. - The
connectingtimeout grows with the node count (task 596):
max(15 s, 0.1 s × N)plus a margin for endpoints. A subscription of
~230 nodes no longer has its tunnel killed right after the core started it. - Ping and probe apply TLS fragmentation and mixed-case SNI the same way
the tunnel does (task 606).
🩹 Fixes
- Nodes and parsing. Saving an INI source (WireGuard/AWG) is no longer
taken for a JSON array (594);
a whole number written as0.0is emitted as an integer (595);
max_concurrency: "0"counts as unset and raises nofield_conflict(597);
empty fields of a v2rayN container count as absent keys (598). - Backup. «Replace all» replaces only the selected categories instead of
the whole settings document (599);
startup-prompt flags are not reported as unknown keys (600);
replacing a backup keeps the VPN toggle mirror (607). - Routing. A rule whose rule set is not downloaded yet stays on (601).
- Subscriptions and own servers (task 603).
Changing a subscription URL keeps nodes and cache until the first
successful update; a file subscription applies import rules to its
snapshot and its Source tab reads the cache; a broken own-server source is
not saved; deleting an own server asks «Delete server?»; a negative
profile-update-intervalfrom the server is rejected; one request per URL
per pass. - DNS and config build (task 604).
Editing SNI of a DNS server keeps the othertlsfields; a custom DNS rule
pointing to a missing server is dropped with a code; the proxy port is
checked on load from storage and backup; «config outdated» fires for every
template variable; Directionpool_toleranceis clamped to the core
limit 15000. - Service, automation, profiler (task 605).
A start error gets its own notification; a core failure after an accepted
SWITCH_NODEreportsVPN_ERROR(switch_failed); automation commands
resync with storage on start, after a backup and on a workspace switch; the
profiler reconnects on every tunnel start, START clears connection
snapshots (no falsetcpClose), the «DNS / router events off» banner is
gone. - Node list, WARP, anti-DPI (task 606).
«Copy link» on a node without a link says so instead of doing nothing;
dragging under a filter keeps hidden nodes in place; a custom WARP
endpoint is checked ashost:portbefore registration; an invalid TLS
fragmentation pause is replaced with 500 ms. - Localisation and shell (task 607).
More strings go through translation (node copy, theme, About, Add tile,
restore summary); the core locale follows the saved app language from
process start; the read-only code editor offers no Cut/Paste.
🔧 Under the hood
- Contract 1.1.108 (registry texts only);
sync_contract --towrites the
full commit sha to the lock. - Dead code found by audit 591 removed (task 593);
no user-visible change.
🇷🇺 Русский
✨ Добавлено
- Tailscale exit node в строке узла (задача 608).
При включённом VPN узел с exit node показываетtailscale·via <устройство>;
офлайн-устройство exit показываетexit offlineоранжевым вместо состояния
эндпоинта. Меньше чем за 7 дней до истечения ключа устройства строка
предупреждаетkey expires Nd/key expired(на строке NETWORKS — вместо
running). Прямое соединение vs relay по-прежнему только на вкладке
Network: статус ядра не несёт путь
(#155). - Каталог публичных источников подписок (задача 602),
EN+RU, со ссылкой из README.
🔄 Изменено
- У цепочки хопов одно имя — тег (задача 594).
Отдельного лейбла больше нет: фильтр Direction и заголовок редактора
используют то же имя, что видит пользователь. - Таймаут
connectingрастёт с числом узлов (задача 596):
max(15 с, 0.1 с × N)плюс запас на эндпоинты. Подписка из ~230 узлов
больше не теряет туннель сразу после старта ядра. - Пинг и проба применяют TLS-фрагментацию и mixed-case SNI так же, как
туннель (задача 606).
🩹 Исправления
- Узлы и парсинг. Сохранение INI-источника (WireGuard/AWG) больше не
принимается за JSON-массив (594);
целое число, записанное как0.0, эмитится как целое (595);
max_concurrency: "0"считается неустановленным и не даётfield_conflict
(597); пустые
поля контейнера v2rayN считаются отсутствующими ключами
(598). - Бэкап. «Replace all» заменяет только выбранные категории, а не весь
документ настроек (599);
флаги startup-prompt не репортятся как неизвестные ключи
(600);
замена бэкапа сохраняет зеркало тумблера VPN
(607). - Роутинг. Правило, чей rule set ещё не скачан, остаётся включённым
(601). - Подписки и свои серверы (задача 603).
Смена URL подписки сохраняет узлы и кэш до первого успешного обновления;
файловая подписка применяет import-правила к своему снапшоту, а вкладка
Source читает кэш; битый источник своего сервера не сохраняется; удаление
своего сервера спрашивает «Delete server?»; отрицательный
profile-update-intervalот сервера отклоняется; один запрос на URL за
проход. - DNS и сборка конфига (задача 604).
Правка SNI DNS-сервера сохраняет остальные поляtls; своё DNS-правило,
указывающее на отсутствующий сервер, отбрасывается с кодом; порт прокси
проверяется при загрузке из хранения и бэкапа; «config outdated»
срабатывает на каждую переменную шаблона;pool_toleranceDirection
клэмпится по пределу ядра 15000. - Сервис, автоматизация, профайлер (задача 605).
Ошибка старта получает своё уведомление; сбой ядра после принятого
SWITCH_NODEрепортитVPN_ERROR(switch_failed); команды автоматизации
ресинкаются с хранением при старте, после бэкапа и при смене workspace;
профайлер переподключается при каждом старте туннеля, START сбрасывает
снимки соединений (без ложногоtcpClose), баннер «DNS / router events
off» убран. - Список узлов, WARP, anti-DPI (задача 606).
«Copy link» на узле без ссылки сообщает об этом вместо тишины;
перетаскивание под фильтром сохраняет скрытые узлы на месте; свой
WARP-эндпоинт проверяется какhost:portдо регистрации; некорректная
пауза TLS-фрагментации заменяется на 500 мс. - Локализация и shell (задача 607).
Больше строк проходит через перевод (копирование узла, тема, About, Add
tile, итог восстановления); локаль ядра следует сохранённому языку
приложения с момента старта процесса; read-only редактор кода не предлагает
Cut/Paste.
🔧 Под капотом
- Контракт 1.1.108 (только тексты реестра);
sync_contract --toпишет в lock
полный commit sha. - Мёртвый код, найденный аудитом 591, удалён (задача 593);
поведение для пользователя не изменилось.
Install / Установка
adb install -r LxBox-v2.25.10-arm64-v8a.apkБез uninstall! Поверх существующей установки. Настройки и подписки сохранятся.
No uninstall needed — install over the existing one. Settings and subscriptions
are preserved.
Previous release / Предыдущий релиз: v2.25.9.