feat(tls,reality): port xray TLS/REALITY fields, cert-hash helpers, fallback UX

TLS: add verifyPeerCertByName (vcn) to inbound settings + emit in both share-link generators (frontend + Go sub) and outbound parser; the allowInsecure replacement xray removed after 2026-06-01. Add server-side curvePreferences, masterKeyLog, echSockopt (passthrough + form) at tlsSettings top-level so they survive the panel-only settings strip.

REALITY: add limitFallbackUpload/Download (afterBytes/bytesPerSec/burstBytesPerSec) with per-field tooltips, plus masterKeyLog. Verified field names/semantics against pinned xray v1.260327.1 (bytesPerSec=0 disables).

Hosts: fix verify_peer_cert_by_name column bool->string (xray expects comma-separated names) with an idempotent, history-gate-free migration (SQLite typeof blank; Postgres ALTER once); emit vcn for hosts/external proxies.

Server: add getCertHash (local cert DER SHA-256) and getRemoteCertHash (xray tls ping) endpoints + api-docs; wire pinned-cert field buttons. Drop the meaningless random-hash button.

Xray UI: metrics endpoint (listen/tag) config in Basics; import/export for routing rules and outbounds.

Fallbacks card: compact empty state, header-aligned actions, responsive labeled grid rows.

i18n: add all new keys to every locale; drop unused generateRandomPin.
This commit is contained in:
MHSanaei
2026-06-21 15:51:50 +02:00
parent 315ecc2588
commit 7c8889466b
48 changed files with 1316 additions and 173 deletions
+29 -1
View File
@@ -463,6 +463,27 @@
"moreIssues": "{message} (+{count} ещё)"
},
"form": {
"echSockopt": "ECH Sockopt",
"echSockoptTip": "Параметры сокета для соединения, через которое Xray получает список конфигураций ECH (например, можно направить запрос через исходящее dialerProxy). Оставьте отключённым для значений по умолчанию.",
"curvePreferences": "Предпочтения кривых",
"curvePreferencesTip": "Ограничьте кривые обмена ключами TLS, которые предлагает сервер, в порядке предпочтения (например, X25519MLKEM768, X25519). Оставьте пустым для значений по умолчанию Xray-core.",
"masterKeyLog": "Лог мастер-ключей",
"masterKeyLogTip": "Путь для записи мастер-ключей TLS (формат SSLKEYLOGFILE) для отладки с помощью Wireshark. В рабочей среде оставляйте пустым — любой, у кого есть этот файл, сможет расшифровать трафик.",
"verifyPeerCertByName": "Проверять сертификат пира по имени",
"verifyPeerCertByNameTip": "Указывает клиентам проверять сертификат сервера по этому имени вместо SNI. Имена через запятую. Только для панели — включается в ссылки для обмена (vcn). Современная замена allowInsecure, который Xray удалил после 2026-06-01.",
"pinFromCert": "Заполнить из сертификата этого входящего",
"pinFromRemote": "Получить хеш, пингуя SNI (xray tls ping)",
"pinFromRemoteNoSni": "Сначала задайте SNI (serverName), чтобы пинговать удалённый сертификат.",
"pinFromRemoteFailed": "Не удалось получить хеш удалённого сертификата.",
"limitFallback": "Ограничение fallback",
"limitFallbackUpload": "Ограничение загрузки fallback",
"limitFallbackDownload": "Ограничение скачивания fallback",
"afterBytes": "После байтов",
"afterBytesTip": "Позволяет fallback работать на полной скорости в течение этого количества байтов, после чего начинается ограничение. 0 = ограничивать с первого байта.",
"bytesPerSec": "Байт в секунду",
"bytesPerSecTip": "Ограничение скорости (байт/с) для трафика fallback после порога, чтобы пробы не могли использовать ваш сервер как бесплатный канал к цели. 0 = без ограничения (отключает это направление).",
"burstBytesPerSec": "Пиковые байты в секунду",
"burstBytesPerSecTip": "Допуск для коротких всплесков выше постоянной скорости (размер token-bucket). Если меньше, чем «Байт в секунду», повышается до этого значения.",
"moveUp": "Вверх",
"moveDown": "Вниз",
"addAll": "Добавить все",
@@ -591,7 +612,6 @@
"pinnedPeerCertSha256": "SHA-256 сертификата пира",
"pinnedPeerCertSha256Tip": "SHA-256-хеши сертификата пира в виде шестнадцатеричной строки (напр. e8e2d3…), через запятую. Только для панели — не записывается в конфиг xray сервера, но включается в ссылки-приглашения, чтобы клиенты могли закрепить сертификат.",
"pinnedPeerCertSha256Placeholder": "шестнадцатеричный хеш(и), через запятую",
"generateRandomPin": "Сгенерировать случайный хеш",
"getNewEchCert": "Получить новый ECH-сертификат",
"show": "Показать",
"xver": "Xver",
@@ -1293,6 +1313,14 @@
"remarkTemplateDesc": "Если задан, заменяет модель примечания для каждой ссылки подписки — задайте собственный формат с помощью токенов переменных (используйте кнопку для их вставки). Оставьте пустым, чтобы использовать модель выше."
},
"xray": {
"importRules": "Импорт правил",
"exportRules": "Экспорт правил",
"importOutbounds": "Импорт исходящих",
"exportOutbounds": "Экспорт исходящих",
"importInvalidJson": "Некорректный JSON — ожидался массив или объект с подходящим ключом.",
"metricsListen": "Эндпоинт метрик",
"metricsListenDesc": "Публикует метрики Xray в стиле Prometheus по этому адресу:порту (например, 127.0.0.1:11111). Оставьте пустым, чтобы отключить. Привяжите к localhost и проксируйте через reverse-proxy — он без аутентификации.",
"metricsTag": "Тег метрик",
"title": "Настройки Xray",
"save": "Сохранить",
"restart": "Перезапуск Xray",