LxBox v2.25.3 发布

已发布 v2.25.3,以下为官方变更日志。

官方变更日志

L×Box v2.25.3

A patch on top of v2.25.2.
The main body of changes is in
v2.25.0 — one parsing
engine shared with
singbox-launcher 2.0.0,
and the Start insurance when the core refuses a server. Read those first;
this patch does not repeat them.

This patch is mostly about the core and about connecting. Diagnostics on a
NaiveProxy server no longer closes the app. A WireGuard or AmneziaWG server whose
address is a name rather than an IP connects in about a second instead of five.
A tunnel built from several such servers is no longer switched off by its own
safety net fifteen seconds in. And the Servers screen finally keeps one list:
servers, subscriptions, folders and chains are entries of one kind, in one order.

Патч поверх v2.25.2.
Основной корпус изменений — в
v2.25.0: один движок
разбора с
лаунчером 2.0.0
и страховка кнопки Start, когда ядро отказывается от сервера. Сначала
читайте их — этот патч их не повторяет.

Этот патч в основном про ядро и про подключение. Диагностика узла NaiveProxy
больше не закрывает приложение. Сервер WireGuard или AmneziaWG, чей адрес задан
именем, а не IP, соединяется примерно за секунду вместо пяти. Туннель из
нескольких таких серверов больше не гасится собственной страховкой через
пятнадцать секунд. А экран Servers наконец держит один список: серверы,
подписки, папки и цепочки — записи одного рода, в одном порядке.

🇬🇧 English

🩹 Fixes

The core — v1.14.1-lx.10

  • Diagnostics on a NaiveProxy server no longer closes the app. With the

tunnel up, opening Diagnostics on a naive server shut the app down on the
spot: the core read the connection's address, which a connection of that kind
does not have. Diagnostics now returns status, response and timing for such a
server like any other, and the address field stays empty — which is how it
should be. Traffic through those servers and the latency check were never
affected.

  • WireGuard and AmneziaWG servers addressed by name connect in a second

instead of five. When the server address is a domain rather than an IP, the
first handshake used to be lost and the connection took an extra five seconds.
It now goes through on the first attempt.

  • XHTTP connections are no longer marked as failed when you switch servers.

