การนำเข้า

Chute สามารถนำเข้าการกำหนดค่าพร็อกซีที่เขียนไว้สำหรับไคลเอนต์อื่นได้ โดยรองรับข้อมูลนำเข้าสองแบบ: ลิงก์แชร์ ของโหนดเดี่ยว (ss://, vmess://, …) และโปรไฟล์ทั้งไฟล์ในรูปแบบ Clash/mihomo YAML หรือ sing-box JSON ทั้งสองแบบจะถูกแปลงเป็นการกำหนดค่าแบบเนทีฟของ Chute — สิ่งที่คุณได้หลังจากนั้นคือโปรไฟล์ Chute ธรรมดาที่มีส่วน [Proxy], [Proxy Group] และ [Rule] ไม่ใช่ไฟล์ของไคลเอนต์อื่นที่ Chute ต้องคอยตีความอยู่ตลอด

ที่อยู่ http:// และ https:// จะไม่ถูกถือว่าเป็นลิงก์แชร์เลย แต่ถือเป็นที่อยู่การสมัครสมาชิก: เนื้อหาจะถูกดาวน์โหลดก่อน แล้วจึงนำเข้าตามชนิดของเนื้อหาที่ได้รับมา


ลิงก์แชร์ — ลิงก์เดียว หรือการสมัครสมาชิกที่เนื้อหาเป็นรายการของลิงก์เหล่านั้น — นำเข้าได้เฉพาะใน Chute Mac เท่านั้น Chute iOS ไม่มีการนำเข้าลิงก์แชร์: ตัวช่วยตั้งค่าในการเปิดครั้งแรกของมันตั้งค่าเซิร์ฟเวอร์ได้หนึ่งเครื่องจาก QR Code ที่สแกน ซึ่งบรรจุลิงก์ 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 … เพื่อให้กฎและกลุ่มยังอ้างถึงแต่ละโหนดได้อย่างเจาะจง บรรทัดที่แยกวิเคราะห์ไม่ได้จะถูกรายงานเป็นคำเตือน ขณะที่เพย์โหลดส่วนที่เหลือยังคงถูกนำเข้าตามปกติ การนำเข้าจะล้มเหลวก็ต่อเมื่อไม่มีอะไรแปลงได้เลยเท่านั้น

ลิงก์ที่มีสคีมไม่อยู่ในตารางข้างต้นจะไม่ถูกถือว่าเป็นลิงก์แชร์ ส่วนลิงก์ที่ใช้สคีมที่รู้จักแต่ขาดฟิลด์ที่จำเป็นจะถูกปฏิเสธพร้อมข้อความที่ระบุชื่อสคีมนั้น

ระบบจะอ่านเฉพาะพารามิเตอร์ query ด้านล่างนี้เท่านั้น อย่างอื่นในลิงก์จะถูกละเว้น

คำว่า "ลิงก์แบบ query" ด้านล่างหมายถึงทุกสคีมที่พกการตั้งค่ามาในสตริง query ได้แก่ vless://, trojan://, hysteria2://, tuic://, anytls://, socks5:// และ ssh:// ส่วน ss:// และ vmess:// ถูกอ่านด้วยตัวแยกวิเคราะห์ของตัวเอง และอธิบายไว้ถัดจากตาราง

พารามิเตอร์ ใช้กับ แปลงเป็น
sni, peer, servername ลิงก์แบบ query sni
alpn (คั่นด้วยคอมมา) ลิงก์แบบ query alpn (ค่าถูกเชื่อมด้วย `\ `) — อ่านโดยนโยบาย TUIC, Hysteria2 และ MASQUE เท่านั้น ดูพารามิเตอร์ทั่วไป
fp ลิงก์แบบ query fingerprint (โปรไฟล์ ClientHello ของ uTLS)
allowInsecure, insecure, skip-cert-verify ลิงก์แบบ query skip-cert-verify=true
security=tls, xtls, reality ลิงก์แบบ query 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 ลิงก์แบบ query ws=true, ws-path, ws-headers=Host:…
type/network=grpc + serviceName, servicename (หรือ path) ลิงก์แบบ query grpc=true, grpc-service-name
type/network=xhttp หรือ splithttp + path, host, mode ลิงก์แบบ query xhttp=true, xhttp-path, xhttp-host, xhttp-mode
obfs, obfs-password (รวมถึง obfs_password), up, down Hysteria2 ชื่อตัวเลือกเดิม
plugin=… Shadowsocks ดูด้านล่าง

ss:// อ่านจาก query เพียง plugin เท่านั้น ดังนั้น sni, alpn, fp, allowInsecure, security และ type= ที่เขียนลงในลิงก์ Shadowsocks จึงถูกละเว้น ส่วน vmess:// ไม่มี query เลย มันรับการตั้งค่าเดียวกันนี้จากฟิลด์ 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% ก็ยังนำเข้าและทำงานได้

ชื่อโหนดจะถูกเขียนใหม่ในจุดที่มันจะทำให้รูปแบบการกำหนดค่าเสียหาย: , จะกลายเป็นช่องว่าง และ = จะกลายเป็น - และชื่อที่ไปชนกับชื่ออื่นหลังจากนั้นจะได้รับส่วนต่อท้ายเป็นตัวเลข สมาชิกของกลุ่มและปลายทางของกฎจะถูกเขียนใหม่ให้ตรงกัน ทุกการอ้างอิงจึงยังชี้ไปยังโหนดเดิม พร็อกซี/outbound ที่เป็น direct จะถูกแมปไปยัง DIRECT ในตัว ส่วน reject / block / dns จะถูกแมปไปยัง REJECT

หมายเหตุ: โปรไฟล์ที่ผ่านการแปลงแล้วเป็นสแนปช็อตแบบคงที่ Chute จะดาวน์โหลดการสมัครสมาชิกใหม่แล้วแยกวิเคราะห์เป็นโปรไฟล์แบบเนทีฟ ดังนั้นโปรไฟล์ที่ต้องผ่านการแปลงจะถูกบันทึกโดยไม่มี URL สำหรับอัปเดตอัตโนมัติ และจะไม่รีเฟรชตัวเอง

หมายเหตุการแปลง 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 จะถูกรายงานว่าเป็นประเภทพร็อกซีที่ไม่รองรับ
  • คีย์ fingerprint สองตัวของ mihomo มีความหมายต่างกันและถูกแยกจากกัน: client-fingerprint จะกลายเป็น fingerprint (โปรไฟล์ ClientHello ของ uTLS) ส่วน 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 จะถูกแปลงพร้อมตัวเลือกการตรวจสอบสถานะ (health check) ของมัน กลุ่ม relay จะคงเป็นกลุ่ม relay โดยสมาชิกอยู่ในลำดับเดิม: สมาชิกตัวแรกเชื่อมต่อโดยตรงและสมาชิกตัวสุดท้ายเชื่อมต่อไปยังปลายทาง สมาชิกที่มาจาก use: จะกลายเป็นการอ้างอิงแบบ policy-provider:<name> และ include-all / include-all-proxies / include-all-providers จะถูกขยายเป็นรายชื่อสมาชิกแบบชัดเจน
  • filter และ exclude-filter จะถูกนำมาด้วยในรูปแบบที่ใส่เครื่องหมายคำพูด แต่รูปแบบ (pattern) ที่มีคอมมาหรือเครื่องหมายคำพูดอยู่ภายในไม่สามารถคงอยู่ในรูปแบบบรรทัดของการกำหนดค่าได้ จึงถูกตัดทิ้งพร้อมคำเตือน
  • 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 แบบ inline (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 จะกลายเป็น port ของ HTTP (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 มีเพียงชนิดเดียวคือแบบ glob ดังนั้น 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

  • ประเภท outbound ที่แปลงได้: 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 ปลั๊กอินอื่นจะถูกรายงานและตัดทิ้ง outbound ยังคงถูกเขียนออกมา แต่จะเชื่อมต่อกับเซิร์ฟเวอร์ที่ต้องใช้ปลั๊กอินนั้นไม่ได้ outbound แบบ trojan จะได้ tls=true ก็ต่อเมื่อตั้ง tls.enabled ไว้ เหมือนใน sing-box หากไม่ตั้ง outbound นั้นจะถูกนำเข้าเป็น Trojan แบบข้อความธรรมดา — ให้เพิ่ม tls=true เว้นแต่เซิร์ฟเวอร์ใช้ข้อความธรรมดาจริง ๆ
  • ภายใน outbound: 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 outbound ที่ไม่มีค่านี้จะถูกแปลงพร้อมคำเตือน เพราะการจับมือ REALITY ของมันไม่มีทางสำเร็จ รายการ host_key ของ SSH จะกลายเป็น server-fingerprint="…" เดียวในเครื่องหมายคำพูดที่รวมคีย์ทั้งหมด รายการที่มีเครื่องหมายคำพูดหรือจุลภาคจะถูกรายงานและตัดทิ้ง outbound แบบ wireguard รุ่นเก่าจะเก็บรายการ local_address ไว้เป็น self-ip และ self-ip-v6 (ที่อยู่แรกของแต่ละตระกูล) เก็บ pre_shared_key เป็น preshared-key และเก็บ reserved เป็น reserved="a,b,c" ในเครื่องหมายคำพูด ส่วนรายการ peers จะถูกรายงานและตัดทิ้ง เพราะ Chute กำหนดค่า peer เพียงตัวเดียว
  • endpoints (sing-box 1.11 ขึ้นไป) ก็ถูกแปลงด้วย: endpoint แบบ wireguard จะกลายเป็นนโยบาย wireguard ที่มีส่วน [WireGuard <tag>] ของตัวเอง โดย allowed_ips ของ peer จะกลายเป็น allowed-ips ของส่วนนั้น และ endpoint แบบ tailscale ตัวแรกจะกลายเป็นส่วน [Tailscale] ซึ่งใช้ผ่านนโยบายในตัว TAILSCALE endpoint ประเภทอื่นจะถูกข้ามพร้อมคำเตือน ชื่อส่วนคือชื่อนโยบายที่ตัดช่องว่างและวงเล็บเหลี่ยมออก เพราะรูปแบบบรรทัดของการกำหนดค่าจะตัดช่องว่างทิ้งเมื่อจับคู่กับ section-name= และนโยบายสองรายการที่ชนกันหลังตัดแล้วจะได้ส่วนต่อท้าย -2, -3 …
  • ฟิลด์การเชื่อมต่อจะถูกจับคู่เหมือนเส้นทาง mihomo: tcp_fast_open กลายเป็น tfo=true และ network: tcp กลายเป็น udp-relay=false ส่วน udp_over_tcp ของ outbound แบบ shadowsocks — true หรือ {"enabled": true, "version": 1} — จะกลายเป็น udp-over-tcp=true และจะเขียน udp-over-tcp-version=1 เฉพาะเวอร์ชัน 1 เท่านั้น เพราะค่าเริ่มต้นของ sing-box คือเวอร์ชัน 2 ซึ่งเป็นค่าเริ่มต้นของ Chute ด้วย ส่วน multiplex ที่เปิดใช้งานไว้จะไม่ถูกนำมาด้วยโดยตั้งใจ: sing-box เจรจา smux / yamux / h2mux ด้วยแพดดิงของตัวเอง ขณะที่ mux ของ Chute ใช้รูปแบบเฟรมของตัวเองซึ่งเซิร์ฟเวอร์ sing-box อ่านไม่ได้ outbound จึงถูกแปลงโดยไม่มีมัลติเพล็กซ์และมีคำเตือนบอกไว้ ส่วน detour จะกลายเป็นการอ้างอิง underlying-proxy= ที่ทำงานจริง detour ที่ซ้อนกันจะสร้างหลายฮอป ส่วนวงจรและการอ้างอิงที่หายไปจะ fail-closed detour ของ endpoint แบบ wireguard ก็ถูกเก็บไว้เช่นกัน และทันเนลของมันจะผ่านรีเลย์ UDP ของอัปสตรีมนั้น ส่วน endpoint แบบ tailscale ที่มี detour อื่นที่ไม่ใช่ direct จะไม่ถูกนำเข้า และการอ้างอิงถึงมันจะ fail-closed พร้อมคำเตือน
  • 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 จะถูกดมกลิ่นเฉพาะบนเส้นทางของ rule provider แบบ Clash เท่านั้น ซึ่ง mihomo ก็อนุมานรูปแบบจากนามสกุลแบบเดียวกัน บน macOS ตัวนำเข้าจะเขียน URL ใหม่ให้ชี้ไปยังเพย์โหลดแบบ source ที่ผู้เผยแพร่วางไว้ข้างกันเมื่อมีให้ ส่วนบน iOS, Apple TV และ Android จะไม่ทำ เพราะชุดกฎที่เผยแพร่เป็นไบนารีนั้นใหญ่เกินกว่าที่แพลตฟอร์มเหล่านั้นจะโหลดได้อยู่แล้ว โปรไฟล์ที่นำเข้าด้วยเวอร์ชันก่อนหน้าเขียนชุดกฎเหล่านี้เป็น format=mihomo-yaml และโหลดกฎไม่ได้เลย ตอนนี้โหลดได้โดยไม่ต้องนำเข้าใหม่ ชุดกฎระยะไกลจะถูกดาวน์โหลดแบบเดียวกับที่ sing-box ดาวน์โหลด: ผ่าน download_detour, http_client (แท็กจาก http_clients หรือไคลเอนต์แบบ inline) หรือ route.default_http_client และถ้าไม่มีสิ่งใดเลย ก็ผ่าน outbound เริ่มต้น (route.final) เส้นทางนั้นจะกลายเป็น policy= ของผู้ให้บริการ ส่วนเส้นทางที่ได้ผลเป็น direct จะไม่เพิ่มอะไร
  • ระยะเวลาของ sing-box จะถูกอ่านพร้อมหน่วย: update_interval: 3d คือสามวัน และอ่านได้ทั้ง d, h, m, s และ ms ส่วนช่วงเวลาที่อ่านหน่วยไม่ออกจะย้อนไปใช้ค่าเริ่มต้นหนึ่งวัน ซึ่งไม่ใช่สิ่งที่โปรไฟล์ที่เขียน 7d ต้องการ
  • กฎการกำหนดเส้นทางเป็นไปตามคีย์ action: route/bypass ใช้ outbound ที่ระบุ, 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=) โหลดสมาชิกของกลุ่มจาก URL ส่วน include-all-proxies=true และ include-other-group=<name> จะเพิ่มพร็อกซีทั้งหมดหรือสมาชิกของอีกกลุ่มหนึ่ง พารามิเตอร์กลุ่มที่ Chute ไม่ได้ใช้ เช่น no-alert หรือ icon-url จะถูกเก็บไว้เมื่อบันทึกโปรไฟล์ use=true ของ Shadowrocket หมายความว่าชื่อที่ระบุในกลุ่มเป็นการสมัครสมาชิก ไม่ใช่พร็อกซี และแต่ละชื่อจะถูกอ่านเป็นผู้ให้บริการพร็อกซี random ของ Shadowrocket จะกลายเป็นกลุ่ม Random กลุ่มที่มีประเภทที่ 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 direct-dns-server, proxy-dns-server, fallback-dns-server, dns-direct-system, dns-fallback-system (ซึ่งเพิ่ม system ต่อท้าย fallback-dns-server และรวมกับที่โปรไฟล์ประกาศไว้เอง) และ always-ip-address ของ Shadowrocket และบรรทัด [Host] รูปแบบ ssid:<name> = server:… รวมถึง encrypted-dns-server, allow-dns-svcb, [Host] <domain> = script:<name> และ server:force-syslib ของ Surge ดูเซิร์ฟเวอร์ 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 ของ Body Rewrite, [Map Local] ที่ใช้ data-type=, status-code= และ header="Key: value|…", reject-array / reject-tinygif ของ URL Rewrite และ h2, hostname-disabled และ auto-quic-block ของ [MITM] ดู Header Rewrite, Body Rewrite, การตอบกลับจำลอง, URL Rewrite และการถอดรหัส 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 ไม่ได้ใช้งาน ไม่ใช่ ข้อผิดพลาดในการกำหนดค่า นโยบายนั้นจะถูกทิ้งพร้อมหมายเหตุ บรรทัดยังคงอยู่ตามที่เขียนไว้เมื่อบันทึก และการอ้างถึงนโยบายนั้นจะกลายเป็นการอ้างอิงค้าง — ซึ่งจะ fail-closed เป็น REJECT ที่รันไทม์ แทนที่จะรั่วไปเป็น DIRECT โปรโตคอลที่รู้จักด้วยวิธีนี้ได้แก่ snell, external, h2-connect, trust-tunnel ของ Surge; hysteria (v1), 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 จะคงเป็นกลุ่ม Relay ตามลำดับฮอปเดิม และเส้นทางดาวน์โหลดของผู้ให้บริการ (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; และคีย์ในส่วน General ได้แก่ 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 ล้วนอ้างถึงชุดข้อมูลในไฟล์ geo ของ mihomo ซึ่ง Chute ไม่ได้พกมาด้วย GEOIP,private และ GEOIP,lan จะกลายเป็น RULE-SET,LAN ซึ่งเป็นชุดที่อยู่ส่วนตัวในตัวของ Chute บนทุกแพลตฟอร์ม โดยไม่ต้องดาวน์โหลด ที่เหลือขึ้นอยู่กับว่าการนำเข้าทำงานอยู่ที่ใด: บน macOS กฎจะกลายเป็น RULE-SET,geosite-<tag> (หรือ geoip-<tag>) พร้อมบรรทัด [Rule Provider] ที่ถูกสร้างขึ้นคู่กัน ชี้ไปยังเพย์โหลด YAML ที่เผยแพร่ไว้สำหรับชุดนั้น ซึ่งคุณชี้ไปที่อื่นหรือลบทิ้งได้เหมือนบรรทัดอื่น ๆ ส่วนบน iOS, Apple TV และ Android กฎจะถูกตัดทิ้งพร้อมข้อความบอกเช่นนั้น เพราะชุดเหล่านั้นใหญ่เกินกว่าที่แพลตฟอร์มจะแปลงไหว — หากต้องการเก็บไว้ ให้นำเข้าโปรไฟล์บนเดสก์ท็อป ส่วนรหัสประเทศแบบ ISO ยังคงไปที่ฐานข้อมูล GeoIP ที่มาพร้อมแอปและไม่ต้องใช้ชุดกฎใด ๆ
  • รายละเอียดของโปรโตคอลที่ Chute จัดการเองจะไม่ถูกนำมาด้วย: การสลับพอร์ต (port hopping) ของ 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) ข้อยกเว้นคือ outbound ของ sing-box ที่ transport.type เป็น httpupgrade หรือ quic: จะไม่มีอะไรถูกสร้างขึ้นและไม่มีอะไรถูกรายงานด้วย ดังนั้นให้ตรวจ outbound เหล่านั้นด้วยตัวเองหลังนำเข้า
  • mode การทำงานของ Clash เป็นสวิตช์ระดับรันไทม์ใน Chute ไม่ใช่คีย์ในไฟล์การกำหนดค่า โปรไฟล์ที่อยู่ในโหมด global หรือ direct จะถูกแปลงเป็นโหมดกฎพร้อมคำเตือน
  • YAML ถูกอ่านด้วยตัวแยกวิเคราะห์มาตรฐาน ดังนั้น anchor และคีย์ผสาน << จึงใช้งานได้ ค่าที่เขียนเป็นสเกลาร์หลายบรรทัดจะถูกยุบให้เหลือบรรทัดเดียว เพราะการขึ้นบรรทัดใหม่จะทำให้บรรทัดการกำหนดค่าที่มันไปอยู่ถูกแบ่งออกจากกัน
  • โปรไฟล์ที่ชื่อนโยบายเป็นตัวยึดตำแหน่งแบบ {...} — สิ่งที่ตัวสร้างการสมัครสมาชิกสร้างออกมาก่อนขั้นตอนแทนค่าของมันเอง — จะถูกระบุว่าเป็นเทมเพลต: การนำเข้าจะบอกครั้งเดียว แทนที่จะรายงานเพียงว่าทุกการอ้างถึงตัวยึดตำแหน่งเป็นนโยบายที่ไม่ได้นิยามไว้
S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-30 15:11:19

หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก

results matching ""

    No results matching ""