الاستيراد
يستطيع Chute استيراد إعدادات بروكسي مكتوبة لعملاء آخرين. يُقبل نوعان من المدخلات: روابط المشاركة لعقدة واحدة (ss:// و vmess:// و…)، وملفات الإعدادات الكاملة بصيغة Clash/mihomo YAML أو sing-box JSON. ويُحوَّل كلاهما إلى إعدادات Chute الأصلية — فما تحصل عليه بعد ذلك هو ملف إعدادات Chute اعتيادي بأقسام [Proxy] و [Proxy Group] و [Rule]، وليس ملفاً غريباً يواصل Chute تفسيره.
لا يُعامَل العنوانان http:// و https:// أبداً كروابط مشاركة. فهما عنوانا اشتراك: يُنزَّل المحتوى أولاً، ثم يُستورَد وفقاً لما يتبيّن أنه جسم الاستجابة.
روابط المشاركة
| المخطط | نوع السياسة الناتج | المنفذ الافتراضي |
|---|---|---|
ss:// |
ss |
8388 |
vmess:// |
vmess |
443 |
vless:// |
vless |
443 |
trojan:// |
trojan |
443 |
hysteria2://، hy2:// |
hysteria2 |
443 |
tuic:// |
tuic |
443 |
anytls:// |
anytls |
443 |
socks5://، socks:// |
socks5 |
1080 |
ssh:// |
ssh |
22 |
تستخدم معظم الروابط الصيغة userinfo@host:port?query#name. ويختلف اثنان عنها: يحمل vmess:// كائن JSON مُرمَّزاً بـ base64 (صيغة v2rayN، بأسماء الحقول add / ps / scy / net / aid)، بينما يقبل ss:// كلاً من صيغة SIP002 (base64(method:password)@host:port) والصيغة الأقدم التي تُرمِّز الجسم كاملاً base64(method:password@host:port). وقد تأتي حمولات base64 بلا حشو (padding) وقد تستخدم الأبجدية الآمنة للروابط (URL-safe).
trojan://[email protected]:443?sni=example.com&alpn=h2,http/1.1#Tokyo%20Node
يُحوَّل إلى:
[Proxy]
Tokyo Node = trojan, example.com, 443, password=password, tls=true, sni=example.com, alpn=h2|http/1.1
يُفكّ ترميز النسبة المئوية للنص الواقع بعد # ليصبح اسم السياسة؛ أما vmess:// فيأخذه من الحقل ps بدلاً من ذلك. والرابط الذي لا يحمل اسماً يُسمّى host:port. أما المحارف التي يحجزها تنسيق الإعدادات — = و , و [ و ] و " والجدولة والسطر الجديد — فتُستبدل بمسافات داخل الاسم.
إن Trojan و Hysteria2 و TUIC و AnyTLS بروتوكولات تعمل عبر TLS حصراً، لذا يُضاف tls=true حتى عندما لا ينص الرابط عليه صراحةً.
روابط متعددة. يمكن أن تكون الحمولة عدة روابط مشاركة مفصولة بأسطر جديدة، وملفوفة اختيارياً بطبقة base64 خارجية واحدة. ويصبح كل سطر يُحلَّل بنجاح سياسةً، وتحصل الأسماء المتكررة على لاحقة 2 و 3 … كي تظل القواعد والمجموعات قادرة على الإشارة إلى كل عقدة على حدة. أما الأسطر التي يتعذر تحليلها فيُبلَّغ عنها كتحذيرات مع استيراد بقية الحمولة؛ ولا يفشل الاستيراد إلا عندما يتعذر تحويل أي شيء على الإطلاق.
الرابط الذي لا يرد مخططه في الجدول أعلاه لا يُعرَّف كرابط مشاركة. أما الرابط ذو المخطط المعروف الذي تنقصه حقول مطلوبة فيُرفض برسالة تذكر ذلك المخطط.
المعاملات المدعومة
لا تُقرأ إلا معاملات الاستعلام أدناه؛ ويُتجاهل كل ما عداها في الرابط.
| المعامل | ينطبق على | يُحوَّل إلى | |
|---|---|---|---|
sni، peer، servername |
الكل | sni |
|
alpn (مفصولة بفواصل) |
الكل | alpn (تُدمج القيم بـ `\ |
`) |
fp |
الكل | fingerprint (بصمة uTLS ClientHello) |
|
allowInsecure، insecure، skip-cert-verify |
الكل | skip-cert-verify=true |
|
security=tls، xtls، reality |
الكل | tls=true |
|
pbk، sid |
REALITY | reality=true، public-key، short-id |
|
flow |
VLESS | xtls=true، flow |
|
type/network=ws + path، host |
الكل | ws=true، ws-path، ws-headers=Host:… |
|
type/network=grpc + serviceName (أو path) |
الكل | grpc=true، grpc-service-name |
|
type/network=xhttp أو splithttp + path، host، mode |
الكل | xhttp=true، xhttp-path، xhttp-host، xhttp-mode |
|
obfs، obfs-password، up، down |
Hysteria2 | أسماء الخيارات نفسها | |
plugin=… |
Shadowsocks | انظر أدناه |
تُقرأ قيمة plugin في Shadowsocks بالصيغة name;key=value;…. فتتحول obfs-local / simple-obfs / obfs إلى obfs و obfs_param؛ ويتحول v2ray-plugin في نمط websocket (الافتراضي) إلى ws=true مع ws-path و ws-headers. أما أي مُلحق آخر فيُنتج تحذيراً ولا يُنقل — ولن تتصل السياسة الناتجة بخادم يشترطه.
ملاحظة: يُبلَّغ عن قيمة
aid(alterId) غير الصفرية في VMess كتحذير. فـ Chute لا يتحدث إلا VMess AEAD، والخادم الذي ما زال يشترط مصافحة MD5 القديمة لن تنجح المصادقة معه.
استيراد ملفات الإعدادات
تُعرَف ثلاث صيغ:
| الصيغة | المعالجة |
|---|---|
| ملف إعدادات Chute/Surge أصلي | يُستخدم كما هو، دون خطوة تحويل |
| Clash / mihomo YAML | يُحوَّل إلى الإعدادات الأصلية |
| sing-box JSON | يُحوَّل إلى الإعدادات الأصلية |
تُكتشف الصيغة من المحتوى، ولا يُستخدم اسم الملف إلا كدليل مساعد. فالمحتوى الذي يبدأ بـ { يُعامَل كـ sing-box JSON مهما كان اسم الملف (إذ إن ملف إعدادات sing-box المحفوظ بامتداد .yaml يظل يُحلَّل كـ YAML، لذا لا يمكن الوثوق بالاسم وحده). وفيما عدا ذلك، يعني الامتداد .conf الصيغة الأصلية، ويعني .json صيغة sing-box، ويعني .yaml / .yml صيغة Clash. وعندما لا يتوفر اسم ملف صالح للاستخدام — كجسم اشتراك مثلاً — فإن أول سطر ذي معنى هو ما يحسم الأمر: يعني #!MANAGED-CONFIG أو ترويسة [Section] الصيغة الأصلية، بينما تعني proxies: أو proxy-groups: أو rules: أو proxy-providers: أو rule-providers: صيغة Clash. وأي شيء آخر يُعامَل على أنه الصيغة الأصلية.
المستند الذي يُحلَّل بنجاح لكنه لا يتضمن أياً من الأقسام التي تُعرِّف لهجته يُرفض بدلاً من الإبلاغ عنه كاستيراد ناجح لا شيء فيه: يحتاج Clash YAML إلى واحد على الأقل من proxies أو proxy-groups أو rules أو proxy-providers أو rule-providers، ويحتاج sing-box JSON إلى outbounds أو endpoints أو route.
لا يُفشل إدخالٌ واحد غير قابل للتحويل عمليةَ الاستيراد أبداً. فكل بروكسي ومجموعة وقاعدة يُحوَّل على حدة؛ وتُتخطى العناصر التي لا مكافئ لها في Chute ويُبلَّغ عنها. وتحمل النتيجة الإعدادات المحوَّلة وقائمة تحذيرات وقائمة بحقول المصدر التي جرى تخطيها. كما تُكتب التحذيرات نفسها داخل النص المحوَّل على شكل تعليقات، بجوار القسم الذي جاءت منه:
[Proxy]
HK 01 = ss, example.com, 8388, aes-128-gcm, password
# KL-CONVERT-WARNING [proxies[3]]: proxy type 'snell' was skipped — Snell is a Surge-proprietary protocol KLNEKit does not implement
وأخيراً، يُعاد تحليل النص المحوَّل بمحلل Chute نفسه. وأي سطر يرفضه المحلل يُحوَّل إلى تعليق بالصيغة # KL-CONVERT-DROPPED: … ويُبلَّغ عنه، فيظل ملف الإعدادات القابل للتحويل بنسبة 95% قابلاً للاستيراد والتشغيل.
تُعاد كتابة أسماء العقد حيثما كانت ستُفسد تنسيق الإعدادات: تصبح , مسافةً وتصبح = هي -، والاسم الذي يتعارض بعد ذلك مع اسم آخر يحصل على لاحقة رقمية. وتُعاد كتابة أعضاء المجموعات ووجهات القواعد بما يطابق ذلك، فيظل كل مرجع مشيراً إلى العقدة نفسها. وتُربط بروكسيات/اتصالات direct الصادرة بسياسة DIRECT المدمجة، وتُربط reject / block / dns بسياسة REJECT.
ملاحظة: ملف الإعدادات المحوَّل هو لقطة ثابتة. فـ Chute يعيد تنزيل الاشتراك ويحلله كملف إعدادات أصلي، لذا يُحفظ ملف الإعدادات الذي احتاج إلى تحويل من دون رابط تحديث تلقائي ولن يحدّث نفسه.
ملاحظات تحويل Clash / mihomo
ملاحظة: يُحوَّل
dialer-proxyإلىunderlying-proxy. يحلل Chute هذا الخيار ويحتفظ به لكنه لا ينفّذ تسلسل البروكسي — فالسياسة التي تحمله تسجّل تحذيراً وتتصل بخادمها الخاص مباشرة. وحركة المرور التي كانت متسلسلة تحت mihomo لا تبقى متسلسلة بعد الاستيراد.
- أنواع البروكسي المحوَّلة:
ssوssrوvmessوvlessوtrojanوhttpوsocks5وhysteria2وtuicوanytlsوwireguardوssh. أما الأنواع التي لا يوجد لها تنفيذ في Chute —snellوhysteria(v1) وmieruوjuicityوshadowquicوtrusttunnelوopenvpnوsudokuوvmess-http— فتُتخطى مع تحذير يذكر البروتوكول. ويُتخطى نوعان آخران رغم أن Chute يدعم بروتوكولهما: بروكسيmasque، لأن ترتيب الحقول في mihomo يختلف، وبروكسيtailscale، الذي يُضبط مرة واحدة في قسم[Tailscale]ويُستخدم عبر السياسة المدمجةTAILSCALE. - مفتاحا البصمة في mihomo يعنيان أمرين مختلفين ويُفصل بينهما: يصبح
client-fingerprintهوfingerprint(بصمة uTLS ClientHello)، ويصبحfingerprintهوcert-fingerprint-sha256(تثبيت للشهادة). - يصبح
udp: falseهوudp-relay=false، ويصبحtfoهوtfo=true، وتصبح كتلةsmuxالمفعلةmux=true. - تُحوَّل أنواع المجموعات
selectوurl-testوfallbackوload-balanceمع خيارات فحص السلامة الخاصة بها. أما مجموعةrelayفتُتخطى — لأنها تسلسل، وهو غير منفَّذ. وتصبح أعضاءuse:مراجعَ بالصيغةpolicy-provider:<name>، وتُوسَّعinclude-all/include-all-proxies/include-all-providersإلى قائمة أعضاء صريحة. - يُنقل
filterوexclude-filterبين علامتي اقتباس، لكن النمط الذي يحتوي على فاصلة أو علامة اقتباس لا يمكنه النجاة من تنسيق سطر الإعدادات فيُسقَط مع تحذير. - تُعاد تسمية أنواع القواعد حيثما اختلفت الأسماء: يصبح
MATCHهوFINAL، ويصبحDST-PORTهوDEST-PORT، ويصبحSRC-IP-CIDRهوSRC-IP. وتنطويREJECT-DROPوREJECT-TINYGIFعلىREJECT؛ أما القاعدة التي تستهدفPASSأوCOMPATIBLEفتُتخطى. - يُوسَّع
rule-providerالمضمَّن (type: inlineمع قائمةpayload) إلى القواعد المكافئة الصريحة، لأن سطر[Rule Provider]في Chute لا يمكنه تضمين حمولة. - تُعيَّن المفاتيح العامة حيثما وُجد لها مكافئ: يصبح
mixed-portهو منفذ HTTP أيport(ويحتاج SOCKS5 إلىsocks-portالخاص به)، ويصبحallow-lanهوallow-wifi-access، ويُعيَّنlog-levelعلىloglevel، ويصبحexternal-controller/secretخيارات وحدة التحكم الخارجية عبر HTTP، وتصبحsnifferالمفعلةsniffing-enabled.
ملاحظات تحويل sing-box
- أنواع الاتصالات الصادرة المحوَّلة:
shadowsocksوvmessوvlessوtrojanوhysteria2وtuicوanytlsوshadowtlsوwireguardوhttpوsocksوssh. ويصبحselectorوurltestمجموعتَي سياسات من النوعينselectوurl-test. - يُنتج
detourتحذيراً للسبب نفسه الذي يُنتجهdialer-proxy: تسلسل الاتصالات الصادرة غير منفَّذ، والاتصال الصادر يتصل بخادمه الخاص مباشرة. - تصبح إدخالات
route.rule_setأسطر[Rule Provider](type=httpللبعيدة وtype=fileللمحلية، وتُقرأ دائماً كقوائم قواعد mihomo-YAML الكلاسيكية). أما مجموعة القواعد بصيغة.srsالثنائية فتُرفض — إذ لا يقرأ Chute إلا حمولات القواعد النصية. - تتبع قواعد التوجيه المفتاح
action: يستخدمroute/bypassالاتصال الصادر المذكور، ويصبحrejectهوREJECT، ولا تُنتجhijack-dnsوsniffوresolveشيئاً لأن Chute يتحكم بها من[General]. - لا يوجد مكافئ لإعدادات
multiplexولا لـdns.rules(توجيه DNS لكل نطاق)، ويُبلَّغ عنها كمُسقَطة.
القيود
- تسلسل البروكسي غير منفَّذ. فـ
dialer-proxyفي mihomo وdetourفي sing-box ومجموعاتrelayفي Clash تصف كلها سلسلة؛ ولا ينتج عن أي منها حركة مرور متسلسلة في Chute. - تُسقَط الخيارات التي لا مكافئ لها في Chute مع تحذير بدلاً من إسقاطها بصمت: على مستوى البروكسي
ip-versionوinterface-nameوrouting-markوmptcp؛ وعلى مستوى المجموعةexclude-typeوdisable-udpوinterface-nameوrouting-markوicon؛ والمفاتيح العامةbind-addressوtcp-concurrentوgeodata-modeوgeox-urlوfind-process-modeوunified-delayوauthenticationوtproxy-portوredir-portوغيرها. - تُتخطى أنواع القواعد التي لا مكافئ لها:
GEOSITEوIP-SUFFIXوSRC-IP-SUFFIXوSRC-GEOIPوSRC-IP-ASNوDSCPوUIDوSUB-RULEوPROCESS-PATH-REGEXوPROCESS-NAME-WILDCARDوPROCESS-PATH-WILDCARDوIP-ACCEPT. كما تُتخطى القاعدة التي تحمل المُعدِّلsrcالخاص بـ mihomo، بدلاً من مطابقتها على الطرف الخطأ. وتُسقَطsub-rulesفي mihomo (أشجار القواعد المتداخلة). - لا تُنقل تفاصيل البروتوكول التي يديرها Chute بنفسه: قفز المنافذ في Hysteria2 (
ports)، وheartbeatفي TUIC، وضبط تجمع الجلسات في AnyTLS، وقوائمpeersفي WireGuard (إذ يُضبط نظير واحد)، وworkers. - يُبلَّغ عن وسائط النقل التي لا ينفّذها Chute بدلاً من تحويلها:
h2، وتمويهhttp، وhttpupgrade، ونسخة WebSocket المسماةv2ray-http-upgrade، وmax-early-dataفي WebSocket، وextraفي XHTTP (أي XMUX / download-settings). - إن
modeالتشغيلي في Clash هو مفتاح تبديل أثناء التشغيل في Chute، وليس مفتاح إعدادات؛ وملف الإعدادات في وضعglobalأوdirectيُحوَّل إلى وضع القواعد مع تحذير. - تُقرأ YAML بمحلل قياسي، لذا تعمل المراسي (anchors) ومفتاح الدمج
<<. أما القيمة المكتوبة كقيمة قياسية متعددة الأسطر فتُطوى في سطر واحد، لأن السطر الجديد سيقسم سطر الإعدادات الذي تقع فيه.