feat(tls): add a dynamic DoH helper for echConfigList, with CDN guidance (#6869)

echConfigList already accepted Xray's dynamic form, target domain + DoH URL,
but nothing in the inbound or host forms explained or built it. A helper now
builds that value from presets or a custom domain and resolver, accepts only the
schemes Xray dials (https, h2c, udp; scheme case normalised), warns that a key
generated locally does not work behind a CDN, and asks before overwriting local
ECH keys. The helper's controls carry accessible labels, and the resolver list
holds only identified public resolvers.
This commit is contained in:
55575455
2026-10-24 12:07:11 +08:00
committed by GitHub
parent 41bafb3fd5
commit f43645656c
21 changed files with 1380 additions and 53 deletions
+30 -2
View File
@@ -477,6 +477,36 @@
"autoFill": "Автозаполнение",
"echSockopt": "ECH Sockopt",
"echSockoptTip": "Параметры сокета для соединения, через которое Xray получает список конфигураций ECH (например, можно направить запрос через исходящее dialerProxy). Оставьте отключённым для значений по умолчанию.",
"echCdnWarningTitle": "Локально созданные ключи ECH работают только при прямом подключении",
"echCdnWarningBody": "Пара ключей, созданная кнопкой «Get New ECH Cert», действительна только когда клиенты подключаются напрямую к этому VPS. Если inbound проксируется через Cloudflare CDN (VLESS + xhttp/WS за оранжевым облаком), Cloudflare завершает внешний TLS своими ключами ECH и ротирует их, поэтому локальный ключ всегда проваливает рукопожатие. Вместо него используйте помощник динамического ECH.",
"echDynamicTitle": "Динамический ECH через Cloudflare (работает за оранжевым облаком)",
"echPresetLabel": "Готовая комбинация",
"echPresetOtherDomains": "Другие целевые домены ECH",
"echPresetAdvanced": "Своя комбинация…",
"echDynamicIntro": "Заполняет список конфигураций ECH динамическим запросом на стороне клиента (целевой домен + DoH-резолвер). Клиент при каждом подключении запрашивает у резолвера HTTPS-запись домена, поэтому всегда видит актуальные ключи ECH — включая ротированные ключи Cloudflare.",
"echDynamicDomain": "Целевой домен ECH",
"echDynamicDoh": "DoH-резолвер",
"echDomainAuto": "Автоматически — разрешить запись ECH для SNI узла",
"echDynamicApply": "Применить к списку конфигураций ECH",
"echDynamicCustom": "Свой URL…",
"echDynamicInvalid": "Введите корректный домен и URL резолвера (https, h2c или udp), чтобы собрать значение.",
"echDynamicUnsupportedScheme": "Xray разрешает конфигурацию ECH только через https://, h2c:// или udp://. Этот адрес никогда не ответит.",
"echDynamicPlaceholder": "cloudflare-ech.com+https://dns.alidns.com/dns-query",
"echDynamicOverwriteTitle": "У этого inbound есть локально созданная пара ключей ECH",
"echDynamicOverwriteBody": "За CDN эта пара ключей не используется: TLS-рукопожатие завершает CDN. Применение динамического значения заменит список конфигураций ECH и удалит локальный ключ ECH.",
"echDynamicOverwriteConfirm": "Заменить и удалить локальный ключ",
"echExistingNotDynamic": "Этот список конфигураций ECH не в динамической форме; при заполнении он заменит то, что вы задали вручную.",
"echDohGroup": {
"china": "Материковый Китай (доступен из-за GFW)",
"global": "Весь мир",
"europe": "Европа",
"udp": "Обычный DNS (udp://)"
},
"echRecommended": "рекомендуется",
"echMainlandAdvisory": "Резолверам материкового Китая нужен целевой домен, в HTTPS-записи которого есть ECH; проверьте пару перед сохранением.",
"echConfigList": "Список конфигураций ECH",
"echConfigListHint": "Передаётся клиентам в ссылках для обмена и подписках. Принимает локальный ECHConfigList (из кнопки ниже) или динамическую форму домен+URL DoH.",
"echKeyHint": "Только для прямых подключений — оставьте пустым, если inbound находится за CDN.",
"curvePreferences": "Предпочтения кривых",
"curvePreferencesTip": "Ограничьте кривые обмена ключами TLS, которые предлагает сервер, в порядке предпочтения (например, X25519MLKEM768, X25519). Оставьте пустым для значений по умолчанию Xray-core.",
"masterKeyLog": "Лог мастер-ключей",
@@ -634,7 +664,6 @@
"usageOption": "Опция использования",
"buildChain": "Build Chain",
"echKey": "ECH key",
"echConfig": "ECH config",
"pinnedPeerCertSha256": "SHA-256 сертификата пира",
"pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в виде шестнадцатеричной строки (напр. e8e2d3…), через запятую. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.",
"pinnedPeerCertSha256Placeholder": "шестнадцатеричный хеш(и), через запятую",
@@ -2361,7 +2390,6 @@
"pins": "Закреплённый SHA-256 сертификата",
"verifyPeerCertByName": "Проверять сертификат пира по имени",
"allowInsecure": "Разрешить небезопасное",
"echConfigList": "Список конфигураций ECH",
"muxParams": "Mux",
"sockoptParams": "Sockopt",
"finalMask": "Final Mask",