fix(sni): синхронизация профилей без routes и пересборка списка SNI по замеру 03.09.2026 - #20
Open
Inhibit0r wants to merge 1 commit into
Open
fix(sni): синхронизация профилей без routes и пересборка списка SNI по замеру 03.09.2026#20Inhibit0r wants to merge 1 commit into
Inhibit0r wants to merge 1 commit into
Conversation
Три независимые правки, все по SNI.
1) update_all_profiles_on_port и update_all_profiles_port_reference падали на
профилях без поля routes. Левая часть |= обязана быть путевым выражением, а
`(.routes // []) |=` им не является: jq выдаёт "Invalid path expression with
result []", safe_jq_write глушит stderr — и легаси-профиль (один маршрут,
.port/.sni в корне) молча оставался со старым SNI или портом. Заменено на
`if has("routes") then .routes |= ... else . end`. Регрессия закрыта
validation/test-legacy-profile-port-sync.sh: на непатченном main тест падает
("Ошибка jq — файл НЕ изменён"), с патчем проходит.
2) sni_list.txt пересобран по замеру 03.09.2026, MegaFon (Москва),
TLS-рукопожатие к 85.215.189.108. Прежняя шапка утверждала «РКН их не
блокирует — использовать в первую очередь» про крупный РФ e-commerce и банки;
замер показал обратное — маскировка под них самая палевная.
Не проходят: www.ozon.ru, www.wildberries.ru, www.tinkoff.ru,
cdn.jsdelivr.net. Первые три понижены до приоритета 4 и перекатегоризованы в
fallback; крупный РФ e-commerce и банки того же класса (ozon/wb-поддомены,
sberbank, alfabank, nspk, uralsib, vtb, avito) тоже уехали в 4.
Проходят и подняты в приоритет 1: api-maps.yandex.ru, yandex.ru,
www.samsung.com, dl.google.com, swcdn.apple.com, gateway.icloud.com,
www.cloudflare.com, www.lovelive-anime.jp. Первая строка файла = SNI по
умолчанию для новых профилей, теперь это api-maps.yandex.ru.
www.microsoft.com рукопожатие проходит, но деградировал по долям трафика на
MegaFon: 11 соединений против 236 у www.samsung.com при сопоставимом объёме —
оставлен в приоритете 3 с пометкой.
mail.ru (только TLS 1.2 при требуемом Reality TLS 1.3) и cdn-telegram.org
(не резолвится) как dest не годятся и не добавлены.
В шапке файла теперь дата замера и предупреждение: фильтрация различается по
оператору, региону и дню, перед применением перепроверять (probe test).
Ни один домен из списка не удалён, добавлены только имена из замера.
3) Жёстко зашитый SNI у маршрута tcp-xudp: в текущем main уже исправлен
(d9a4462), _append_route_json "tcp-xudp" получает $xudp_sni из
_default_sni_for_transport, литерала там нет. Живой остаток той же проблемы —
аварийный дефолт from_list="www.ozon.ru" в _default_sni_for_transport,
срабатывающий при пустом или недоступном sni_list.txt: он выдавал новым
профилям заблокированный SNI. Заменён на api-maps.yandex.ru, прошедший
тот же замер.
Сопутствующее, без чего правка 2 неполна:
- install.sh: аварийный список SNI (пишется, когда curl не смог скачать
sni_list.txt) начинался с www.ozon.ru — заменён на верх нового списка.
- _migrate_sni_list_2026: строки to_add сверены с новым sni_list.txt, иначе
grep -Fxq считал бы список устаревшим и переписывал файл с лишним рестартом
Xray.
- change_sni_menu: добавлены описания доменов нового приоритета 1; у трёх
провалившихся замер описания «макс. устойчивость» и «стабильный вариант»
заменены на факт замера.
Проверено: bash -n для xrayebator, install.sh, update.sh, uninstall.sh — чисто.
validation/test-*.sh на macOS (bash 3.2) падают тремя тестами
(test-bbr-removal-migration, test-cascade-upstream-import — declare -A,
test-main-menu-numbering — mapfile); тот же список падает на чистом origin/main,
это не следствие правок.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что здесь
Три независимые правки вокруг SNI, одним коммитом.
1. Баг jq: смена SNI молча не доезжала до легаси-профилей
update_all_profiles_on_port()обновляла профили выражением:Левая часть
|=обязана быть путевым выражением, а(.routes // [])им не является. На профиле, у которого поляroutesнет вовсе (легаси: один маршрут,.port/.sniв корне), jq падает:safe_jq_writeглушит stderr (2>/dev/null), так что причина не видна, файл не меняется, и профиль остаётся со старым SNI, пока inbound уже переехал на новый. Клиент после этого не подключается.Заменено на:
Тот же паттерн нашёлся в
update_all_profiles_port_reference()— он ломал перенос порта на ровно тех же профилях. Починены оба места, иначе правка закрывает половину дырки.Проверка, jq 1.7.1:
routesroutesInvalid path expression with result [], exit 5Регрессия закреплена:
validation/test-legacy-profile-port-sync.sh— на непатченномmainпадает (✗ Ошибка jq — файл НЕ изменён), с патчем проходит.2. Жёстко зашитый SNI у
tcp-xudp— уже исправлен вmainЛитерал
"api-maps.yandex.ru"в вызове_append_route_jsonдля меткиtcp-xudpв текущемorigin/mainотсутствует: коммитd9a4462переписал его на$xudp_sni, а пункт меню вызываетcreate_profileс пустым SNI, то есть тоже уходит в_default_sni_for_transport. Ничего изобретать не стал.Для протокола, почему уместна именно
$xudp_sni, а не соседки:xudp_sni = _default_sni_for_transport "tcp-xudp"— уважает self-steal домен (_selfsteal_domain_value), а без него отдаёт закреплённый за XUDPapi-maps.yandex.ru;default_sniберётся для транспортаtcp, то есть первую строкуsni_list.txt— сегодня она совпадает, но развалится при следующей перестановке списка;grpc_sniжёсткоwww.cloudflare.comради стабильного HTTP/2 — к XUDP отношения не имеет.Зато живой остаток той же болезни в
mainнашёлся и починен: аварийный дефолт в_default_sni_for_transportсрабатывает, когда
sni_list.txtпуст или недоступен, и выдавал новым профилям измеренно заблокированный SNI. Теперьapi-maps.yandex.ru.3.
sni_list.txt: список был не просто устаревшим, а вреднымШапка утверждала «БЕЛЫЙ СПИСОК РФ — РКН их не блокирует, использовать В ПЕРВУЮ ОЧЕРЕДЬ» и ставила в приоритет 1 крупный РФ e-commerce и банки. Замер показал обратное: маскировка именно под них самая палевная.
Замер 03.09.2026, MegaFon (Москва), TLS-рукопожатие к
тестовый VPS:www.ozon.ru,www.wildberries.ru,www.tinkoff.ru,cdn.jsdelivr.netwww.cloudflare.com,api-maps.yandex.ru,www.microsoft.com,www.samsung.com,swcdn.apple.com,dl.google.com,gateway.icloud.com,yandex.ru,www.lovelive-anime.jpwww.microsoft.comрукопожатие проходит, но по долям трафика на MegaFon деградировал: 11 соединений против 236 уwww.samsung.comпри сопоставимом общем объёме → как маскировка почти бесполезен, оставлен в приоритете 3 с пометкой.mail.ru(только TLS 1.2, Reality требует 1.3) иcdn-telegram.org(не резолвится). Оба факта записаны в шапку файла.Что сделано:
api-maps.yandex.ru,yandex.ru,www.samsung.com,dl.google.com,swcdn.apple.com,gateway.icloud.com,www.cloudflare.com,www.lovelive-anime.jp;www.microsoft.com;fallback), остальной крупный РФ e-commerce и банки того же класса, прежний fallback;probe testилиopenssl s_client -servername).Формат
домен|категория|приоритети четыре категории сохранены, структура файла тоже. Ни один домен не удалён, добавлены только 7 имён из замера. Порядок здесь не косметика: первая незакомментированная строка — это SNI по умолчанию для новых профилей (_default_sni_for_transport), а первые 20 строк — меню выбора SNI.Сопутствующее — без него правка 3 неполна
install.sh— аварийный embedded-список SNI (пишется, когдаcurlне смог скачатьsni_list.txt) начинался сwww.ozon.ru. Это вторая копия тех же вредных данных: починить толькоsni_list.txtзначило оставить установку при сетевом сбое на заблокированном SNI. Заменён на верх нового списка._migrate_sni_list_2026— сверяет строки с shipped-файлом черезgrep -Fxqпо полной строке. После смены приоритетов совпадение бы пропало, и миграция на каждом сервере без маркера впустую переписывала бы файл и дёргалаsafe_restart_xray. Приоритеты в массиве приведены к новому файлу; проверено, что все 6 строк снова находятся. Заодно проверено, чтоswcdn.apple.com/gateway.icloud.comне попадают под удаление apple/icloud в этой миграции (условие требует членства вKNOWN_DEFAULTS_v1, где их нет).change_sni_menu— у трёх провалившихся замер доменов описания «макс. устойчивость для мобильных» и «стабильный вариант» стали прямой дезинформацией, заменены на факт замера; добавлены описания для доменов нового приоритета 1, иначе верх меню рендерился бы как «Дополнительный вариант». Убран дубль ключаsni_desc["api-maps.yandex.ru"].Проверки
validation/test-*.shна macOS, bash 3.2.57:origin/main)test-bbr-removal-migration.shtest-cascade-upstream-import.shdeclare -Atest-main-menu-numbering.shmapfiletest-legacy-profile-port-sync.shСписок падающих совпадает с baseline — это ограничения bash 3.2 на macOS (
declare -A,mapfile), а не следствие правок. На Linux с bash 5 они не воспроизводятся.Целостность
sni_list.txt: строк не по формату — 0, потерянных доменов — 0, дубликатов — 0, всего 51 запись.Не проверено: сами замеры ТСПУ не воспроизводились в этом PR — порядок доменов взят из полевых данных 03.09.2026 как есть. Прогона create/delete профиля на живом сервере тоже не было, только
bash -nи validation-набор.🤖 Generated with Claude Code