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,7 +611,6 @@
"usageOption": "خيار الاستخدام",
"buildChain": "بناء السلسلة",
"echKey": "ECH key",
"echConfig": "تكوين ECH",
"pinnedPeerCertSha256": "SHA-256 لشهادة النظير المثبَّتة",
"pinnedPeerCertSha256Tip": "تجزئات SHA-256 لشهادة النظير كسلسلة سداسية عشرية (مثل e8e2d3…)، مفصولة بفواصل. للوحة فقط — لا تُكتب في إعدادات xray على الخادم، لكنها تُضمَّن في روابط المشاركة ليتمكَّن العملاء من تثبيت الشهادة.",
"pinnedPeerCertSha256Placeholder": "تجزئة (تجزئات) سداسية عشرية، مفصولة بفواصل",
@@ -679,6 +678,36 @@
},
"echSockopt": "ECH Sockopt",
"echSockoptTip": "خيارات السوكيت للاتصال اللي Xray بتستخدمه عشان تجيب قائمة إعدادات ECH (مثلاً توجيه الاستعلام عبر صادر dialerProxy). سيبه متعطّل عشان تستخدم الإعدادات الافتراضية.",
"echCdnWarningTitle": "مفاتيح ECH المتولّدة محليًا بتشتغل بس مع الاتصال المباشر",
"echCdnWarningBody": "زوج المفاتيح اللي بيتعمل بـ«Get New ECH Cert» بيبقى صالح بس لما العملاء يتصلوا بالـ VPS ده مباشرة. لو الوارد محطوط ورا 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 بيدعم بس https:// أو h2c:// أو udp:// لحل إعدادات ECH، فالعنوان ده مش هيرد أبدًا.",
"echDynamicPlaceholder": "cloudflare-ech.com+https://dns.alidns.com/dns-query",
"echDynamicOverwriteTitle": "الوارد ده فيه زوج مفاتيح ECH متولّد محليًا",
"echDynamicOverwriteBody": "ورا CDN، زوج المفاتيح ده مش بيتستخدم أبدًا: الـ CDN هي اللي بتنهي مصافحة TLS. تطبيق القيمة الديناميكية هيعوّض قائمة إعدادات ECH ويمسح مفتاح ECH المحلي.",
"echDynamicOverwriteConfirm": "عوّض وامسح المفتاح المحلي",
"echExistingNotDynamic": "قائمة إعدادات ECH دي مش بصيغة ديناميكية؛ لو مليتها هتعوّض القيم اللي ظبطتها بإيدك.",
"echDohGroup": {
"china": "الصين القارية (متاحة من ورا الـ GFW)",
"global": "عالمي",
"europe": "أوروبا",
"udp": "DNS عادي (udp://)"
},
"echRecommended": "موصى به",
"echMainlandAdvisory": "الـ DNS المحلي بيتطلب نطاق مستهدف سجل HTTPS بتاعه فيه ECH؛ اتأكد إن الاتنين شغالين قبل الحفظ.",
"echConfigList": "قائمة إعدادات ECH",
"echConfigListHint": "بتتبعت للعملاء في روابط المشاركة والاشتراكات. بتقبل ECHConfigList محلي (من الزرار اللي تحت) أو الصيغة الديناميكية domain+DoH URL.",
"echKeyHint": "للاتصال المباشر بس — سيبه فاضي لو الوارد محطوط ورا CDN.",
"curvePreferences": "تفضيلات المنحنى",
"curvePreferencesTip": "بتقصر منحنيات تبادل مفاتيح TLS اللي السيرفر بيعرضها، بترتيب الأفضلية (مثلاً X25519MLKEM768, X25519). سيبه فاضي عشان تستخدم الإعدادات الافتراضية لـ Xray-core.",
"masterKeyLog": "سجل المفتاح الرئيسي",
@@ -2360,7 +2389,6 @@
"fingerprint": "بصمة",
"pins": "SHA-256 للشهادة المثبّتة",
"allowInsecure": "السماح بغير الآمن",
"echConfigList": "قائمة إعدادات ECH",
"muxParams": "Mux",
"sockoptParams": "Sockopt",
"finalMask": "Final Mask",