การนำเข้า
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 offpluginของพร็อกซี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-serverfake-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-testpluginของ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-keyoutbound ที่ไม่มีค่านี้จะถูกแปลงพร้อมคำเตือน เพราะการจับมือ 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]ซึ่งใช้ผ่านนโยบายในตัวTAILSCALEendpoint ประเภทอื่นจะถูกข้ามพร้อมคำเตือน ชื่อส่วนคือชื่อนโยบายที่ตัดช่องว่างและวงเล็บเหลี่ยมออก เพราะรูปแบบบรรทัดของการกำหนดค่าจะตัดช่องว่างทิ้งเมื่อจับคู่กับ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-closeddetourของ 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 จึงยังบันทึกกลับเป็นโปรไฟล์ Shadowrocketclose-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 และคีย์ผสาน
<<จึงใช้งานได้ ค่าที่เขียนเป็นสเกลาร์หลายบรรทัดจะถูกยุบให้เหลือบรรทัดเดียว เพราะการขึ้นบรรทัดใหม่จะทำให้บรรทัดการกำหนดค่าที่มันไปอยู่ถูกแบ่งออกจากกัน - โปรไฟล์ที่ชื่อนโยบายเป็นตัวยึดตำแหน่งแบบ
{...}— สิ่งที่ตัวสร้างการสมัครสมาชิกสร้างออกมาก่อนขั้นตอนแทนค่าของมันเอง — จะถูกระบุว่าเป็นเทมเพลต: การนำเข้าจะบอกครั้งเดียว แทนที่จะรายงานเพียงว่าทุกการอ้างถึงตัวยึดตำแหน่งเป็นนโยบายที่ไม่ได้นิยามไว้
หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก