الاستيراد

يستطيع 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:…؛ ومفاتيح Surge encrypted-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) ومفتاح الدمج <<. أما القيمة المكتوبة كقيمة قياسية متعددة الأسطر فتُطوى في سطر واحد، لأن السطر الجديد سيقسم سطر الإعدادات الذي تقع فيه.
  • ملف الإعدادات الذي تكون فيه أسماء السياسات عناصر نائبة على هيئة {...} — وهو ما يُخرجه مولّد الاشتراكات قبل خطوة الاستبدال الخاصة به — يُسمّى قالباً: يقول الاستيراد ذلك مرة واحدة، بدل الاكتفاء بالإبلاغ عن كل إشارة إلى عنصر نائب بوصفها سياسة غير معرّفة.
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

هذه الصفحة ترجمة للنسخة الإنجليزية. في حال وجود اختلاف، يُعتمد على النسخة الإنجليزية.

ملاحظة: التطبيق لا يدعم اللغة العربية حاليًا.

results matching ""

    No results matching ""