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} mais)"
},
"form": {
"echSockopt": "Sockopt ECH",
"echSockoptTip": "Opções de socket para a conexão que o Xray usa ao buscar a lista de configurações ECH (por exemplo, rotear a consulta por um outbound dialerProxy). Deixe desativado para usar os padrões.",
"curvePreferences": "Preferências de curva",
"curvePreferencesTip": "Restringe as curvas de troca de chaves TLS que o servidor oferece, em ordem de preferência (por exemplo, X25519MLKEM768, X25519). Deixe vazio para usar os padrões do Xray-core.",
"masterKeyLog": "Log da chave mestra",
"masterKeyLogTip": "Caminho para gravar as chaves mestras TLS (formato SSLKEYLOGFILE) para depuração com o Wireshark. Deixe vazio em produção — isso permite que qualquer pessoa com o arquivo descriptografe o tráfego.",
"verifyPeerCertByName": "Verificar certificado do par pelo nome",
"verifyPeerCertByNameTip": "Instrui os clientes a verificar o certificado do servidor em relação a este nome em vez do SNI. Nomes separados por vírgula. Apenas do painel — incluído nos links de compartilhamento (vcn). A substituição moderna para allowInsecure, que o Xray removeu após 2026-06-01.",
"pinFromCert": "Preencher a partir do certificado desta entrada",
"pinFromRemote": "Obter o hash via ping ao SNI (xray tls ping)",
"pinFromRemoteNoSni": "Defina primeiro o SNI (serverName) para fazer o ping no certificado remoto.",
"pinFromRemoteFailed": "Não foi possível obter o hash do certificado remoto.",
"limitFallback": "Limitar fallback",
"limitFallbackUpload": "Limitar upload do fallback",
"limitFallbackDownload": "Limitar download do fallback",
"afterBytes": "Após bytes",
"afterBytesTip": "Permite que o fallback opere em velocidade máxima por esta quantidade de bytes e depois começa a limitar. 0 = limitar a partir do primeiro byte.",
"bytesPerSec": "Bytes por seg",
"bytesPerSecTip": "Limite de velocidade (bytes/seg) aplicado ao tráfego de fallback após o limiar, para que sondagens não usem seu servidor como banda gratuita até o destino. 0 = sem limite (desativa esta direção).",
"burstBytesPerSec": "Bytes por seg em rajada",
"burstBytesPerSecTip": "Margem para rajadas curtas acima da taxa estável (tamanho do token-bucket). Se for menor que Bytes por seg, é elevado para corresponder.",
"moveUp": "Mover para cima",
"moveDown": "Mover para baixo",
"addAll": "Adicionar todos",
@@ -591,7 +612,6 @@
"pinnedPeerCertSha256": "SHA-256 do cert. do par fixado",
"pinnedPeerCertSha256Tip": "Hashes SHA-256 do certificado do par como string hexadecimal (ex. e8e2d3…), separados por vírgula. Apenas no painel — não é gravado na config xray do servidor, mas é incluído nos links de compartilhamento para que clientes possam fixar o certificado.",
"pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por vírgula",
"generateRandomPin": "Gerar hash aleatório",
"getNewEchCert": "Obter novo certificado ECH",
"show": "Mostrar",
"xver": "Xver",
@@ -1294,6 +1314,14 @@
},
"xray": {
"title": "Configurações Xray",
"importRules": "Importar regras",
"exportRules": "Exportar regras",
"importOutbounds": "Importar saídas",
"exportOutbounds": "Exportar saídas",
"importInvalidJson": "JSON inválido — esperava-se um array ou um objeto com uma chave correspondente.",
"metricsListen": "Endpoint de métricas",
"metricsListenDesc": "Expõe as métricas no estilo Prometheus do Xray neste endereço:porta (por exemplo, 127.0.0.1:11111). Deixe vazio para desativar. Vincule ao localhost e use um proxy reverso — ele não é autenticado.",
"metricsTag": "Tag de métricas",
"save": "Salvar",
"restart": "Reiniciar Xray",
"restartSuccess": "Xray foi reiniciado com sucesso",