When you changed server, or the core closed an XHTTP connection it no longer
needed, it took its own closure for a break from the server's side: a line
about a closed response body landed in the log on every request, and a
perfectly good XMUX session was marked unusable and rebuilt from scratch. A
local cancellation is now recognised for what it is — the log of a working
XHTTP server is clean, and switching servers costs no extra session rebuild. A
real break on the server's side is still reported as before
(#148).

  • Synced with upstream sing-box — fixes around DNS, IPv6 and shutdown.

The config schema, the set of fields and the behaviour of other servers did not
change.

Connecting

  • A VPN built from several WireGuard/AmneziaWG servers no longer switches

itself off after 15 seconds. The core brings such servers up one at a time,
7–9 seconds each, while the safety net against a stuck start waited a fixed 15
seconds for any configuration. On four servers or more it managed to kill a
connection that was already established: the handshake had happened, the
tunnel was up — and immediately put out. No reason was visible either; from the
outside it looked like "I pressed Connect and nothing happened". The allowance
now grows with the number of such servers, and if the safety net does fire it
names the reason and the threshold instead of switching off in silence. For
configurations without WireGuard servers the threshold is unchanged.

Servers screen

  • One list of entries of every kind. Servers, subscriptions, folders and

chains are now a single ordered list rather than three different mechanisms:
the screen used to assemble the list from three separate places on every
frame, and one drag wrote the settings twice. Deleting and dragging are now one
entry, one record.

  • Chains travel with servers in a backup. In the export a chain used to be

ticked under Routing — together with routing rules rather than with the
servers it stands next to in the list. It now goes under "Server lists". Older
archives where chains were exported as Routing still read as before; restore
those with the Routing tick.

  • The Debug API sees every kind. GET /subs now returns the same list you

see on screen, chains included.

The settings file, the backup format and the settings themselves did not change;
servers, routes and list order stay as they were.

Config editor

  • The Cut/Copy/Paste menu no longer piles up or hangs around after you clear

the selection. Several menus could end up on screen at once — two or three
stacked, the last one clipped by the screen edge — and tapping an empty spot to
clear the selection did not dismiss them. The editor was rebuilding the menu's
controlling object on every repaint of the screen, leaving an already-shown
menu with no owner and nobody to close it. The editor now keeps one such object
for the lifetime of the screen, and the menu closes when the selection is
cleared, when you tap away, when you scroll, and when you leave the screen.
Tapping the menu's own buttons still does not drop the selection: what gets
copied is exactly what you selected.

DNS

  • DNS preset Shield: the Yandex server over DoT really takes part in the

group. It used to drop out silently — it was listed as a member, but the
server entry itself was missing from the template, so on every config build the
member disappeared with a warning and the "shield" polled five providers
instead of six. This was most visible to people behind a whitelist: Yandex
answers on such a network and the other members do not, so resolution did not
work at all. The server is now declared: Yandex over DNS-over-TLS, direct,
outside the tunnel — so it works even when the tunnel is down, and queries
still go encrypted, with no leak into plain UDP. Existing configurations are
not migrated: the group's membership is taken from the template on the next
config build.

Stability

  • "Check all servers" no longer runs out of memory on lists with several

WireGuard/AmneziaWG servers. The check starts the core, and the core reserves
buffers in advance for every WireGuard server in the configuration rather than
only the one being measured: around 17 MB per server, so close to 200 MB on a
dozen. The check broke the memory limit and the app closed instead of showing
the latencies. Such servers are now checked four at a time: between batches the
core restarts and the buffers are released. Every server is still measured and
the list order does not change — the check simply takes a little longer. Lists
with no WireGuard servers work as before.

  • The diagnostic report on server problems no longer skips servers with

identical names. Providers often call every server the same thing — plainly
proxy, say — and one and the same server can arrive twice under different
protocols with a shared name. In the parsing problem report such servers
overlaid one another: only the last survived and the notes on the rest
vanished. There was no way to notice, because the server count shown next to
them was right: twelve servers, eight lines of notes. Namesake servers are now
told apart the same way they are in the server list, and no note is lost.

🔧 Under the hood

A corpus of real public subscriptions now guards the parser: snapshots of 68
public lists — about 74,000 servers as text, exactly as the sources hand them
over — plus the machinery to run parsing across them. Every change to the
protocol registry is checked against a reference: if the number of parsed servers
drops or the rejection codes change, it shows immediately and per subscription
rather than after a complaint. The run only reads text — not one server from the
corpus is connected to or checked for reachability, no config is built and the
core is never started. Contract 1.1.52 (unchanged). Core v1.14.1-lx.10.

🧪 Tests

The release gate is CI checks (analyze, the full test set, four l10n checkers,
docs parity). Added by this patch: the start threshold against the number of
WireGuard endpoints, namesake servers in the warnings report, the config editor
menu against duplicate overlays and every dismissal path, the single sources[]
list round-trip, the dns_shield preset membership, and probe batching on
WireGuard servers.

📚 Documentation

The trial methodology for the public-subscriptions corpus is written down, along
with the specs for this patch's changes. The Debug API reference records that
GET /subs returns every kind of entry.

🇷🇺 Русский

🩹 Исправления

Ядро — v1.14.1-lx.10

  • Диагностика узла NaiveProxy больше не закрывает приложение. При живом

туннеле Диагностика узла naive закрывала приложение сразу же: ядро читало
адрес соединения, которого у соединения этого типа нет. Теперь Диагностика
такого узла отдаёт статус, ответ и время, как у любого другого, а поле адреса
остаётся пустым — так и должно быть. Трафик через такие узлы и проверка
задержки не страдали и раньше.

  • Серверы WireGuard и AmneziaWG с адресом по имени подключаются за секунду

вместо пяти. Когда адрес сервера задан доменом, а не IP, первая попытка
рукопожатия терялась и подключение занимало лишние пять секунд. Теперь оно
проходит с первой попытки.

  • XHTTP-соединения больше не считаются сбойными при переключении серверов.

Когда вы меняли сервер или ядро само закрывало уже ненужное XHTTP-соединение,
оно принимало собственное закрытие за обрыв со стороны сервера: в лог на
каждый запрос падала строка о закрытом теле ответа, а рабочая XMUX-сессия
помечалась негодной и пересобиралась заново. Локальная отмена теперь
распознаётся и не считается сбоем — лог рабочего XHTTP-узла чистый, а
переключение сервера не обходится лишней пересборкой сессии. Настоящий обрыв
на стороне сервера сообщается как раньше
(#148).

  • Синк с апстримом sing-box — правки по DNS, IPv6 и завершению работы.

Схема конфига, набор полей и поведение остальных узлов не менялись.

Подключение

  • VPN из нескольких WireGuard/AmneziaWG-узлов больше не отключается сам через

15 секунд. Ядро поднимает такие узлы по одному, 7–9 секунд на каждый, а
страховка от зависшего старта ждала фиксированные 15 секунд на любой конфиг. На
четырёх и более узлах она успевала прибить уже установленное соединение:
рукопожатие состоялось, туннель поднят — и тут же погашен. Причины при этом
видно не было, снаружи это выглядело как «нажал Connect, ничего не
произошло». Теперь запас времени растёт вместе с числом таких узлов, а если
страховка всё же срабатывает — она называет причину и порог, вместо того чтобы
молча отключиться. Для конфигов без WireGuard-узлов порог прежний.

Экран Servers

  • Единый список записей всех родов. Серверы, подписки, папки и цепочки

теперь один упорядоченный список, а не три разных механизма: раньше экран
собирал список из трёх разных мест на каждый кадр, а одно перетаскивание
записывало настройки дважды. Удаление и перетаскивание — одна запись.

  • Цепочки в бэкапе едут вместе с серверами. В экспорте цепочка отмечалась

галкой Routing — вместе с правилами маршрутизации, а не вместе с серверами,
рядом с которыми она стоит в списке. Теперь она едет галкой «Server lists».
Старые архивы, где цепочки экспортировались как Routing, читаются
по-прежнему — восстанавливать их надо галкой Routing.

  • Debug API видит все рода. GET /subs теперь отдаёт тот же список, что

видит пользователь, включая цепочки.

Файл настроек, формат бэкапа и сами настройки не менялись; узлы, маршруты и
порядок списка остаются как были.

Редактор конфига

  • Меню Cut/Copy/Paste больше не размножается и не висит после снятия

выделения. На экране могло оказаться сразу несколько меню — два-три
экземпляра друг поверх друга, последний ещё и обрезанный краем экрана, — а
снятие выделения тапом по пустому месту их не убирало. Редактор заново создавал
управляющий объект меню при каждой перерисовке экрана, и уже пок…