การนำเข้า
Chute สามารถนำเข้าการกำหนดค่าพร็อกซีที่เขียนไว้สำหรับไคลเอนต์อื่นได้ โดยรองรับข้อมูลนำเข้าสองแบบ: ลิงก์แชร์ ของโหนดเดี่ยว (ss://, vmess://, …) และโปรไฟล์ทั้งไฟล์ในรูปแบบ Clash/mihomo YAML หรือ sing-box JSON ทั้งสองแบบจะถูกแปลงเป็นการกำหนดค่าแบบเนทีฟของ Chute — สิ่งที่คุณได้หลังจากนั้นคือโปรไฟล์ Chute ธรรมดาที่มีส่วน [Proxy], [Proxy Group] และ [Rule] ไม่ใช่ไฟล์ของไคลเอนต์อื่นที่ Chute ต้องคอยตีความอยู่ตลอด
ที่อยู่ http:// และ https:// จะไม่ถูกถือว่าเป็นลิงก์แชร์เลย แต่ถือเป็นที่อยู่แบบ subscription: เนื้อหาจะถูกดาวน์โหลดก่อน แล้วจึงนำเข้าตามชนิดของเนื้อหาที่ได้รับมา
ลิงก์แชร์
| สคีม | ประเภทนโยบายที่ได้ | พอร์ตเริ่มต้น |
|---|---|---|
ss:// |
ss |
8388 |
vmess:// |
vmess |
443 |
vless:// |
vless |
443 |
trojan:// |
trojan |
443 |
hysteria2://, hy2:// |
hysteria2 |
443 |
tuic:// |
tuic |
443 |
anytls:// |
anytls |
443 |
socks5://, socks:// |
socks5 |
1080 |
ssh:// |
ssh |
22 |
ลิงก์ส่วนใหญ่ใช้รูปแบบ userinfo@host:port?query#name มีสองแบบที่ต่างออกไป: vmess:// บรรจุอ็อบเจกต์ JSON ที่เข้ารหัส base64 (รูปแบบของ v2rayN ซึ่งใช้ชื่อฟิลด์ add / ps / scy / net / aid) ส่วน ss:// รองรับทั้งแบบ SIP002 (base64(method:password)@host:port) และแบบเก่าที่เข้ารหัสทั้งก้อน base64(method:password@host:port) เพย์โหลด base64 อาจไม่มี padding และอาจใช้ชุดอักขระแบบ URL-safe ก็ได้
trojan://[email protected]:443?sni=example.com&alpn=h2,http/1.1#Tokyo%20Node
จะถูกแปลงเป็น:
[Proxy]
Tokyo Node = trojan, example.com, 443, password=password, tls=true, sni=example.com, alpn=h2|http/1.1
ข้อความหลัง # จะถูกถอดรหัส percent-encoding และกลายเป็นชื่อนโยบาย ส่วน vmess:// จะใช้ค่าจากฟิลด์ ps แทน ลิงก์ที่ไม่มีชื่อจะถูกตั้งชื่อเป็น host:port อักขระที่รูปแบบการกำหนดค่าสงวนไว้ — =, ,, [, ], ", แท็บ และการขึ้นบรรทัดใหม่ — จะถูกแทนที่ด้วยช่องว่างในชื่อ
Trojan, Hysteria2, TUIC และ AnyTLS เป็นโปรโตคอลที่ใช้ TLS เท่านั้น จึงมีการเพิ่ม tls=true ให้แม้ลิงก์จะไม่ได้ระบุไว้ก็ตาม
ลิงก์หลายรายการ เพย์โหลดหนึ่งชุดอาจมีลิงก์แชร์หลายรายการคั่นด้วยการขึ้นบรรทัดใหม่ และอาจถูกห่อด้วย base64 อีกหนึ่งชั้นด้านนอกก็ได้ ทุกบรรทัดที่แยกวิเคราะห์สำเร็จจะกลายเป็นนโยบายหนึ่งรายการ และชื่อที่ซ้ำกันจะได้รับส่วนต่อท้าย 2, 3 … เพื่อให้กฎและกลุ่มยังอ้างถึงแต่ละโหนดได้อย่างเจาะจง บรรทัดที่แยกวิเคราะห์ไม่ได้จะถูกรายงานเป็นคำเตือน ขณะที่เพย์โหลดส่วนที่เหลือยังคงถูกนำเข้าตามปกติ การนำเข้าจะล้มเหลวก็ต่อเมื่อไม่มีอะไรแปลงได้เลยเท่านั้น
ลิงก์ที่มีสคีมไม่อยู่ในตารางข้างต้นจะไม่ถูกถือว่าเป็นลิงก์แชร์ ส่วนลิงก์ที่ใช้สคีมที่รู้จักแต่ขาดฟิลด์ที่จำเป็นจะถูกปฏิเสธพร้อมข้อความที่ระบุชื่อสคีมนั้น
พารามิเตอร์ที่รองรับ
ระบบจะอ่านเฉพาะพารามิเตอร์ query ด้านล่างนี้เท่านั้น อย่างอื่นในลิงก์จะถูกละเว้น
| พารามิเตอร์ | ใช้กับ | แปลงเป็น | |
|---|---|---|---|
sni, peer, servername |
ทั้งหมด | sni |
|
alpn (คั่นด้วยคอมมา) |
ทั้งหมด | alpn (ค่าถูกเชื่อมด้วย `\ |
`) |
fp |
ทั้งหมด | fingerprint (โปรไฟล์ ClientHello ของ uTLS) |
|
allowInsecure, insecure, skip-cert-verify |
ทั้งหมด | skip-cert-verify=true |
|
security=tls, xtls, reality |
ทั้งหมด | tls=true |
|
pbk, sid |
REALITY | reality=true, public-key, short-id |
|
flow |
VLESS | xtls=true, flow |
|
type/network=ws + path, host |
ทั้งหมด | ws=true, ws-path, ws-headers=Host:… |
|
type/network=grpc + serviceName (หรือ path) |
ทั้งหมด | grpc=true, grpc-service-name |
|
type/network=xhttp หรือ splithttp + path, host, mode |
ทั้งหมด | xhttp=true, xhttp-path, xhttp-host, xhttp-mode |
|
obfs, obfs-password, up, down |
Hysteria2 | ชื่อตัวเลือกเดิม | |
plugin=… |
Shadowsocks | ดูด้านล่าง |
ค่า plugin ของ Shadowsocks จะถูกอ่านในรูปแบบ name;key=value;… โดย obfs-local / simple-obfs / obfs จะกลายเป็น obfs และ obfs_param ส่วน v2ray-plugin ในโหมด websocket (ซึ่งเป็นค่าเริ่มต้น) จะกลายเป็น ws=true พร้อม ws-path และ ws-headers ปลั๊กอินอื่นนอกจากนี้จะทำให้เกิดคำเตือนและไม่ถูกนำมาด้วย — นโยบายที่ได้จะเชื่อมต่อกับเซิร์ฟเวอร์ที่ต้องใช้ปลั๊กอินนั้นไม่ได้
หมายเหตุ: ค่า
aid(alterId) ของ VMess ที่ไม่ใช่ศูนย์จะถูกรายงานเป็นคำเตือน Chute รองรับเฉพาะ VMess AEAD เท่านั้น เซิร์ฟเวอร์ที่ยังต้องใช้การจับมือแบบ MD5 รุ่นเก่าจะยืนยันตัวตนไม่ผ่าน
การนำเข้าโปรไฟล์
รูปแบบที่รับรู้ได้มีสามแบบ:
| รูปแบบ | การจัดการ |
|---|---|
| โปรไฟล์ Chute/Surge แบบเนทีฟ | ใช้ตามเดิม ไม่มีขั้นตอนการแปลง |
| Clash / mihomo YAML | แปลงเป็นการกำหนดค่าแบบเนทีฟ |
| sing-box JSON | แปลงเป็นการกำหนดค่าแบบเนทีฟ |
รูปแบบจะถูกตรวจหาจากเนื้อหา โดยใช้ชื่อไฟล์เป็นเพียงตัวช่วยชี้แนะเท่านั้น เนื้อหาที่ขึ้นต้นด้วย { จะถูกถือเป็น sing-box JSON ไม่ว่าไฟล์จะชื่ออะไรก็ตาม (โปรไฟล์ sing-box ที่บันทึกเป็น .yaml ก็ยังแยกวิเคราะห์เป็น YAML ได้ ดังนั้นจะเชื่อเพียงชื่อไฟล์อย่างเดียวไม่ได้) นอกจากนั้น นามสกุล .conf หมายถึงแบบเนทีฟ, .json หมายถึง sing-box และ .yaml / .yml หมายถึง Clash เมื่อไม่มีชื่อไฟล์ที่ใช้ได้ — เช่น เนื้อหาที่ได้จาก subscription — บรรทัดแรกที่มีความหมายจะเป็นตัวตัดสิน: #!MANAGED-CONFIG หรือหัวข้อส่วน [Section] หมายถึงแบบเนทีฟ ส่วน proxies:, proxy-groups:, rules:, proxy-providers: หรือ rule-providers: หมายถึง Clash อย่างอื่นนอกจากนี้จะถูกถือเป็นแบบเนทีฟ
เอกสารที่แยกวิเคราะห์ได้แต่ไม่มีส่วนใดเลยที่บ่งบอกรูปแบบของตัวเองจะถูกปฏิเสธ แทนที่จะรายงานว่านำเข้าสำเร็จโดยไม่ได้อะไรเลย: Clash YAML ต้องมีอย่างน้อยหนึ่งอย่างในบรรดา proxies, proxy-groups, rules, proxy-providers หรือ rule-providers ส่วน sing-box JSON ต้องมี outbounds, endpoints หรือ route
รายการเดียวที่แปลงไม่ได้จะไม่ทำให้การนำเข้าทั้งหมดล้มเหลว พร็อกซี กลุ่ม และกฎแต่ละรายการจะถูกแปลงแยกกัน รายการที่ไม่มีสิ่งเทียบเท่าใน Chute จะถูกข้ามและถูกรายงานไว้ ผลลัพธ์ประกอบด้วยการกำหนดค่าที่แปลงแล้ว รายการคำเตือน และรายการฟิลด์ต้นทางที่ถูกข้าม คำเตือนชุดเดียวกันนี้ยังถูกเขียนลงในข้อความที่แปลงแล้วเป็นบรรทัดหมายเหตุ ถัดจากส่วนที่มันมาจาก:
[Proxy]
HK 01 = ss, example.com, 8388, aes-128-gcm, password
# KL-CONVERT-WARNING [proxies[3]]: proxy type 'snell' was skipped — Snell is a Surge-proprietary protocol KLNEKit does not implement
สุดท้าย ข้อความที่แปลงแล้วจะถูกแยกวิเคราะห์ซ้ำด้วยตัวแยกวิเคราะห์ของ Chute เอง บรรทัดใดที่ตัวแยกวิเคราะห์ปฏิเสธจะถูกทำให้เป็นหมายเหตุในรูปแบบ # KL-CONVERT-DROPPED: … และถูกรายงานไว้ ดังนั้นโปรไฟล์ที่แปลงได้ 95% ก็ยังนำเข้าและทำงานได้
ชื่อโหนดจะถูกเขียนใหม่ในจุดที่มันจะทำให้รูปแบบการกำหนดค่าเสียหาย: , จะกลายเป็นช่องว่าง และ = จะกลายเป็น - และชื่อที่ไปชนกับชื่ออื่นหลังจากนั้นจะได้รับส่วนต่อท้ายเป็นตัวเลข สมาชิกของกลุ่มและปลายทางของกฎจะถูกเขียนใหม่ให้ตรงกัน ทุกการอ้างอิงจึงยังชี้ไปยังโหนดเดิม พร็อกซี/outbound ที่เป็น direct จะถูกแมปไปยัง DIRECT ในตัว ส่วน reject / block / dns จะถูกแมปไปยัง REJECT
หมายเหตุ: โปรไฟล์ที่ผ่านการแปลงแล้วเป็นสแนปช็อตแบบคงที่ Chute จะดาวน์โหลด subscription ใหม่แล้วแยกวิเคราะห์เป็นโปรไฟล์แบบเนทีฟ ดังนั้นโปรไฟล์ที่ต้องผ่านการแปลงจะถูกบันทึกโดยไม่มี URL สำหรับอัปเดตอัตโนมัติ และจะไม่รีเฟรชตัวเอง
หมายเหตุการแปลง Clash / mihomo
หมายเหตุ:
dialer-proxyจะถูกแปลงเป็นunderlying-proxyChute แยกวิเคราะห์และเก็บรักษาตัวเลือกนี้ไว้ แต่ไม่ได้รองรับการต่อพ่วงพร็อกซี (proxy chaining) — นโยบายที่มีตัวเลือกนี้จะบันทึกคำเตือนลงในล็อกและเชื่อมต่อไปยังเซิร์ฟเวอร์ของตัวเองโดยตรง ทราฟฟิกที่เคยถูกต่อพ่วงภายใต้ 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 - คีย์ fingerprint สองตัวของ mihomo มีความหมายต่างกันและถูกแยกจากกัน:
client-fingerprintจะกลายเป็นfingerprint(โปรไฟล์ ClientHello ของ uTLS) ส่วนfingerprintจะกลายเป็นcert-fingerprint-sha256(การตรึงใบรับรอง) udp: falseจะกลายเป็นudp-relay=false,tfoจะกลายเป็นtfo=trueและบล็อกsmuxที่เปิดใช้งานไว้จะกลายเป็นmux=true- ประเภทกลุ่ม
select,url-test,fallbackและload-balanceจะถูกแปลงพร้อมตัวเลือกการตรวจสอบสถานะ (health check) ของมัน กลุ่มrelayจะถูกข้าม — เพราะเป็นการต่อพ่วง ซึ่งยังไม่ได้ถูกใช้งาน สมาชิกที่มาจากuse:จะกลายเป็นการอ้างอิงแบบpolicy-provider:<name>และinclude-all/include-all-proxies/include-all-providersจะถูกขยายเป็นรายชื่อสมาชิกแบบชัดเจน filterและexclude-filterจะถูกนำมาด้วยในรูปแบบที่ใส่เครื่องหมายคำพูด แต่รูปแบบ (pattern) ที่มีคอมมาหรือเครื่องหมายคำพูดอยู่ภายในไม่สามารถคงอยู่ในรูปแบบบรรทัดของการกำหนดค่าได้ จึงถูกตัดทิ้งพร้อมคำเตือน- ประเภทกฎจะถูกเปลี่ยนชื่อในจุดที่ชื่อไม่ตรงกัน:
MATCH→FINAL,DST-PORT→DEST-PORT,SRC-IP-CIDR→SRC-IPส่วนREJECT-DROPและREJECT-TINYGIFจะยุบรวมเป็นREJECTและกฎที่ชี้ไปยังPASSหรือCOMPATIBLEจะถูกข้าม rule-providerแบบ inline (type: inlineพร้อมรายการpayload) จะถูกขยายเป็นกฎจริงที่เทียบเท่ากัน เนื่องจากบรรทัด[Rule Provider]ของ Chute ไม่สามารถฝังเพย์โหลดไว้ภายในได้- คีย์ทั่วไปจะถูกแมปในจุดที่มีสิ่งเทียบเท่า:
mixed-portจะกลายเป็นportของ HTTP (SOCKS5 ต้องใช้socks-portของตัวเอง),allow-lanจะกลายเป็นallow-wifi-access,log-levelจะถูกแมปไปยังloglevel,external-controller/secretจะกลายเป็นตัวเลือกของตัวควบคุม HTTP ภายนอก และsnifferที่เปิดใช้งานไว้จะกลายเป็นsniffing-enabled
หมายเหตุการแปลง sing-box
- ประเภท outbound ที่แปลงได้:
shadowsocks,vmess,vless,trojan,hysteria2,tuic,anytls,shadowtls,wireguard,http,socks,sshส่วนselectorและurltestจะกลายเป็นกลุ่มนโยบายแบบselectและurl-test detourจะทำให้เกิดคำเตือนด้วยเหตุผลเดียวกับdialer-proxy: การต่อพ่วง outbound ยังไม่ได้ถูกใช้งาน และ outbound นั้นจะเชื่อมต่อไปยังเซิร์ฟเวอร์ของตัวเองโดยตรง- รายการใน
route.rule_setจะกลายเป็นบรรทัด[Rule Provider](type=httpสำหรับแบบระยะไกล,type=fileสำหรับแบบในเครื่อง และถูกอ่านเป็นรายการกฎแบบ classical ของ mihomo-YAML เสมอ) ชุดกฎในรูปแบบไบนารี.srsจะถูกปฏิเสธ — Chute อ่านได้เฉพาะเพย์โหลดกฎที่เป็นข้อความเท่านั้น - กฎการกำหนดเส้นทางจะทำตามคีย์
action:route/bypassจะใช้ outbound ที่ระบุชื่อไว้,rejectจะกลายเป็นREJECTส่วนhijack-dns,sniffและresolveจะไม่สร้างอะไรเลย เพราะ Chute ควบคุมสิ่งเหล่านี้จาก[General] - การตั้งค่า
multiplexและdns.rules(การกำหนดเส้นทาง DNS รายโดเมน) ไม่มีสิ่งเทียบเท่า จึงถูกรายงานว่าถูกตัดทิ้ง
ข้อจำกัด
- ยังไม่มีการรองรับการต่อพ่วงพร็อกซี ทั้ง
dialer-proxyของ mihomo,detourของ sing-box และกลุ่มrelayของ Clash ล้วนอธิบายการต่อพ่วงทั้งสิ้น แต่ไม่มีอันใดที่ทำให้เกิดทราฟฟิกแบบต่อพ่วงใน Chute - ตัวเลือกที่ไม่มีสิ่งเทียบเท่าใน Chute จะถูกตัดทิ้งพร้อมคำเตือน ไม่ใช่ตัดทิ้งไปเงียบ ๆ: ระดับพร็อกซีได้แก่
ip-version,interface-name,routing-markและmptcp; ระดับกลุ่มได้แก่exclude-type,disable-udp,interface-name,routing-markและicon; และคีย์ในส่วน General ได้แก่bind-address,tcp-concurrent,geodata-mode,geox-url,find-process-mode,unified-delay,authentication,tproxy-port,redir-portและอื่น ๆ - ประเภทกฎที่ไม่มีสิ่งเทียบเท่าจะถูกข้าม:
GEOSITE,IP-SUFFIX,SRC-IP-SUFFIX,SRC-GEOIP,SRC-IP-ASN,DSCP,UID,SUB-RULE,PROCESS-PATH-REGEX,PROCESS-NAME-WILDCARD,PROCESS-PATH-WILDCARDและIP-ACCEPTกฎที่มีตัวขยายsrcของ mihomo ก็ถูกข้ามเช่นกัน แทนที่จะไปจับคู่กับปลายทางที่ผิด ส่วนsub-rulesของ mihomo (ต้นไม้กฎแบบซ้อนกัน) จะถูกตัดทิ้ง - รายละเอียดของโปรโตคอลที่ Chute จัดการเองจะไม่ถูกนำมาด้วย: การสลับพอร์ต (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) modeการทำงานของ Clash เป็นสวิตช์ระดับรันไทม์ใน Chute ไม่ใช่คีย์ในไฟล์การกำหนดค่า โปรไฟล์ที่อยู่ในโหมดglobalหรือdirectจะถูกแปลงเป็นโหมดกฎพร้อมคำเตือน- YAML ถูกอ่านด้วยตัวแยกวิเคราะห์มาตรฐาน ดังนั้น anchor และคีย์ผสาน
<<จึงใช้งานได้ ค่าที่เขียนเป็นสเกลาร์หลายบรรทัดจะถูกยุบให้เหลือบรรทัดเดียว เพราะการขึ้นบรรทัดใหม่จะทำให้บรรทัดการกำหนดค่าที่มันไปอยู่ถูกแบ่งออกจากกัน