L×Box v2.25.14
A patch on top of v2.25.13.
Part of it went to Open testing as v2.25.14-rc.1.
TLS fragmentation and mixed-case SNI can be set per server, folder and
subscription, and the setting travels in the backup. A Transfer to desktop
file without rules no longer wipes the rules, and the import screen says
what happens to them. Quit & reopen app stops the VPN for good. In an
imported sing-box config a node with a broken detour chain is dropped
instead of connecting directly; Hysteria v1 is rejected with a hint. A new
switch on the DNS screen keeps node hostnames from being served stale
answers. The URL test gets two YouTube addresses. Core v1.14.3-lx.18,
contract 1.1.119.
Патч поверх v2.25.13.
Часть изменений выходила в Open testing как v2.25.14-rc.1.
Фрагментацию TLS и mixed-case SNI можно задать для сервера, папки и
подписки, настройка едет в бэкапе. Файл Transfer to desktop без правил больше
не стирает правила, а экран импорта говорит, что с ними будет. Quit & reopen
app останавливает VPN окончательно. В импортированном конфиге sing-box узел с
битой цепочкой detour отбрасывается, а не идёт напрямую; Hysteria v1
отклоняется с подсказкой. Новый переключатель на экране DNS не даёт
отвечать на имена узлов устаревшим ответом из кэша. В URL-тесте два адреса
YouTube. Ядро v1.14.3-lx.18, контракт 1.1.119.
🇬🇧 English
⚠️ Read before updating
- A MASQUE node written by hand with the
networkkey stops loading.
The core removed the oldnetworkkey of themasqueoutbound: it
duplicatedvhttp(h3/h2) under a name that means the tcp/udp list on every
other outbound. The app has always writtenvhttpand nodes from links and
subscriptions are not affected. If you pasted a sing-box body with
"network": "h3"yourself, the core rejects it at start and the app
disables the node: rename the key tovhttp, the values are the same. - An imported sing-box node with a broken
detourchain no longer connects.
Before, such a node silently went direct. Now it is dropped and listed among
the subscription's dropped entries with the reason. Check that list if a
node from a sing-box config is missing.
✨ Added
- TLS options per server, folder and subscription (task 636).
The four TLS Fragmentation options (TLS Fragment, TLS Record Fragment,
Fallback delay, Mixed-case SNI) get a TLS section on a server's
Settings tab and on a subscription's or folder's settings tab.- Each option resolves server → subscription/folder → global. Default
inherits; Off on a lower level beats On above it. - A checkbox set on a REALITY server itself fragments it; the folder,
subscription and global levels still skip REALITY. - Ping and the node test use the same levels.
- A server's own TLS settings move with it on Ungroup and when it is moved
into a folder. - The per-server and per-source settings travel in the Transfer to desktop
file (contract 1.1.117). On merge the device keeps its own. - Debug API returns the
tlsfield of a source and a folder member and
accepts a partial PATCH.
- Each option resolves server → subscription/folder → global. Default
- uTLS fingerprint
chrome_155(task 642).
The Chrome 155 preset of the core is accepted in links and JSON and counts
as a hybrid fingerprint under REALITY. - YouTube addresses in the URL test.
Ping Settings and the Test URL of the auto group offer two more presets:
YouTube (https://www.youtube.com/generate_204) and YouTube (ytimg)
(https://i.ytimg.com/generate_204). - DNS: Never serve stale answers for node hostnames (task 643).
A new switch on the DNS screen under Default domain resolver, on by default.- The default resolver looks a node's hostname up again once the cached
answer expires, so a node whose provider changed its address does not
stay on the old one. - App DNS queries are not affected: they follow DNS rules and Serve stale
answers. - The setting travels in LX Backup as
dns_resolver_no_stale. - In the generated config
route.default_domain_resolveris now an object
{"server": …, "disable_optimistic_cache": …}instead of a string.
Scripts that read the config should expect both forms.
- The default resolver looks a node's hostname up again once the cached
🔄 Changed
- A node with a broken
detourchain is dropped instead of connecting directly (task 642).
Contract 1.1.118: in an imported sing-box config, a node whosedetour
points to a missing tag, to a hop that did not become a node or to a group
is not created, and every node of adetourloop is dropped. Each one is
listed among the subscription's dropped entries with its tag and the
reason.detour: directand the 8-hop limit work as before. - Hysteria v1 is rejected with a hint (task 642).
Ahysteria:///hy://link, a sing-boxtype: hysteriaentry and an
Xrayhysteriaelement of version 1 are reported as an unsupported protocol
with the hint to use hysteria2, instead of disappearing silently or as an
unknown protocol. - TLS fragmentation skips QUIC nodes (task 642).
Hysteria, Hysteria2 and TUIC nodes no longer get the TLS Fragment / Record
Fragment flags from any level: QUIC is not fragmented. - MASQUE
networkis no longer an old name ofvhttp(task 642).
A link withnetwork=h2gets the default h3 and the parameter is reported
as unknown; the key is reserved for the tcp/udp list (contract 1.1.118). - MASQUE recommended SNI is
www.cloudflare.com(task 638).
Withconsumer-masque.cloudflareclient.comh3 does not come up on Russian
networks. The old domain stays in the SNI pool for scanning.
🩹 Fixed
- A Transfer to desktop file without rules no longer wipes the rules (task 640).
Contract 1.1.116: a file without theruleskey (one server, a folder, a
Direction) leaves the current rules as they were. A file with the key, even
an empty one, replaces them as before, and the preview names how many rules
are removed. Export always writes the key. - The Transfer to desktop import screen tells the truth about rules (task 641).
The preview ends with "This file has no rules. The current rules stay.",
"Importing adds the file's rules." or "Importing replaces the current N
rule(s)." The result no longer counts replaced rules as "not applied" and
says "replaced N rule(s)". - Quit & reopen app no longer brings the VPN back (task 638).
Quit killed the process but kept the "VPN wanted" flag and the watchdog
alarm, so 2–3 minutes later the watchdog started the VPN again. Quit now
clears both. - Quit & reopen app leaves no VPN notification (task 639).
The service died together with the process, and its notification stayed in
the shade showing a VPN that was not running. Quit now stops the service the
same way as Stop (waiting up to 3 s), then closes the app. - The start error notification goes away after a successful start (task 637).
When the core rejected a node, the app disabled the node and started again;
the start succeeded, but "Error" stayed next to the VPN notification. It is
now removed when the service starts and when you start the VPN again. A new
failure shows a new one. - The chain delete dialog tells what happens (task 638).
It said other chains would stop building. In fact the node is removed from
them and they are rebuilt shorter. New text: "Chains using this node will be
rebuilt without it." - Intent API
VPN_ERROR(tunnel_error)hides server addresses (task 638).
The core's error text (dial tcp <ip>:<port>: …) reached every subscriber
of the broadcast. IPv4, IPv6 and host names in it are now replaced with
***; the port and the rest of the text stay. Other error codes are
unchanged.
📚 Documentation
- The spec audit is closed (task 591):
about 85 feature spec files now describe the app as it behaves.
🔧 Under the hood
- Core
v1.14.3-lx.15→v1.14.3-lx.18(docs/KERNEL.md).
lx.18 removes the legacynetworkkey of themasqueoutbound (see "Read
before updating"). lx.16 and lx.17 change only the Linux router daemon and
the Windows 7 build; nothing of them is in the Android library. The Java
surface is identical to lx.15. - Launcher contract 1.1.115 → 1.1.119. 1.1.116: the
ruleskey of the
backup file is optional on import. 1.1.117: thetlsfield of a server and a
source in the backup. 1.1.118:detourerrors drop the node, Hysteria v1 is
an unsupported protocol with an alternative,chrome_155, MASQUEnetwork
is not an alias ofvhttp. 1.1.119: node loops in the template (next item)
and the object form ofdefault_domain_resolver. - Contract 1.1.119: node loops in the template (task 643).
for_eachis gone. A preset walks nodes withfor_each_node(one body per
node) orfor_each_node_do(collect values with#do/#appendand
#final, one body after the walk). The filter is#filterin the#if
condition language; the node name is fixed as@node. Variable
declarations get the fieldsuniqueandwizard_ui: "internal". The
Tailscale preset is rewritten on the new key; its output is byte-for-byte
unchanged. - New tests: return to the home screen, the config mtime flag, the rule-set
auto-update schedule, LX backup import into a fresh state, the update check;
TLS codec, backup slice and merge, probe by levels; address masking in
VPN_ERROR; theruleskey table; QUIC nodes without fragmentation.
🇷🇺 Русский
⚠️ Прочтите до обновления
- Узел MASQUE, вписанный руками с ключом
network, перестаёт загружаться.
Ядро убрало старый ключnetworkу outboundmasque: он дублировалvhttp
(h3/h2) под именем, которое у всех остальных outbound означает список
tcp/udp. Приложение всегда писалоvhttp, узлы из ссылок и подписок это не
затрагивает. Если вы сами вставили тело sing-box с"network": "h3", ядро
отвергнет его на старте, и приложение отключит узел: переименуйте ключ в
vhttp, значения те же. - Импортированный узел sing-box с битой цепочкой
detourбольше не подключается.
Раньше такой узел молча шёл напрямую. Теперь он отбрасывается и попадает в
отброшенные записи подписки с причиной. Если узла из конфига sing-box не
видно, проверьте этот список.
✨ Добавлено
- Настройки TLS на сервере, папке и подписке (задача 636).
Четыре опции TLS Fragmentation (TLS Fragment, TLS Record Fragment,
Fallback delay, Mixed-case SNI) получили секцию TLS на вкладке Settings
сервера и на вкладке настроек подписки или папки.- Каждая опция решается в порядке сервер → подписка/папка → глобально.
Default наследует; Off на нижнем уровне бьёт On на верхнем. - Галка на самом сервере REALITY его фрагментирует; уровни папки,
подписки и глобальный REALITY по-прежнему пропускают. - Пинг и тест узла учитывают те же уровни.
- Свои настройки TLS сервера переезжают с ним при Ungroup и при переносе
в папку. - Настройки сервера и источника едут в файле Transfer to desktop
(контракт 1.1.117). При слиянии на устройстве остаются свои. - Debug API отдаёт поле
tlsисточника и члена папки и принимает
частичный PATCH.
- Каждая опция решается в порядке сервер → подписка/папка → глобально.
- Отпечаток uTLS
chrome_155(задача 642).
Пресет Chrome 155 ядра принимается в ссылках и JSON и под REALITY считается
гибридным. - Адреса YouTube в URL-тесте.
В Ping Settings и в Test URL авто-группы два новых пресета: YouTube
(https://www.youtube.com/generate_204) и YouTube (ytimg)
(https://i.ytimg.com/generate_204). - DNS: Never serve stale answers for node hostnames (задача 643).
Новый переключатель на экране DNS под Default domain resolver, включён по
умолчанию.- Резолвер по умолчанию запрашивает имя хоста узла заново, когда ответ в
кэше истёк, и узел, у которого провайдер сменил адрес, не остаётся на
старом. - DNS-запросы приложений не затронуты: для них действуют правила DNS и
Serve stale answers. - Настройка едет в LX Backup как
dns_resolver_no_stale. - В собранном конфиге
route.default_domain_resolverтеперь объект
{"server": …, "disable_optimistic_cache": …}, а не строка. Скриптам,
которые читают конфиг, нужно ожидать обе формы.
- Резолвер по умолчанию запрашивает имя хоста узла заново, когда ответ в
🔄 Изменено
- Узел с битой цепочкой
detourотбрасывается, а не идёт напрямую (задача 642).
Контракт 1.1.118: в импортированном конфиге sing-box узел, чейdetour
ведёт на несуществующий тег, на хоп, не ставший узлом, или на группу, не
создаётся, а кольцоdetourроняет всех участников. Каждый попадает в
отброшенные записи подписки со своим тегом и причиной.detour: directи
предел в 8 звеньев — как прежде. - Hysteria v1 отклоняется с подсказкой (задача 642).
Ссылкаhysteria:///hy://, запись sing-boxtype: hysteriaи элемент
Xrayhysteriaверсии 1 помечаются как неподдерживаемый протокол с
подсказкой «используйте hysteria2», а не пропадают молча или как
неизвестный протокол. - Фрагментация TLS пропускает QUIC-узлы (задача 642).
Узлы Hysteria, Hysteria2 и TUIC больше не получают флаги TLS Fragment /
Record Fragment ни с одного уровня: QUIC не фрагментируется. networkу MASQUE — больше не старое имяvhttp(задача 642).
Ссылка сnetwork=h2получает дефолт h3, параметр помечается неизвестным;
ключ зарезервирован под список tcp/udp (контракт 1.1.118).- Рекомендованный SNI для MASQUE —
www.cloudflare.com(задача 638).
Сconsumer-masque.cloudflareclient.comh3 в российских сетях не
поднимается. Прежний домен остался в пуле SNI для перебора.
🩹 Исправлено
- Файл Transfer to desktop без правил больше не стирает правила (задача 640).
Контракт 1.1.116: файл без ключаrules(один сервер, папка, Направление)
оставляет текущие правила как были. Файл с ключом, даже пустым, замещает
их, как и раньше, а превью называет, сколько правил будет снято. Экспорт
пишет ключ всегда. - Экран импорта Transfer to desktop говорит правду о правилах (задача 641).
Превью заканчивается фразой «This file has no rules. The current rules
stay.», «Importing adds the file's rules.» или «Importing replaces the
current N rule(s).». Итог больше не считает заменённые правила
«не применёнными» и пишет «replaced N rule(s)». - Quit & reopen app больше не поднимает VPN обратно (задача 638).
Quit убивал процесс, но оставлял признак «VPN желателен» и будильник
сторожа, и через 2–3 минуты сторож запускал VPN снова. Теперь Quit снимает
оба. - Quit & reopen app не оставляет уведомление VPN (задача 639).
Служба умирала вместе с процессом, а её уведомление оставалось в шторке и
показывало VPN, которого нет. Теперь Quit останавливает службу так же, как
Stop (ждёт до 3 с), и затем закрывает приложение. - Уведомление об ошибке старта снимается после успешного старта (задача 637).
Когда ядро отвергало узел, приложение отключало его и стартовало снова;
старт удавался, но «Error» висел рядом с уведомлением VPN. Теперь оно
снимается, когда служба запустилась и когда вы запускаете VPN заново. Новая
неудача показывает новое. - Диалог удаления цепочки говорит, что будет (задача 638).
Он утверждал, что другие цепочки перестанут собираться. На деле узел
убирается из них, и они пересобираются короче. Новый текст: «Chains using
this node will be rebuilt without it.» VPN_ERROR(tunnel_error)в Intent API скрывает адреса серверов (задача 638).
Текст ошибки ядра (dial tcp <ip>:<port>: …) доходил до каждого
подписчика broadcast. IPv4, IPv6 и имена хостов в нём теперь заменены на
***; порт и остальной текст остаются. Другие коды ошибок не тронуты.
📚 Документация
- Аудит спек закрыт (задача 591):
около 85 файлов спек фич приведены к тому, как приложение работает.
🔧 Под капотом
- Ядро
v1.14.3-lx.15→v1.14.3-lx.18(docs/KERNEL.md).
lx.18 снимает устаревший ключnetworkу outboundmasque(см. «Прочтите
до обновления»). lx.16 и lx.17 меняют только Linux-демон для роутеров и
сборку для Windows 7; в Android-библиотеке их нет. Java-поверхность
идентична lx.15. - Контракт лаунчера 1.1.115 → 1.1.119. 1.1.116: ключ
rulesфайла
бэкапа необязателен при импорте. 1.1.117: полеtlsсервера и источника в
бэкапе. 1.1.118: ошибкиdetourроняют узел, Hysteria v1 — неподдерживаемый
протокол с альтернативой,chrome_155,networkу MASQUE — не алиас
vhttp. 1.1.119: обход узлов в шаблоне (следующий пункт) и объектная форма
default_domain_resolver. - Контракт 1.1.119: обход узлов в шаблоне (задача 643).
for_eachснят. Пресет обходит узлы ключомfor_each_node(тело на каждый
узел) илиfor_each_node_do(сбор значений через#do/#appendи
#final, одно тело после обхода). Отбор —#filterна языке условий
#if; имя узла фиксировано:@node. У объявления переменной появились
поляuniqueиwizard_ui: "internal". Пресет Tailscale переписан на
новый ключ; его вывод не изменился ни на байт. - Новые тесты: возврат на главный, mtime-флаг конфига, расписание
автообновления наборов, импорт бэкапа LX в чистое состояние, проверка
обновлений; кодек TLS, срез и слияние бэкапа, проба по уровням; маска
адресов вVPN_ERROR; таблица ключаrules; QUIC-узлы без фрагментации.
Install / Установка
adb install -r LxBox-v2.25.14-arm64-v8a.apkБез uninstall! Поверх существующей установки. Настройки и подписки сохранятся.
No uninstall needed — install over the existing one. Settings and subscriptions
are preserved.
Previous release / Предыдущий релиз: v2.25.13.