الاستيراد
يستطيع Chute استيراد إعدادات بروكسي مكتوبة لعملاء آخرين. يُقبل نوعان من المدخلات: روابط المشاركة لعقدة واحدة (ss:// و vmess:// و…)، وملفات الإعدادات الكاملة بصيغة Clash/mihomo YAML أو sing-box JSON. ويُحوَّل كلاهما إلى إعدادات Chute الأصلية — فما تحصل عليه بعد ذلك هو ملف إعدادات Chute اعتيادي بأقسام [Proxy] و [Proxy Group] و [Rule]، وليس ملفاً غريباً يواصل Chute تفسيره.
لا يُعامَل العنوانان http:// و https:// أبداً كروابط مشاركة. فهما عنوانا اشتراك: يُنزَّل المحتوى أولاً، ثم يُستورَد وفقاً لما يتبيّن أنه جسم الاستجابة.
روابط المشاركة
روابط المشاركة — الرابط المفرد، أو الاشتراك الذي يكون متنه قائمةً منها — لا يستوردها حالياً إلا Chute Mac. وليس في Chute iOS استيراد لروابط المشاركة: يستطيع دليل التشغيل الأول فيه إعداد خادم واحد من رمز QR ممسوح يحمل رابط ss:// أو vmess:// أو vless:// أو trojan:// أو hysteria2:// أو socks5:// أو ssh://، ولا يأخذ منه إلا عنوان الخادم والمنفذ وبيانات الاعتماد تقريباً — والرابط الخالي من المنفذ يأخذ المنفذ الافتراضي من الجدول أدناه. أما Chute tvOS و Chute Android فلا يقرآن روابط المشاركة.
| المخطط | نوع السياسة الناتج | المنفذ الافتراضي |
|---|---|---|
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://password@example.com: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
يُفكّ ترميز percent-encoding في النص الواقع بعد # ليصبح اسم السياسة؛ أما vmess:// فيأخذه من الحقل ps بدلاً من ذلك. والرابط الذي لا يحمل اسماً يُسمّى host:port. أما المحارف التي يحجزها تنسيق الإعدادات — = و , و [ و ] و " والجدولة والسطر الجديد — فتُستبدل بمسافات داخل الاسم.
إن Trojan و Hysteria2 و TUIC و AnyTLS بروتوكولات تعمل عبر TLS حصراً، لذا يُضاف tls=true حتى عندما لا ينص الرابط عليه صراحةً.
روابط متعددة. يمكن أن تكون الحمولة عدة روابط مشاركة مفصولة بأسطر جديدة، وملفوفة اختيارياً بطبقة base64 خارجية واحدة. ويصبح كل سطر يُحلَّل بنجاح سياسةً، وتحصل الأسماء المتكررة على لاحقة 2 و 3 … كي تظل القواعد والمجموعات قادرة على الإشارة إلى كل عقدة على حدة. أما الأسطر التي يتعذر تحليلها فيُبلَّغ عنها كتحذيرات مع استيراد بقية الحمولة؛ ولا يفشل الاستيراد إلا عندما يتعذر تحويل أي شيء على الإطلاق.
الرابط الذي لا يرد مخططه في الجدول أعلاه لا يُعرَّف كرابط مشاركة. أما الرابط ذو المخطط المعروف الذي تنقصه حقول مطلوبة فيُرفض برسالة تذكر ذلك المخطط.
المعاملات المدعومة
لا تُقرأ إلا معاملات الاستعلام أدناه؛ ويُتجاهل كل ما عداها في الرابط.
ويُقصد بـ «روابط الاستعلام» أدناه كل مخطط يحمل إعداداته في سلسلة استعلام: vless:// و trojan:// و hysteria2:// و tuic:// و anytls:// و socks5:// و ssh://. أما ss:// و vmess:// فيُقرآن بمحلّليهما الخاصين، ويأتي بيانهما بعد الجدول.
| المعامل | ينطبق على | يُحوَّل إلى | |
|---|---|---|---|
sni، peer، servername |
روابط الاستعلام | sni |
|
alpn (مفصولة بفواصل) |
روابط الاستعلام | alpn (تُدمج القيم بـ `\ |
`) — ولا تقرأه إلا سياسات TUIC و Hysteria2 و MASQUE، انظر المعاملات المشتركة |
fp |
روابط الاستعلام | fingerprint (بصمة uTLS ClientHello) |
|
allowInsecure، insecure، skip-cert-verify |
روابط الاستعلام | skip-cert-verify=true |
|
security=tls، xtls، reality |
روابط الاستعلام | tls=true؛ وفي socks5:// يختار هذا نوع السياسة socks5-tls |
|
pbk، sid |
REALITY | reality=true، public-key، short-id، و server-name= من sni / servername |
|
flow |
VLESS | xtls=true، flow |
|
type/network=ws + path، host |
روابط الاستعلام | ws=true، ws-path، ws-headers=Host:… |
|
type/network=grpc + serviceName، 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 (و obfs_password كذلك)، up، down |
Hysteria2 | أسماء الخيارات نفسها | |
plugin=… |
Shadowsocks | انظر أدناه |
لا يقرأ ss:// من الاستعلام سوى plugin وحده، فتُتجاهل sni و alpn و fp و allowInsecure و security و type= إن كُتبت في رابط Shadowsocks. أما vmess:// فلا استعلام له أصلاً: إذ يأخذ الإعدادات نفسها من حقول sni و host و alpn و fp و net و path و tls في جسم JSON الخاص به. وصفوف النقل الثلاثة — ws و grpc و xhttp — لا تصل أبداً إلى رابط hysteria2:// أو tuic:// أو anytls://: فتلك السياسات تُكتب بخياراتها الخاصة وخيارات TLS فقط، لأن كل بروتوكول منها يحمل نقله الخاص به.
تُقرأ قيمة plugin في Shadowsocks بالصيغة name;key=value;…. فتتحول obfs-local / simple-obfs / obfs إلى obfs و obfs_param. ويتحول v2ray-plugin إلى Shadowsocks عبر WebSocket: ws=true، ويصبح path هو ws-path، وhost هو Host في ws-headers، وtls هو tls=true مع ضبط sni على المضيف نفسه؛ وإذا كانت قيمة mux هي 0 أو false أو no أو off صارت ws-mux=false، وأي قيمة أخرى تُبقي الافتراضي. ولا مقابل لوضع quic فيه: يُسقَط المُلحق مع التحذير <path>.plugin: Shadowsocks plugin 'v2ray-plugin' in quic mode has no KLNEKit equivalent; the proxy will not connect without it. وأي خيار آخر له يُسقَط مع <path>.plugin-opts.<key>: option has no KLNEKit equivalent and was dropped. أما أي مُلحق آخر فيُنتج تحذيراً ويُسقَط: تُكتب السياسة مع ذلك، لكنها لن تتصل بخادم يشترط المُلحق.
ملاحظة: يُبلَّغ عن قيمة
aid(alterId) غير الصفرية في VMess كتحذير. فـ Chute لا يتحدث إلا VMess AEAD، والخادم الذي ما زال يشترط مصافحة MD5 القديمة لن تنجح المصادقة معه.
استيراد ملفات الإعدادات
تُعرَف ثلاث صيغ:
| الصيغة | المعالجة |
|---|---|
| ملف إعدادات Chute أو Surge أو Shadowrocket أصلي | يُستخدم كما هو، دون خطوة تحويل — راجع ملفات Surge وShadowrocket |
| 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. وأي شيء آخر يُعامَل على أنه الصيغة الأصلية. أما ما يقدّمه عنوان — تنزيلاً كان أو اشتراكاً — فيُحكَم عليه بجسمه: فالاسم المأخوذ من العنوان لا يُعتدّ به إلا إذا خلا الجسم من كل هذه العلامات، ولذلك يُحوَّل العنوان المنتهي بـ .conf إذا قدّم 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. يصبح المرجع المستورد فعالاً: تُنشأ اتصالات السياسة — TCP، وUDP حيث تسمح البروتوكولات — عبر المنبع المحدد، وتؤدي المراجع المتداخلة إلى عدة قفزات. تفشل المراجع المفقودة أو الدائرية فشلاً مغلقاً (fail-closed) وتُسجّل. ويُعاملdialer-proxyالذي يسمّي اسماً مستعاراً منtype: directعلى أنه اتصال مباشر. ويصبحoverride: dialer-proxyالخاص بمزود البروكسي هوunderlying-proxyالخاص بالمزود؛ أما مفاتيحoverrideالأخرى فما زالت تُسقَط مع تحذير. ويصبحproxy:الخاص بمزود القواعد أو مزود البروكسي هوpolicy=الخاص به، فيُنزَّل المزود عبر تلك السياسة كما في 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. ولا يوجدtype: https: فبروكسي HTTPS هوtype: httpمعtls: trueكما يكتبه mihomo، ويُبلَّغ عنtype: httpsبوصفه نوع بروكسي غير مدعوم. - مفتاحا البصمة في mihomo يعنيان أمرين مختلفين ويُفصل بينهما: يصبح
client-fingerprintهوfingerprint(بصمة uTLS ClientHello)، ويصبحfingerprintهوcert-fingerprint-sha256(تثبيت للشهادة). - يصبح
udp: falseهوudp-relay=false، ويصبحtfoهوtfo=true. أما كتلةsmuxالمفعلة فلا تُنقل — إذ يستخدمmuxفي Chute تأطيراً خاصاً به لا يستطيع خادم mihomo أو sing-box قراءته — ويذكر الاستيراد ذلك:<path>.smux: multiplexing (smux) has no KLNEKit equivalent; mux is left off. - يُحوَّل
pluginفي بروكسيssمنplugin-optsالخاصة به:obfs(وكذلكsimple-obfsوobfs-local) إلىobfsوobfs_param، وv2ray-pluginكما في رابط المشاركة —modeوtlsوhostوpathوmuxكما وُصفت هناك، وheadersإلىws-headersحيث يحلHostفيها محلhost، وskip-cert-verifyإلىskip-cert-verify=true. ولا يُنسخ Host الافتراضي في mihomo وهوbing.com: فمن دونhostتُطبَّق القيمة الافتراضية للسياسة نفسها. أما أي مُلحق آخر فيُبلَّغ عنه ويُسقَط. - يصبح
udp-over-tcp: trueفي بروكسيssهوudp-over-tcp=true، ويُكتب الإصدار دائماً:udp-over-tcp-versionكما هو، أو1إذا لم يُذكر، لأن الافتراضي في mihomo هو التأطير القديم بينما الافتراضي في Chute هو 2. ومعudp: falseلا يرحّل البروكسي أي UDP، كما في mihomo. - يحصل بروكسي
trojanدائماً علىtls=true: فـ Trojan في mihomo يستخدم TLS دائماً، ولذلك يُتجاهلtls: falseفي الملف. ويحتفظ بروكسيwireguardبـallowed-ipsالخاص به، الذي يطبّقه Chute — انظر إعدادات WireGuard. - يصبح
host-keyفي بروكسيsshقيمةserver-fingerprintبين علامتي تنصيص. والقائمة تصبحserver-fingerprint="…"واحدة تضم كل المفاتيح؛ أما المُدخل الذي يحتوي علامة تنصيص أو فاصلة فلا يمكن كتابته في سطر السياسة، فيُبلَّغ عنه ويُسقَط. - الحقل الذي يقبل قيمة واحدة لكنه مكتوب قائمةً أو خريطةً يُعامَل كأنه غير موجود؛ وإن كان الحقل إلزامياً يُبلَّغ عن المُدخل ويُتخطى.
- تُحوَّل أنواع المجموعات
selectوurl-testوfallbackوload-balanceمع خيارات فحص السلامة الخاصة بها. وتبقى مجموعةrelayمجموعةrelayبأعضائها في الترتيب نفسه: يُتصل بالعضو الأول مباشرة ويتصل العضو الأخير بالوجهة. وتصبح أعضاءuse:مراجعَ بالصيغةpolicy-provider:<name>، وتُوسَّعinclude-all/include-all-proxies/include-all-providersإلى قائمة أعضاء صريحة. - يُنقل
filterوexclude-filterبين علامتي اقتباس، لكن النمط الذي يحتوي على فاصلة أو علامة اقتباس لا يمكنه النجاة من تنسيق سطر الإعدادات فيُسقَط مع تحذير. - يُنقل
exclude-typeالخاص بالمجموعة كما هو بصيغةexclude-type=: فتبقى أنواع البروكسي المذكورة خارج الأعضاء الذين يوفّرهم المزوّد. أماtcp-concurrentفليس له مفتاح مستقل — فحيث تسمح المنصة، يتسابق Chute على ما يصل إلى خمسة عناوين محلولة للوجهة، ويتصل بالأول في غير ذلك — ويوضّح الاستيراد ذلك بدل الإبلاغ عنه كخسارة مجردة. - تُعاد تسمية أنواع القواعد حيثما اختلفت الأسماء: يصبح
MATCHهوFINAL، ويصبحDST-PORTهوDEST-PORT، ويصبحSRC-IP-CIDRهوSRC-IP. وتُحفظREJECT-DROPوREJECT-TINYGIFكما هما، لأن كلتيهما سياسة مدمجة في Chute بسلوك خاص؛ أما القاعدة التي تستهدفPASSأوCOMPATIBLEفتُتخطى. - يُوسَّع
rule-providerالمضمَّن (type: inlineمع قائمةpayload) إلى القواعد المكافئة الصريحة، لأن سطر[Rule Provider]في Chute لا يمكنه تضمين حمولة. - تُوسَّع قاعدة
SUB-RULE,(condition),nameمع خريطةsub-rules:التي تسمّيها إلى قواعد عادية: تصبح كل قاعدة في الفرعnameبالصيغةAND,((condition),(rule)),POLICY، ويصبحMATCH,Xفي الفرعcondition,X. وتضيفSUB-RULEداخل فرعٍ شرطَها إلى الشروط المحيطة بها، حتى 8 مستويات من التداخل. ويُتخطى الفرع المفقود، أو الذي يعود إلى فرع قيد التوسيع، مع تحذير تحويل. - تُعيَّن المفاتيح العامة حيثما وُجد لها مكافئ: يصبح
mixed-portهو منفذ HTTP أيport(ويحتاج SOCKS5 إلىsocks-portالخاص به)، ويصبحallow-lanهوallow-wifi-access، ويُعيَّنlog-levelعلىloglevel، ويصبحexternal-controller/secretخيارات وحدة التحكم الخارجية عبر HTTP، وتصبحsnifferالمفعلةsniffing-enabled. - يصبح
bind-addressهوinterfaceوsocks-interface— أي العنوان الذي يرتبط به المستمعان. و*تعني كل العناوين. فإن كانallow-lanمفعّلاً أيضاً، فإنallow-wifi-accessفي Chute يوسّع الارتباط إلى كل العناوين على أي حال، ويقول الاستيراد ذلك: احذفallow-wifi-accessللإبقاء على الارتباط الأضيق. - يصبح
authenticationسطرhttp-authواحداً لكل بيانات اعتماد، يحمي المستمعَين نفسيهما. أما المدخل الذي لا يفصل فيه:بين المستخدم وكلمة المرور فيُبلَّغ عنه ويُسقَط. - لا يصبح
external-controller-corsهوexternal-http-corsإلا حين تكون المصادر المسموح بها «أي مصدر» أصلاً (*، أو من دون قائمة إطلاقاً). فمفتاح Chute هنا إما الكل أو لا شيء، ولذلك يبقى مغلقاً في ملف يسمّي مصادر بعينها، ويُوضَّح له السبب — إذ إن فتحه يمنح كل المصادر ما منحه الملف لمصدر واحد. ولا مكافئ لـallow-private-network، ولا تُرسَل تلك الترويسة. - يفصل mihomo بين مطابقة العمليات الحرفية ومطابقتها بأنماط glob في نوعَي قواعد مختلفين؛ أما Chute فله نوع واحد، وهو نوع الأنماط. ولذلك يصبح
PROCESS-NAME-WILDCARDوPROCESS-PATH-WILDCARDهماPROCESS-NAMEوPROCESS-PATH، وكلاهما يقرأ*و?بالطريقة نفسها. أما النص الحرفي الخالي منهما فيظل يطابق مطابقة تامة. - يُعيَّن
tunحيثما وُجد لدى Chute المفتاح نفسه: يصبحdns-hijackهوhijack-dns(وتُعاد كتابةany:53الخاصة بـ mihomo إلى*:53)، ويصبحroute-addressهوtun-included-routes، ويصبحroute-exclude-addressهوtun-excluded-routes. أماstackوauto-routeوauto-detect-interfaceوauto-redirectوmtuوstrict-routeوendpoint-independent-natوdeviceوinet4-addressوinet6-addressوudp-timeoutوgsoفيُبلَّغ عنها بدلاً من تحويلها — إذ يقرّرها Chute بنفسه. - تُعيَّن كتلة DNS على النحو التالي. تصبح
hostsمدخلات[Host]مع الاحتفاظ بكل عنوان في القائمة. وتُدمجnameserverوfallbackفي مجموعة واحدة وتُكتب على هيئةdns-serverأوdohأوdotأوdoqأوdoh3بحسب صيغة كل مدخل — فـ Chute يستعلم من كل محلّل مُعدّ في وقت واحد، فلا يبقى لمجموعة احتياطية منفصلة ما ترتد عنه، ويقول الاستيراد ذلك. وتصبحdirect-nameserverوproxy-server-nameserverهماdirect-dns-serverوproxy-dns-server. وتصبحfake-ip-filterهيalways-real-ip. وتصبحnameserver-policyمدخل[Host]واحداً لكل مفتاح؛ ويصبح المفتاحrule-set:بالصيغة المفتاحية للمجموعةRULE-SET:<provider> = server:…حين يكون المزوّد من نوعhttpأوfile، أما المفتاحgeosite:فيُسقَط مع تحذير. - وفي كتلة DNS أيضاً: تصبح
use-system-hosts: falseهيread-etc-hosts = false. ولا مكافئ لـuse-hosts: false— إذ يُستشار جدول[Host]دائماً — فيُبلَّغ عنها. ويعكسfake-ip-filter-mode: whitelistالمرشِّح، وهو ما لا يستطيعalways-real-ipالتعبير عنه، فتُحفظ القائمة قائمةَ حظر ويقول الاستيراد ذلك. أماdefault-nameserverفيمهّد لأسماء مضيفي المحلّلات أنفسهم؛ و Chute يحلّها عبر محلّل النظام، فيشير الاستيراد إلى سطر[Host]الذي يثبّتها بدلاً من ذلك.
ملاحظات تحويل sing-box
- أنواع الاتصالات الصادرة المحوَّلة:
shadowsocksوvmessوvlessوtrojanوhysteria2وtuicوanytlsوshadowtlsوwireguardوhttpوsocksوssh. ويصبحselectorوurltestمجموعتَي سياسات من النوعينselectوurl-test. ويُحوَّلpluginفيshadowsocksلـobfs-local(ويُكتب أيضاًsimple-obfsأوobfs)، إلىobfsوobfs_param، ولـv2ray-pluginالذي تُحوَّل سلسلةplugin_optsالخاصة به (tls;host=…;path=…) كما في رابط المشاركة، على أن تذكر تحذيراتهplugin_optsبدلاً منplugin-opts؛ أما أي مُلحق آخر فيُبلَّغ عنه ويُسقَط، ويُكتب الاتصال الصادر مع ذلك لكنه لن يتصل بخادم يشترط المُلحق. ولا يحصل اتصالtrojanالصادر علىtls=trueإلا إذا كانtls.enabledمضبوطاً فيه، كما في sing-box؛ وبدونه يُستورد بوصفه Trojan غير مشفّر — أضفtls=trueما لم يكن الخادم يتكلم فعلاً بلا تشفير. - داخل الاتصال الصادر: يصبح
transportمن النوعxhttpأوsplithttpهوxhttp=trueمعxhttp-pathوxhttp-hostوxhttp-modeوxhttp-headers. ويصبحtls.echالمفعَّلech=true، ويصبحconfigالخاص بهech-config=. ويصبحpublic_keyفي REALITY هوpublic-key؛ والاتصال الصادر الذي يخلو منه يُحوَّل مع تحذير، لأن مصافحة REALITY الخاصة به لا يمكن أن تنجح. وتصبح قائمةhost_keyفي SSH قيمةserver-fingerprint="…"واحدة بين علامتي تنصيص تضم كل المفاتيح؛ ويُبلَّغ عن المُدخل الذي يحتوي علامة تنصيص أو فاصلة ويُسقَط. ويحتفظ اتصالwireguardالصادر بالصيغة القديمة بقائمةlocal_addressفي صورةself-ipوself-ip-v6(أول عنوان من كل عائلة)، وبـpre_shared_keyفي صورةpreshared-key، وبـreservedفي صورةreserved="a,b,c"بين علامتي تنصيص؛ أما قائمةpeersفيُبلَّغ عنها وتُسقَط، لأن Chute يضبط نظيراً واحداً. - تُحوَّل
endpoints(في sing-box 1.11 وما بعده) أيضاً: تصبح نقطة نهايةwireguardسياسةwireguardلها قسم[WireGuard <tag>]خاص، ويصبحallowed_ipsالخاص بنظيرها هوallowed-ipsفي ذلك القسم، وتصبح أول نقطة نهايةtailscaleقسم[Tailscale]الذي يُستخدم عبر السياسة المدمجةTAILSCALE. وتُتخطى أنواع نقاط النهاية الأخرى مع تحذير. واسم القسم هو اسم السياسة بعد حذف المسافات والأقواس المربعة منه، لأن تنسيق سطر الإعدادات يُسقط المسافات عند مطابقةsection-name=؛ وتحصل السياستان اللتان تتصادمان بعد الحذف على لاحقة-2أو-3… وهكذا. - تُحوَّل حقول الاتصال كما في مسار mihomo: يصبح
tcp_fast_openهوtfo=true، وnetwork: tcpهوudp-relay=false. ويصبحudp_over_tcpفي اتصالshadowsocksالصادر —trueأو{"enabled": true, "version": 1}— هوudp-over-tcp=true، ولا يُكتبudp-over-tcp-version=1إلا للإصدار 1: فالإصدار 2، وهو الافتراضي في sing-box، هو الافتراضي في Chute أيضاً. أماmultiplexالمفعّل فلا يُنقل عمداً: إذ يتفاوض sing-box على smux / yamux / h2mux بحشوه الخاص، بينما يستخدمmuxفي Chute تأطيراً خاصاً به لا يستطيع خادم sing-box قراءته، فيُحوَّل الاتصال الصادر بلا تعدّد إرسال ويقول تحذيرٌ ذلك. ويصبحdetourمرجعunderlying-proxy=فعالاً؛ وتكوّن detour المتداخلة عدة قفزات، بينما تفشل الحلقات والمراجع المفقودة فشلاً مغلقاً. ويُحتفظ كذلك بـdetourالخاص بنقطة نهايةwireguard، ويمر نفقها عبر ترحيل UDP الخاص بذلك المنبع؛ أما نقطة نهايةtailscaleالتي لهاdetourغير direct فلا تُستورد، وتفشل المراجع إليها فشلاً مغلقاً، مع تحذير. route.rule_set: تصبح مجموعة القواعد من نوعinlineقسم[Ruleset <tag>]، وتصبح مجموعاتremoteوlocalأسطر[Rule Provider](type=http/type=file) معformat=sing-box-source. أما مجموعة القواعد بالصيغة الثنائية فتُتخطّى مع تحذير: وجِّهها إلى صيغة source (.jsonأو YAML) من المجموعة نفسها. والصيغة الثنائية في هذا المسار هي.srs، وتُكتشف منformat: binaryأو من مسار ينتهي بـ.srsحين يُحذفformat؛ أما.mrsفلا تُستشفّ إلا في مسار مزوّد قواعد Clash، حيث يستنتج mihomo الصيغة من الامتداد بالطريقة نفسها. وعلى macOS يعيد المستورد كتابة الرابط ليشير إلى الحمولة المصدرية المجاورة حين يوفّر الناشر واحدة؛ أما على iOS و Apple TV و Android فلا يفعل، لأن المجموعات المنشورة بالصيغة الثنائية تتجاوز أصلاً بكثير ما تستطيع تلك المنصات تحميله. كانت ملفات الإعدادات المستوردة بإصدارات سابقة تكتب هذه المجموعات بـformat=mihomo-yamlفلا تُحمِّل منها أي قاعدة؛ وهي تُحمَّل الآن دون إعادة استيراد. وتُنزَّل مجموعة القواعد البعيدة كما ينزّلها sing-box: عبرdownload_detourالخاص بها، أوhttp_client(وسم منhttp_clientsأو عميل مضمَّن)، أوroute.default_http_client، وإن لم يوجد أيٌّ منها فعبر المخرج الافتراضي (route.final). ويصبح هذا المسارpolicy=الخاص بالمزود؛ أما المسار الذي يؤول إلىdirectفلا يضيف شيئاً.- تُقرأ مدة sing-box مع وحدتها: فـ
update_interval: 3dتعني ثلاثة أيام، وتُقرأdوhوmوsوmsجميعاً. وكانت الفترة التي تتعذّر قراءة وحدتها ترتد إلى القيمة الافتراضية ليوم واحد — وهو ليس ما يطلبه ملف مكتوب فيه7d. - تتبع قواعد التوجيه المفتاح
action: يستخدمroute/bypassالاتصال الصادر المسمّى، ويصبحrejectهوREJECT(ويصبحmethod: dropهوREJECT-DROP)، ولا يُنتجhijack-dnsوsniffوresolveشيئاً لأن Chute يتحكم فيها من[General]. وكما في sing-box، تكون المطابِقات من النوع نفسه داخل القاعدة بدائل، ويجب أن تتحقق الأنواع المختلفة كلها:domainوdomain_suffixوdomain_keywordوdomain_regexوip_cidrوgeoipوip_is_privateنوع واحد؛ وportوport_rangeنوع آخر، وكذلكsource_ip_cidrوsource_ip_is_private، وsource_portوsource_port_range؛ وكل مطابِق آخر نوع قائم بذاته. تصبح القاعدة ذات النوع الواحد سطراً لكل قيمة، وتصبح القاعدة ذات الأنواع المتعددة قاعدةANDواحدة — فيصبح{"network": "udp", "port": 443}هوAND,((DEST-PORT,443),(PROTOCOL,udp)). ويصبحdomain_suffixالمكتوب بنقطة في أوله (.cn) هوDOMAIN-SUFFIX,cn. وتصبح قواعدtype: logicalهيAND/OR/NOT، ويلفّinvertالقاعدة كلها داخلNOT، ويصبحport_range(a:b) وsource_port_rangeنطاقات منافذ. يُعدّrule_setشرطاً إضافياً للقاعدة أينما ورد، بما في ذلك داخل قاعدةtype: logicalأو قاعدة معكوسة (راجع القاعدة المنطقية)؛ وتكون الوسوم المتعددة في القاعدة الواحدة بدائل لبعضها. وحين يسمّي أحد تلك الوسوم مجموعة تعذّر استيرادها، يُحذف الوسم مع ملاحظة وتحتفظ القاعدة بالبقية — فتطابق حينها أقل. ولا تُحذف القاعدة كاملة إلا حين تُخفق كل الوسوم التي تسمّيها، أو حين يقعrule_setداخل قاعدةtype: logicalأو قاعدة معكوسة، حيث يغيّر حذف بديل واحد ما يطابقه باقي التعبير. ويُحذف المطابِق الذي لا مكافئ له في Chute مع تحذير إن بقي مطابِق آخر من نوعه (فتطابق القاعدة حينها أقل)؛ وإلا تُحذف القاعدة كاملة مع تحذير، بدلاً من تحويلها إلى قاعدة تطابق أكثر. - خادم DNS الذي يجيب عن كل اسم لا تتناوله أي قاعدة DNS —
dns.final، أو الخادم الأول إن لم يُكتبfinal— يصبح مفتاح DNS المناسب لنوعه في[General]، ويُكتبdetourالخاص به لاحقةَ#proxy=<policy>، والخادمlocalعلى الشكلsystem؛ ولا يُكتبproxy-dns-server. أما الخوادم الأخرى فيُوصَل إليها عبر مدخلات[Host]التي تصبحهاdns.rules، ويُكتب فيها الخادمlocalعلى الشكلserver:system، وdetourلخادم عادي أو DoH أو DoQ أو DoH3 لاحقةَ#proxy=<policy>؛ أما مدخل[Host]لخادم DoT فلا يمكنه حمل هذه اللاحقة، لذا يُسقَط الـ detour الخاص به هناك مع تحذير. وتصبح قاعدة DNS التي توجّهrule_setكاملاً إلى محلّل واحد بالصيغة المفتاحية للمجموعةRULE-SET:<tag> = server:…— لكن فقط حين يكونrule_setهو المطابِق الوحيد في القاعدة، لأن sing-box يشترط تحقّق المطابِقات من الأنواع المختلفة كلها، بينما لا يحمل مفتاح[Host]سوى شرط واحد. أما القاعدة التي تسمّي مجموعة لم يتيسّر استيرادها فلا يُكتب لها مدخل، للسبب نفسه الذي يمنع كتابة قاعدة التوجيه الخاصة بها.
ملفات Surge وShadowrocket
يُقرأ ملف إعدادات Surge أو Shadowrocket مباشرة، دون خطوة تحويل. يقبل Chute صيغ كل لهجة، فيبقى الملف الملصوق صالحاً للعمل؛ وهذه هي الصيغ التي تختلف عن مفاتيح Chute الأصلية أو التي أُضيفت للتوافق:
- مجموعات الاشتراك. يحمّل
policy-path=<url>في Surge (معupdate-interval=وpolicy-regex-filter=) أعضاء المجموعة من رابط؛ ويضيفinclude-all-proxies=trueوinclude-other-group=<name>كل البروكسيات أو أعضاء مجموعة أخرى. وتُحفظ معاملات المجموعة التي لا يستخدمها Chute، مثلno-alertأوicon-url، عند حفظ الملف. ويعنيuse=trueفي Shadowrocket أن الأسماء المذكورة في المجموعة اشتراكات لا بروكسيات، فيُقرأ كل اسم بوصفه مزوّد بروكسي. وتصبحrandomفي Shadowrocket مجموعة عشوائية. أما المجموعة من نوع لا ينفّذه Chute، مثلexternalفي Surge، فتحتفظ بأعضائها وتعمل كـselectمع ملاحظة. راجع مجموعة السياسات. - السياسات المدمجة. يشير
PROXYفي Shadowrocket إلى السياسة المختارة في وضع البروكسي العام، ما لم يعرّف الملفProxyخاصاً به؛ وتتصرف كل صيغة من صيغ REJECT (REJECT-DROPوREJECT-TINYGIFوREJECT-DICTوغيرها) كما يدل اسمها. راجع السياسة المدمجة. - القواعد.
DST-PORT، ونطاقات المنافذ، وHOSTNAME-TYPEبالقيمIPv4/IPv6/DOMAIN/SIMPLE، وIP-ASN,AS…، وFINAL,<policy>,dns-failed، وnotification-text=، وأقسام[Ruleset <name>]— راجع القواعد. وكما في Surge، تأتي قواعد الوحدات قبل قواعد الملف نفسه. - عام (Shadowrocket). يسمّي
update-urlعنوان تحديث الملف نفسه، وهو ما يكتبه Surge في ترويسة#!MANAGED-CONFIG؛ ويقرأ Chute كليهما. والملف الذي يحمل الاثنين معاً يُبقي الترويسة، لأنها وحدها القادرة على حملintervalوstrictأيضاً. أما سطرupdate-urlنفسه فيبقى بعد الحفظ، فيظل ملف Shadowrocket محفوظاً كملف Shadowrocket. ويُحتفظ بـclose-if-proxy-chain-missing، لكن Chute يرفض دائماً السياسة المُسلسلة التي فُقد منبعها، كما تفعل قيمتهtrue. أما البروكسي الأمامي في Shadowrocket (前置代理)، الذي لا يُضبط إلا في تطبيقه، فيُكتب في Chute على شكلglobal-underlying-proxy. - DNS. مفاتيح Shadowrocket
direct-dns-serverوproxy-dns-serverوfallback-dns-serverوdns-direct-systemوdns-fallback-system(الذي يضيفsystemإلىfallback-dns-serverويدمجه مع ما يعلنه الملف صراحةً) وalways-ip-address، وأسطر[Host]بالشكلssid:<name> = server:…؛ ومفاتيح Surgeencrypted-dns-serverوallow-dns-svcbو[Host] <domain> = script:<name>وserver:force-syslib. راجع خادم DNS وتعيين DNS المحلي. - الإعدادات العامة.
proxy-test-urlوtest-timeout(القيم الافتراضية لمجموعات url-test وfallback وload-balance)، وudp-policy-not-supported-behaviour، وencrypted-dns-skip-cert-verification، وhttp-api/http-api-web-dashboardاللذان يُحوَّلان إلى مفاتيح وحدة تحكم HTTP الخارجية. راجع خيارات متنوعة. - البروكسيات. الكلمة المفتاحية
tuic-v5، وقسم[WireGuard <name>]المكتوب بـpeer = (…). راجع خادم البروكسي وإعدادات WireGuard. - HTTP.
header-replace-regex، وصيغةhttp-request/http-responseفي إعادة كتابة المحتوى، و[Map Local]معdata-type=وstatus-code=وheader="Key: value|…"، وreject-array/reject-tinygifفي إعادة كتابة الرابط، ومفاتيح[MITM]h2وhostname-disabledوauto-quic-block. راجع إعادة كتابة الترويسات وإعادة كتابة المحتوى والاستجابة الوهمية وإعادة كتابة الرابط وفك تشفير HTTPS. - السكريبتات والوحدات.
cronexp=وtype=genericوevent-name=في[Script]؛ و#!system_versionو#!REQUIREMENTو#!IOS-ONLY/#!MACOS-ONLY/#!TVOS-ONLYو%APPEND%/%INSERT%في[General]الخاص بالوحدة. ويُسجَّل#!system_versionو#!REQUIREMENTفحسب: يقرأهما Chute من الوحدة، ولا يعرضهما أي تطبيق، ولا يتحكم أيٌّ منهما في تحميل الوحدة من عدمه. راجع برمجة JavaScript والوحدات. - الأقسام التي لا ينفّذها Chute —
[Keystore]و[Port Forwarding]و[Testing]و[DHCP]و[Snell Server]و[Panel]و[Ponte]و[MTProto]— تُحمَّل مع ملاحظة واحدة لكل منها، وتُحفظ كما هي؛ ويُقرأ[Tailscale <name>]على أنه[Tailscale]. راجع الإعدادات.
غير المتاح: سطر [Proxy] يسمّي بروتوكولاً لا ينفّذه Chute ليس خطأ في الإعدادات. تُسقط السياسة مع ملاحظة، ويبقى السطر عند الحفظ كما كُتب تماماً، وتصبح الإشارات إلى تلك السياسة معلّقة — فتفشل فشلاً مغلقاً إلى REJECT في وقت التشغيل بدل أن تتسرب إلى DIRECT. البروتوكولات المعروفة بهذه الطريقة هي: snell وexternal وh2-connect وtrust-tunnel من Surge؛ وhysteria (الإصدار 1) وjuicity وsudoku وopenconnect وmieru وbrook وlua وhttp2 وhttp3 وrelay وsubscribe من Shadowrocket؛ وtailscale الذي يضبطه Chute مرة واحدة في قسم [Tailscale] ويستخدمه عبر السياسة المدمجة TAILSCALE. وبالمثل يُتجاهل مفتاح [General] الذي لا مكافئ له في Chute مع ملاحظة ويبقى سطره كما كُتب.
القيود
- يحمل تسلسل البروكسي TCP وUDP. يصبح
dialer-proxyفي mihomo وdetourفي sing-box مراجعunderlying-proxy، وتبقى مجموعاتrelayفي Clash مجموعات ترحيل بترتيب قفزاتها نفسه، ويصبح مسار تنزيل المزود (proxy:في mihomo، وdownload_detourأوhttp_clientفي sing-box) هوpolicy=الخاص به. تُرفض الحلقات والمراجع المفقودة وقفزات QUIC أو WireGuard عبر منبع لا يحمل UDP وتُسجّل بدلاً من إرسالها مباشرة؛ أما عقدة Shadowsocks التي تستخدمudp-over-tcpفتحمل UDP عبر منبع كهذا أيضاً. - تُسقَط الخيارات التي لا مكافئ لها في Chute مع تحذير بدلاً من إسقاطها بصمت: على مستوى البروكسي
ip-versionوinterface-nameوrouting-markوmptcpوpacket-encodingوglobal-paddingوauthenticated-lengthوencryption، وudp-over-tcp/udp-over-tcp-versionعلى أي بروكسي غيرss؛ وعلى مستوى المجموعةdisable-udpوinterface-nameوrouting-mark؛ والمفاتيح العامةgeodata-modeوgeox-urlوfind-process-modeوunified-delayوtproxy-portوredir-portوغيرها. ويُستثنى من ذلكiconالخاص بالمجموعة: فهو صورة، ولا يغيّر حركة مرور، ويُسقَط بصمت. - تُتخطى أنواع القواعد التي لا مكافئ لها:
IP-SUFFIXوSRC-IP-SUFFIXوSRC-GEOIPوSRC-IP-ASNوDSCPوUIDوPROCESS-PATH-REGEXوIP-ACCEPTوREMATCH-NAME. كما تُتخطى القاعدة التي تحمل المُعدِّلsrcالخاص بـ mihomo، بدلاً من مطابقتها على الطرف الخطأ. - تسمّي
GEOSITEوفئاتGEOIPالتي ليست رموز دول بمعيار ISO مجموعاتٍ في ملفات بيانات mihomo الجغرافية، وهي ملفات لا يحملها Chute. وتصبحGEOIP,privateوGEOIP,lanهيRULE-SET,LAN، أي مجموعة العناوين الخاصة المدمجة، على كل المنصات — دون أي تنزيل. أما البقية فتتوقف على المكان الذي يجري فيه الاستيراد: على macOS تصبح القاعدةRULE-SET,geosite-<tag>(أوgeoip-<tag>) ويُولَّد إلى جانبها سطر[Rule Provider]يشير إلى حمولة YAML المنشورة لتلك المجموعة، ويمكنك توجيهه إلى غيرها أو حذفه كأي سطر آخر. وعلى iOS و Apple TV و Android تُسقَط القاعدة مع رسالة تقول ذلك، لأن تلك المجموعات أكبر مما تستطيع المنصة تحويله — استورد ملف الإعدادات على حاسوب مكتبي للاحتفاظ بها. أما رمز الدولة بمعيار ISO فيذهب إلى قاعدة بيانات GeoIP المدمجة ولا يحتاج مجموعة إطلاقاً. - لا تُنقل تفاصيل البروتوكول التي يديرها 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). ويُستثنى من ذلك الاتصال الصادر في sing-box الذي يكونtransport.typeفيهhttpupgradeأوquic: فلا يُنتَج له شيء ولا يُبلَّغ عنه شيء كذلك، فافحص تلك الاتصالات الصادرة يدوياً بعد الاستيراد. - إن
modeالتشغيلي في Clash هو مفتاح تبديل أثناء التشغيل في Chute، وليس مفتاح إعدادات؛ وملف الإعدادات في وضعglobalأوdirectيُحوَّل إلى وضع القواعد مع تحذير. - تُقرأ YAML بمحلل قياسي، لذا تعمل المراسي (anchors) ومفتاح الدمج
<<. أما القيمة المكتوبة كقيمة قياسية متعددة الأسطر فتُطوى في سطر واحد، لأن السطر الجديد سيقسم سطر الإعدادات الذي تقع فيه. - ملف الإعدادات الذي تكون فيه أسماء السياسات عناصر نائبة على هيئة
{...}— وهو ما يُخرجه مولّد الاشتراكات قبل خطوة الاستبدال الخاصة به — يُسمّى قالباً: يقول الاستيراد ذلك مرة واحدة، بدل الاكتفاء بالإبلاغ عن كل إشارة إلى عنصر نائب بوصفها سياسة غير معرّفة.
هذه الصفحة ترجمة للنسخة الإنجليزية. في حال وجود اختلاف، يُعتمد على النسخة الإنجليزية.
ملاحظة: التطبيق لا يدعم اللغة العربية حاليًا.