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
@@ -611,13 +611,42 @@
"usageOption": "Opción de uso",
"buildChain": "Construir cadena",
"echKey": "ECH key",
"echConfig": "Config ECH",
"pinnedPeerCertSha256": "SHA-256 del cert. del par fijado",
"pinnedPeerCertSha256Tip": "Hashes SHA-256 del certificado del par como cadena hexadecimal (p. ej. e8e2d3…), separados por comas. Solo en el panel — no se escribe en la config xray del servidor, pero se incluye en los enlaces para que los clientes puedan fijar el certificado.",
"pinnedPeerCertSha256Placeholder": "hash(es) hexadecimal, separados por comas",
"getNewEchCert": "Obtener nuevo cert ECH",
"echSockopt": "ECH Sockopt",
"echSockoptTip": "Opciones de socket para la conexión que Xray usa al obtener la lista de configuración ECH (por ejemplo, enrutar la consulta a través de una salida dialerProxy). Déjalo deshabilitado para usar los valores por defecto.",
"echCdnWarningTitle": "Las claves ECH generadas localmente solo funcionan con conexiones directas",
"echCdnWarningBody": "Un par de claves creado con «Get New ECH Cert» solo es válido cuando los clientes se conectan directamente a este VPS. Si el inbound está en proxy a través de Cloudflare CDN (VLESS + xhttp/WS detrás de la nube naranja), Cloudflare termina el TLS exterior con sus propias claves ECH y las rota, así que una clave local siempre falla el handshake. Usa en su lugar el asistente de ECH dinámico.",
"echDynamicTitle": "ECH dinámico de Cloudflare (funciona detrás de la nube naranja)",
"echPresetLabel": "Combinación predefinida",
"echPresetOtherDomains": "Otros dominios de destino ECH",
"echPresetAdvanced": "Combinación personalizada…",
"echDynamicIntro": "Rellena la lista de configuración ECH con una consulta dinámica del lado del cliente (dominio de destino + resolutor DoH). El cliente pregunta al resolutor por el registro HTTPS del dominio en cada conexión, así que siempre ve las claves ECH actuales, incluidas las rotadas de Cloudflare.",
"echDynamicDomain": "Dominio de destino ECH",
"echDynamicDoh": "Resolutor DoH",
"echDomainAuto": "Automático — resolver el registro ECH del SNI del nodo",
"echDynamicApply": "Aplicar a la lista de configuración ECH",
"echDynamicCustom": "URL personalizada…",
"echDynamicInvalid": "Introduce un dominio válido y una URL de resolutor (https, h2c o udp) para construir el valor.",
"echDynamicUnsupportedScheme": "Xray solo resuelve la configuración ECH mediante https://, h2c:// o udp://. Este destino nunca responderá.",
"echDynamicPlaceholder": "cloudflare-ech.com+https://dns.alidns.com/dns-query",
"echDynamicOverwriteTitle": "Este inbound tiene un par de claves ECH generado localmente",
"echDynamicOverwriteBody": "Detrás de un CDN ese par de claves nunca se usa: el CDN termina el handshake TLS. Aplicar el valor dinámico reemplazará la lista de configuración ECH y borrará la clave ECH local.",
"echDynamicOverwriteConfirm": "Reemplazar y borrar la clave local",
"echExistingNotDynamic": "Esta lista de configuración ECH no está en la forma dinámica; rellenarla sustituirá lo que configuraste a mano.",
"echDohGroup": {
"china": "China continental (accesible detrás del GFW)",
"global": "Mundial",
"europe": "Europa",
"udp": "DNS sin cifrar (udp://)"
},
"echRecommended": "recomendado",
"echMainlandAdvisory": "Los resolutores de China continental necesitan un dominio de destino cuyo registro HTTPS lleve ECH; verifica la combinación antes de guardar.",
"echConfigList": "Lista de configuración ECH",
"echConfigListHint": "Se envía a los clientes en los enlaces de compartir y en las suscripciones. Acepta un ECHConfigList local (del botón de abajo) o la forma dinámica dominio+URL de DoH.",
"echKeyHint": "Solo para conexiones directas — déjalo vacío cuando el inbound esté detrás de un CDN.",
"curvePreferences": "Preferencias de curvas",
"curvePreferencesTip": "Restringe las curvas de intercambio de claves TLS que ofrece el servidor, por orden de preferencia (por ejemplo, X25519MLKEM768, X25519). Déjalo vacío para usar los valores por defecto de Xray-core.",
"masterKeyLog": "Registro de clave maestra",
@@ -2361,7 +2390,6 @@
"pins": "SHA-256 del cert. fijado",
"verifyPeerCertByName": "Verificar cert. del par por nombre",
"allowInsecure": "Permitir inseguro",
"echConfigList": "Lista de config. ECH",
"muxParams": "Mux",
"sockoptParams": "Sockopt",
"finalMask": "Máscara final",