ตัวเลือกเบ็ดเตล็ด
[General]
ipv6 = true
loglevel = notify
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
tun-included-routes = 192.168.1.12/32
ตัวเลือกทั่วไป
เปิดใช้งานการรองรับ IPv6 เต็มรูปแบบ (ค่าเริ่มต้น: true)
ipv6 = true
loglevel (ค่าเริ่มต้น: warning)
loglevel = notify
หนึ่งใน none, fatal, warning, notify, info หรือ verbose ไม่แนะนำให้เปิดใช้งาน verbose ในการใช้งานประจำวันเพราะจะทำให้ประสิทธิภาพลดลงอย่างมาก
skip-proxy
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
ในเวอร์ชัน iOS และ tvOS รายการที่เป็นชื่อโฮสต์จะถูกเพิ่มเข้าในรายการข้อยกเว้นพร็อกซีของทันเนล การเชื่อมต่อไปยังชื่อนั้นจึงถูกจัดการโดย Chute TUN แทนพร็อกซี Chute ส่วนรายการที่เป็นที่อยู่ IP หรือ CIDR จะกลายเป็นเส้นทางที่ถูกยกเว้นของทันเนลเพิ่มอีกชั้นหนึ่ง ทราฟฟิกไปยังช่วงนั้นจึงออกนอกทันเนลไปเลย แทนที่จะถูกจัดการโดย Chute TUN Chute Android ก็ทำเช่นเดียวกันในโหมด VPN: ขณะที่ พร็อกซี HTTP ของระบบ เปิดอยู่ ชื่อโฮสต์ ไวลด์การ์ด * และที่อยู่ IPv4 จะเข้าไปอยู่ในรายการข้อยกเว้นของพร็อกซีที่ VPN มอบให้แอป และบน Android 13 ขึ้นไป รายการที่เป็นที่อยู่ IP หรือ CIDR ทุกรายการจะกลายเป็นเส้นทางที่ถูกยกเว้นของ VPN — ที่อยู่เดี่ยวเป็นเส้นทาง /32 หรือ /128 ส่วนรายการลูปแบ็กจะถูกละไว้ เพราะทราฟฟิกลูปแบ็กไม่เคยเข้าทันเนล ในเวอร์ชัน macOS การตั้งค่าเหล่านี้จะถูกนำไปใช้กับระบบเมื่อเปิดใช้งาน "พร็อกซีระบบ" ตัวเลือกนี้ใช้เพื่อแก้ไขปัญหาความเข้ากันได้กับบางแอป
- เพื่อระบุโดเมนเดียว ให้ป้อนชื่อโดเมน - ตัวอย่างเช่น apple.com
- เพื่อระบุเว็บไซต์ทั้งหมดบนโดเมน ใช้เครื่องหมายดอกจันก่อนชื่อโดเมน - ตัวอย่างเช่น *apple.com
- เพื่อระบุส่วนเฉพาะของโดเมน ระบุแต่ละส่วน - ตัวอย่างเช่น store.apple.com
- เพื่อระบุโฮสต์หรือเครือข่ายตามที่อยู่ IP ให้ป้อนที่อยู่ IP เฉพาะ เช่น 192.168.2.11 หรือช่วงที่อยู่ เช่น 192.168.2.* หรือ 192.168.2.0/24
หมายเหตุ: หากคุณป้อนที่อยู่ IP หรือช่วงที่อยู่ คุณจะสามารถข้ามพร็อกซีได้เฉพาะเมื่อคุณเชื่อมต่อกับโฮสต์นั้นโดยใช้ที่อยู่นั้น ไม่ใช่เมื่อคุณเชื่อมต่อกับโฮสต์โดยชื่อโดเมนที่แปลงเป็นที่อยู่นั้น
การรับฟังของเซิร์ฟเวอร์พร็อกซี
interface = 127.0.0.1
port = 8118
socks-interface = 127.0.0.1
socks-port = 8119
interface / port ควบคุมที่อยู่และพอร์ตการรับฟังของเซิร์ฟเวอร์พร็อกซี HTTP (ค่าเริ่มต้น 127.0.0.1:8118) ส่วน socks-interface / socks-port ควบคุมเซิร์ฟเวอร์พร็อกซี SOCKS5 (ค่าเริ่มต้น 127.0.0.1:8119)
สำหรับคำขอ http:// แบบไม่เข้ารหัส เซิร์ฟเวอร์พร็อกซี HTTP จะรับส่งเพียงหนึ่งรอบต่อการเชื่อมต่อ: การตอบกลับแต่ละครั้งจะออกไปพร้อม Connection: close แล้วการเชื่อมต่อจะถูกปิด ไคลเอนต์จึงส่งคำขอถัดไปบนการเชื่อมต่อใหม่ คำขอที่ส่งต่อท้ายคำขอแรกแบบไปป์ไลน์จะถูกทิ้ง และไคลเอนต์จะส่งมันใหม่บนการเชื่อมต่อใหม่ วิธียืนยันตัวตนที่ต้องไป-กลับหลายรอบบนการเชื่อมต่อเดียวกัน เช่น NTLM หรือ Negotiate จึงไม่สามารถทำให้สำเร็จผ่านพร็อกซีนี้ได้ ทันเนล CONNECT ที่ไม่ได้ถอดรหัสไม่ได้รับผลกระทบ การอัปเกรดเป็น WebSocket จะคงการเชื่อมต่อไว้: หลังการตอบกลับ 101 ข้อมูลจะผ่านไปมาทั้งสองทิศทางโดยไม่ถูกเปลี่ยนแปลง
ชื่อแฝงเพื่อความเข้ากันได้:
doh-serverและdoh-serviceถูกยอมรับให้เป็นชื่อแฝงของdohส่วนhttp-listen/socks5-listen(เช่น0.0.0.0:6152,[::]:6153หรือระบุเพียงหมายเลขพอร์ต) จะถูกจับคู่เข้ากับการตั้งค่า interface/port ข้างต้น หากโฮสต์ที่รับฟังเป็น wildcard (0.0.0.0,::หรือ*) จะเป็นการตั้งค่าallow-wifi-access = trueไปด้วย
การยืนยันตัวตนของพร็อกซีขาเข้า
http-auth = username:password
กำหนดให้ไคลเอนต์ต้องยืนยันตัวตนก่อนใช้เซิร์ฟเวอร์พร็อกซี HTTP และ SOCKS5 ของ Chute บรรทัดนี้สามารถระบุซ้ำได้เพื่ออนุญาตข้อมูลรับรองหลายชุด
พร็อกซี HTTP จะตอบคำขอที่ไม่มีข้อมูลรับรองที่ถูกต้อง — ไม่ว่าจะเป็นคำขอธรรมดาหรือ CONNECT — ด้วย 407 Proxy Authentication Required พร้อม Proxy-Authenticate: Basic realm="KLNEKit" แล้วปิดการเชื่อมต่อ ส่วนเซิร์ฟเวอร์ SOCKS5 รับข้อมูลรับรองชุดเดียวกันผ่านการยืนยันตัวตนด้วยชื่อผู้ใช้/รหัสผ่านของ SOCKS5 และจะปิดการเชื่อมต่อที่ไม่เสนอวิธีนี้หรือยืนยันตัวตนไม่ผ่าน
บายพาสคำขอของระบบ
bypass-system = true
เมื่อเปิดใช้งาน Chute จะต่อท้าย skip-proxy ด้วยรายชื่อโฮสต์ของ Apple ที่กำหนดไว้ตายตัว 18 รายการ — push, เกตเวย์ iCloud, การตรวจ captive portal, OCSP และอื่น ๆ ทำนองเดียวกัน — และเพิ่ม IP-CIDR,17.0.0.0/8,DIRECT,no-resolve ต่อท้ายกฎของคุณ ก่อน FINAL พอดี — กฎของคุณเองที่ตรงกับ 17.0.0.0/8 ก่อนจึงยังคงชนะ ไม่มีการจับคู่ตามกระบวนการใด ๆ ตัวเลือกนี้คือรายชื่อโฮสต์และที่อยู่ตายตัวชุดนั้น ไม่ใช่ตัวกรองว่ากระบวนการใดเป็นผู้ส่งคำขอ
ค่าเริ่มต้น:
true
Always Real IP
always-real-ip = *.example.com, tracker.example.org
เมื่อ Chute ให้บริการที่อยู่ IP ปลอมสำหรับคำถาม DNS ที่ถูกไฮแจ็ก (ดู hijack-dns) ชื่อโฮสต์ที่ตรงกับรายการที่คั่นด้วยคอมมานี้จะถูกตอบด้วยที่อยู่ IP จริงที่แปลงได้เสมอแทน รองรับ wildcard always-ip-address (การสะกดแบบ Shadowrocket) จะถูกอ่านเป็นคีย์นี้: ค่าบูลีน (true, yes, on, 1) หมายถึงทุกโฮสต์และถูกเขียนใหม่เป็น always-real-ip = * ส่วน false จะถูกตัดทิ้ง และค่าอื่นใดจะถูกอ่านเป็นรายชื่อโฮสต์ การกำหนดค่าจะถูกบันทึกด้วยการสะกดแบบ always-real-ip
อ่านไฟล์ hosts ของระบบ
read-etc-hosts = false
กำหนดว่าจะอ่านไฟล์ hosts ของระบบเข้ามาในตาราง [Host] หรือไม่ ตั้งเป็น false เพื่อไม่นำไฟล์นั้นมาใช้ การเปลี่ยนแปลงมีผลตอนโหลดซ้ำ ดูการกำหนด DNS เฉพาะที่
ค่าเริ่มต้น:
true
ขัดจังหวะการเชื่อมต่อที่มีอยู่
interrupt-exist-connections = true
เมื่อเปิดใช้งาน การเปลี่ยนนโยบายที่เลือกในกลุ่มนโยบายใด ๆ (ผ่าน URL Test, Fallback, Load Balance, SSID หรือการเลือกด้วยตนเอง) จะปิดการเชื่อมต่อที่มีอยู่ที่ใช้นโยบายเก่าอย่างนุ่มนวล สิ่งนี้รับประกันว่าการเชื่อมต่อใช้พร็อกซีที่เลือกใหม่ทันทีแทนที่จะค้างอยู่กับพร็อกซีเก่า
สิ่งนี้มีผลกับทุกกลุ่มนโยบายที่การเชื่อมต่อผ่าน ได้แก่ กลุ่มที่กฎระบุ กลุ่มที่ซ้อนอยู่ภายใน กลุ่มอัปสตรีมของนโยบายที่ต่อพ่วง (underlying-proxy) และกลุ่มที่เป็นสมาชิกของกลุ่ม Relay
การเชื่อมต่อที่ได้รับผลกระทบแต่ละรายการถูกปิดอย่างนุ่มนวลด้วยเวลาหมด 3 วินาทีก่อนที่จะถูกบังคับปิด
ค่าเริ่มต้น:
falseนี่คือการตั้งค่าส่วนกลาง — มันส่งผลต่อกลุ่มนโยบายทั้งหมด
Network Framework (macOS / iOS / tvOS)
network-framework = true
เปิดใช้งาน Apple Network.framework สำหรับการเชื่อมต่อขาออก การใช้ Network.framework สามารถให้ประสิทธิภาพที่ดีขึ้นและการรวมสแตก TLS สมัยใหม่บนแพลตฟอร์มที่รองรับ
ค่าเริ่มต้น:
trueบน macOS,falseบน iOS และ tvOS
ยกเว้นชื่อโฮสต์อย่างง่าย
exclude-simple-hostnames = true
เมื่อเปิดใช้งาน คำขอไปยังชื่อโฮสต์อย่างง่าย (ชื่อที่มีเพียงส่วนเดียวและไม่มีจุด เช่น localhost) ข้ามกฎพร็อกซีและถูกแปลงชื่อในเครื่อง สิ่งนี้ช่วยหลีกเลี่ยงการค้นหา DNS ที่ไม่จำเป็นสำหรับชื่อเครือข่ายท้องถิ่น นี่คือการตั้งค่า "ยกเว้นชื่อโฮสต์อย่างง่าย" ของพร็อกซีระบบ macOS เอง โดย Chute Mac จะเขียนค่านี้ลงในการตั้งค่าพร็อกซีระบบ จึงมีผลเฉพาะกับแอปพลิเคชันที่ทำตามพร็อกซีระบบเท่านั้น — ไม่มีผลกับโหมดขั้นสูงหรือทราฟฟิก TUN บน iOS และ tvOS ค่านี้จะถูกเขียนลงในการตั้งค่าพร็อกซีของทันเนลในลักษณะเดียวกัน ชื่อโฮสต์อย่างง่ายจึงถูกจัดการโดย Chute TUN แทนพร็อกซี Chute เช่นเดียวกับชื่อโฮสต์ใน skip-proxy ส่วน Chute Android ไม่ใช้ค่านี้
บน Chute Mac มีการย้ายข้อมูลแบบครั้งเดียวที่เปิดใช้งานตัวเลือกนี้เป็นค่าเริ่มต้นในการรันครั้งแรก แต่หากผู้ใช้ตั้งค่าปิดไว้อย่างชัดเจน ระบบจะเคารพการตั้งค่านั้น
ค่าเริ่มต้น:
false
ปิดใช้งานการบันทึกฐานข้อมูล
disable-db-record = true
เมื่อเปิดใช้งาน Chute หยุดเขียนระเบียนทราฟฟิกไปยังฐานข้อมูลในเครื่อง สิ่งนี้สามารถปรับปรุงประสิทธิภาพและลดการใช้พื้นที่เก็บข้อมูล แต่ประวัติทราฟฟิกจะไม่พร้อมใช้งานใน Chute Dashboard
ค่าเริ่มต้น:
false
การแสดงความเร็วในแถบเมนู (เฉพาะ Mac)
menu-bar-show-speed = true
เมื่อเปิดใช้งาน Chute Mac แสดงความเร็วอัปโหลดและดาวน์โหลดปัจจุบันในแถบเมนู
ถูกแยกวิเคราะห์แต่ไม่มีผลในเอนจินปัจจุบัน — ไม่มีส่วนใดของ Chute Mac อ่านคีย์นี้ ความเร็วในแถบเมนูสลับได้จากรายการเมนู แสดงความเร็วการเชื่อมต่อ ซึ่งเก็บไว้ในการตั้งค่าของตัวแอปเอง คีย์นี้ยังคงถูกเขียนกลับเมื่อบันทึกการกำหนดค่า
ไฮแจ็กเซิร์ฟเวอร์ DNS อื่น
hijack-dns = 8.8.8.8:53
โดยค่าเริ่มต้น Chute จะส่งคืนที่อยู่ IP ปลอมเฉพาะสำหรับคำถาม DNS ที่ส่งไปยังที่อยู่ DNS ของ Chute (198.18.0.2) คำถามที่ส่งไปยัง DNS มาตรฐานจะถูกส่งต่อเพียงอย่างเดียว
บางอุปกรณ์หรือซอฟต์แวร์ใช้เซิร์ฟเวอร์ DNS แบบ hardcode เสมอ (ตัวอย่างเช่น Google Speakers ใช้ 8.8.8.8 เสมอ) คุณอาจใช้ตัวเลือกนี้เพื่อไฮแจ็กคำถามเพื่อรับที่อยู่ปลอม
คุณอาจใช้ hijack-dns = *:53 เพื่อไฮแจ็กคำถาม DNS ทั้งหมด
รายการที่ไม่มีพอร์ตหมายถึงพอร์ต 53 ดังนั้น hijack-dns = 8.8.8.8 คือ 8.8.8.8:53 รายการที่อ่านไม่ได้จะถูกข้ามพร้อมหมายเหตุ ส่วนที่เหลือของบรรทัดยังคงมีผล
IP ปลอมใช้ได้บน Apple TV ด้วย (tvOS 17 ขึ้นไป) ก่อนหน้านี้ถูกปิดไว้บนแพลตฟอร์มนั้น และการตรวจสอบบนอุปกรณ์จริงยังดำเนินอยู่
เส้นทางที่ยกเว้น
tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
Chute VIF สามารถประมวลผลเฉพาะโปรโตคอล TCP และ UDP ใช้ตัวเลือกนี้เพื่อข้ามช่วง IP ที่ระบุเพื่ออนุญาตให้ทราฟฟิกทั้งหมดผ่านได้
หมายเหตุ: ตัวเลือกนี้ใช้กับแพ็กเก็ตทันเนลของ iOS และ tvOS ซึ่งช่วงที่ระบุจะกลายเป็นเส้นทางที่ถูกยกเว้นในการตั้งค่า IP ของทันเนล และใช้กับ Chute Android บน Android 13 ขึ้นไป ซึ่งช่วงเหล่านั้นจะกลายเป็นเส้นทางที่ถูกยกเว้นของ VPN — Android 11 และ 12 ไม่มี API สำหรับเส้นทางที่ถูกยกเว้น ช่วงที่ระบุจึงถูกละเว้นบนเวอร์ชันเหล่านั้น มันไม่มีผลบน macOS ไม่ว่าจะเป็นโหมดขั้นสูงแบบใด — ทั้ง utun ของตัวช่วยและ Network Extension ของ Mac ไม่ได้ยกเว้นเส้นทางใดเลย คำขอที่จัดการโดย Chute Proxy Server จะไม่ได้รับผลกระทบ รวม 'skip-proxy' และ 'tun-excluded-routes' เพื่อให้แน่ใจว่าทราฟฟิก HTTP บางอย่างข้าม Chute
ตัวเลือกนี้อาจทำให้เกิดข้อผิดพลาดของระบบ ENOMEM (Cannot allocate memory) ดูเหมือนเป็นข้อบกพร่องในระบบ iOS โปรดอย่าใช้ตัวเลือกนี้หากเป็นไปได้
เส้นทางที่รวม
tun-included-routes = 192.168.1.12/32
โดยค่าเริ่มต้น อินเทอร์เฟซ Chute VIF จะประกาศตัวเองเป็นเส้นทางเริ่มต้น แต่เนื่องจากอินเทอร์เฟซ Wi-Fi มีเส้นทางที่เล็กกว่า ทราฟฟิกบางอย่างอาจไม่ผ่านอินเทอร์เฟซ Chute VIF ใช้ตัวเลือกนี้เพื่อเพิ่มเส้นทางที่เล็กกว่า
เหตุผลที่เส้นทางเริ่มต้นอย่างเดียวไม่พอ: ระบบเลือกเส้นทางจากความยาวของคำนำหน้า ไม่ใช่จากลำดับ ซับเน็ตบนลิงก์ของอินเทอร์เฟซจริง — เช่น 192.168.1.0/24 — เจาะจงกว่า 0.0.0.0/0 ของทันเนล ทราฟฟิกนั้นจึงไม่ไปถึง Chute เลย รายการที่ระบุตรงนี้จะติดตั้งเส้นทางที่เจาะจงยิ่งกว่าและชนะ เส้นทางเหล่านี้ถูกเพิ่มทับบนเส้นทางเริ่มต้น และไม่เคยทำให้สิ่งที่ทันเนลดักจับแคบลง
หมายเหตุ: หลีกเลี่ยงการใส่ช่วงส่วนตัว (
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) ทั้งช่วง โดยปกติไม่จำเป็นและอาจรบกวนการจัดเส้นทางของระบบเอง Chute จะทำตามรายการเช่นนั้นแต่บันทึกคำเตือนไว้ — ยกเว้นโหมดขั้นสูงแบบ Network Extension บน macOS ซึ่งทำตามโดยไม่บันทึกคำเตือน เหตุผลตามปกติที่ใช้ตัวเลือกนี้คือเพื่อเข้าถึงช่วงที่ทันเนลของแอป VPN อื่นเป็นเจ้าของหมายเหตุ: รายการที่จะตัดเส้นทางที่ Chute เองต้องพึ่งพาจะถูกปฏิเสธพร้อมเหตุผลในบันทึก ได้แก่ ลูปแบ็ก ซับเน็ตของ VIF เอง (
198.18.0.0/15และfd12:1:1:1::/64) ลิงก์โลคัล มัลติคาสต์ บรอดคาสต์ และความยาวคำนำหน้าเท่ากับ0โหมดขั้นสูงแบบ helper-utun บน macOS ยังปฏิเสธรายการที่ครอบคลุมเกตเวย์เริ่มต้นปัจจุบันด้วย ส่วนในแบบ Network Extension เหตุผลจะไปอยู่ในบันทึกของระบบแทนบันทึกของ Chuteหมายเหตุ: บน iPhone ระบบเป็นผู้ตัดสินการดักจับเครือข่ายท้องถิ่นแยกต่างหาก ซับเน็ตท้องถิ่นที่ระบุไว้ตรงนี้จะมีผลก็ต่อเมื่อเปิด รวมเครือข่ายท้องถิ่น ในการตั้งค่าของแอปด้วย — สวิตช์นี้เปิดได้เฉพาะขณะที่ รวมเครือข่ายทั้งหมด เปิดอยู่ ส่วนช่วงที่ทันเนลของแอปอื่นเป็นเจ้าของไม่ต้องใช้สวิตช์นั้น Chute tvOS แสดงสวิตช์ชุดเดียวกันแต่ไม่ได้นำไปใช้กับทันเนล บน macOS เส้นทางถูกติดตั้งโดยตรง จึงไม่มีการกั้นแบบนี้
หมายเหตุ: บน macOS โหมดขั้นสูงแบบ helper-utun จะติดตั้งเส้นทางเหล่านี้ตอนผูกอินเทอร์เฟซ การเปลี่ยนรายการจึงทำให้อินเทอร์เฟซถูกผูกใหม่เมื่อโหลดการกำหนดค่าซ้ำ ตัวเลือกนี้ต้องใช้ตัวช่วยเวอร์ชัน 0.8.6 ขึ้นไป — หลังอัปเดต Chute ให้อนุมัติคำขอติดตั้งตัวช่วยใหม่หนึ่งครั้ง มิฉะนั้นโหมดแบบ helper-utun จะรายงานว่าตัวช่วยไม่ทำงาน
การดมกลิ่นโปรโตคอล
sniffing-enabled = true
sniffing-timeout = 100
Chute สามารถตรวจจับโปรโตคอลที่แท้จริงของการเชื่อมต่อโดยการตรวจสอบไบต์เริ่มต้น สิ่งนี้ทำให้กฎเช่น PROTOCOL,TLS,Proxy ทำงานได้อย่างถูกต้องแม้สำหรับการเชื่อมต่อขาเข้าที่ไม่ใช่ HTTP
sniffing-enabled (ค่าเริ่มต้น: false)
sniffing-enabled = true
เปิดใช้งานการดมกลิ่นโปรโตคอลสำหรับการเชื่อมต่อ TCP ในโหมดขั้นสูง สวิตช์เดียวกันนี้ยังให้โฟลว์ HTTP/3 (QUIC) ที่ไปยังที่อยู่ IP ตรง ๆ ถูกจับคู่ด้วยชื่อได้: Chute อ่านชื่อเซิร์ฟเวอร์จาก QUIC ClientHello กฎประเภท DOMAIN จะเห็นชื่อนั้นแทนที่อยู่ และแพ็กเก็ตถัดไปทุกตัวของโฟลว์เดียวกันจะทำตามผลตัดสินของแพ็กเก็ตแรก ClientHello ที่ใหญ่เกินกว่าหนึ่งแพ็กเก็ต (พบบ่อยกับการแลกเปลี่ยนกุญแจแบบหลังควอนตัม) จะถูกประกอบกลับตามโฟลว์จากแพ็กเก็ต Initial ที่บรรจุมัน โดย hello ที่ประกอบแล้วมีขนาดสูงสุด 16 KiB จึงอ่านชื่อได้เช่นกัน ระหว่างที่ส่วนที่เหลือของ hello ยังมาไม่ครบ ดาต้าแกรมของโฟลว์นั้นจะถูกกักไว้แทนที่จะส่งออกด้วยที่อยู่ตรง ๆ แล้วจึงส่งออกไปพร้อมกันตามนโยบายของชื่อเมื่ออ่านชื่อได้ — ชิ้นแรกของ hello ที่ถูกแบ่งจึงไม่เดินทางคนละเส้นทางกับส่วนที่เหลืออีกต่อไป เพดานที่กำหนดไว้คือ รอ 1 วินาที, กักได้ 8 ดาต้าแกรมหรือ 16 KiB ต่อโฟลว์ และมีโฟลว์กำลังประกอบพร้อมกันได้ไม่เกิน 64 โฟลว์ โฟลว์ที่เกินข้อใดข้อหนึ่ง หรือโฟลว์ที่แพ็กเก็ต Initial ไม่เคยประกอบ ClientHello ได้ครบ จะถูกจับคู่ด้วยที่อยู่เหมือนเดิม
สำหรับการเชื่อมต่อไปยังที่อยู่จริง กฎจะเห็นชื่อที่ไคลเอนต์ระบุเอง (TLS SNI หรือ HTTP Host) แม้ว่าแคช DNS ของ Chute จะมีชื่อสำหรับที่อยู่นั้นอยู่แล้วก็ตาม เพราะแคชเก็บชื่อไว้เพียงชื่อเดียวต่อหนึ่งที่อยู่ คือชื่อล่าสุดที่ค้นหาแล้วได้ที่อยู่นั้น และสำหรับที่อยู่ที่ใช้ร่วมกัน ชื่อนั้นอาจเป็นของเว็บไซต์อื่น ชื่อจากแคชจะถูกใช้เมื่ออ่านชื่อจากการเชื่อมต่อไม่ได้ คำขอที่เขียนขึ้นสำหรับพร็อกซี HTTP (CONNECT หรือคำขอที่เป้าหมายเป็น URL เต็ม) ยังคงถูกตรวจจับว่าเป็น HTTP แต่โฮสต์ที่ระบุในคำขอนั้นคือปลายทางถัดไปของพร็อกซีดังกล่าว ไม่ใช่ชื่อของการเชื่อมต่อนี้ การเชื่อมต่อจึงยังใช้ชื่อจากแคชหรือที่อยู่ตามเดิม โปรโตคอลที่เซิร์ฟเวอร์เป็นฝ่ายส่งก่อนไม่มีชื่อให้อ่าน การเชื่อมต่อไปยังพอร์ต 21, 22, 23, 25, 110, 119, 143, 587, 2525 และ 3306 จะไม่ผ่านการตรวจจับและเชื่อมต่อทันที ส่วนบนพอร์ตอื่น โปรโตคอลลักษณะนี้จะรอจนครบ sniffing-timeout ก่อนจึงจะเชื่อมต่อ
sniffing-timeout (ค่าเริ่มต้น: 100ms)
sniffing-timeout = 200
เวลาสูงสุดเป็นมิลลิวินาทีในการรอข้อมูลเริ่มต้นเพื่อกำหนดโปรโตคอล เพิ่มค่านี้หากการตรวจจับโปรโตคอลล้มเหลวบนการเชื่อมต่อที่ช้า
การบล็อก QUIC
block-quic = auto
ควบคุมว่า Chute จะปฏิเสธทราฟฟิก QUIC ที่ตรวจพบ รวมถึง HTTP/3 หรือไม่ QUIC ทำงานผ่าน UDP และไม่สามารถถอดรหัสด้วย HTTP MitM ของ Chute ได้ การปฏิเสธ QUIC อาจทำให้ไคลเอนต์ที่รองรับลองเชื่อมต่อใหม่ผ่าน TCP จึงสามารถใช้การประมวลผลพร็อกซีบน TCP และการถอดรหัส HTTPS เมื่อกำหนดค่าไว้ได้
| ค่า | พฤติกรรม |
|---|---|
off |
ไม่ใช้การบล็อก QUIC แบบส่วนกลาง (ค่าเริ่มต้น) ทราฟฟิก QUIC ที่ตรวจพบจะเป็นไปตามกฎการกำหนดเส้นทางปกติ |
on |
ปฏิเสธโฟลว์ QUIC ที่ตรวจพบทั้งหมด รวมถึงทราฟฟิกที่กำหนดเส้นทางไปยัง DIRECT |
auto |
ปฏิเสธ QUIC ที่ตรวจพบเฉพาะเมื่อนโยบายขาออกสุดท้ายเป็นพร็อกซี ทราฟฟิกที่กำหนดเส้นทางไปยัง DIRECT จะได้รับอนุญาต ส่วนทราฟฟิกที่กำหนดเส้นทางไปยัง REJECT จะยังคงถูกปฏิเสธตามกฎนั้น |
all |
การสะกดของ Surge สำหรับ on |
all-proxy, per-policy |
การสะกดของ Surge ทั้งสองอ่านเป็น auto — Chute ไม่มีการบล็อก QUIC แยกตามนโยบาย ดังนั้น per-policy จึงบล็อก QUIC ในทุกโฟลว์ที่ผ่านพร็อกซี คำที่คุณเขียนจะถูกเก็บไว้เมื่อบันทึกโปรไฟล์ |
สำหรับทราฟฟิกที่เข้ามาทาง TUN Chute จะตอบกลับโฟลว์ QUIC ที่ถูกปฏิเสธด้วยข้อความ ICMP/ICMPv6 Port Unreachable ทำให้ไคลเอนต์ที่รองรับสามารถถอยกลับไปใช้ TCP ได้โดยไม่ต้องรอ QUIC หมดเวลา
โฟลว์ QUIC ที่ถูกปฏิเสธจะถูกบันทึกโดยมีนโยบายเป็น
REJECTไม่ว่ากฎจะเลือกนโยบายใดก็ตามการตรวจจับ QUIC สำหรับ
block-quicทำงานโดยอัตโนมัติและไม่ต้องใช้sniffing-enabledโดยsniffing-enabledใช้ควบคุมการดมกลิ่นโปรโตคอล — TLS บน TCP และชื่อเซิร์ฟเวอร์ของโฟลว์ QUIC หากต้องการจัดการแต่ละโฟลว์ QUIC ด้วยกฎ ให้ใช้กฎPROTOCOL,QUIC,...
ตอบ ICMP ภายในทันเนล
icmp-auto-reply = false
คำขอ ICMP echo ที่เข้ามาในทันเนล — ไม่ว่า IPv4 หรือ IPv6 — จะถูกตอบโดย Chute เอง คำตอบถูกสร้างขึ้นในเครื่องและไม่มีอะไรถูกส่งไปยังปลายทาง ดังนั้นทุกปลายทางจะตอบกลับ รวมถึงที่อยู่ที่กฎจะ REJECT และโฮสต์ที่ล่มอยู่ การที่ ping สำเร็จภายในทันเนลจึงไม่ได้บอกว่าปลายทางเข้าถึงได้ ตั้งเป็น false เพื่อหยุดตอบ คำขอจะถูกส่งต่อออกจากอุปกรณ์ แต่คำตอบของมันจะไม่กลับมาผ่านทันเนลเลย ping จึงไม่มีวันได้รับคำตอบ
ค่าเริ่มต้น:
trueใช้กับทราฟฟิกที่เข้ามาทาง TUN และ ICMP จะไม่ถูกส่งผ่านพร็อกซีเลย
บายพาส TUN
bypass-tun = 192.168.0.0/16, 10.0.0.0/8
คล้ายกับ skip-proxy แต่ทำงานในระดับการจัดเส้นทาง TUN/VIF การเชื่อมต่อไปยังช่วง IP เหล่านี้จะบายพาสอินเทอร์เฟซ TUN ทั้งหมดและผ่านสแตกเครือข่ายของระบบโดยตรง
หมายเหตุ: ตัวเลือกนี้ใช้กับแพ็กเก็ตทันเนลของ iOS และ tvOS ซึ่งช่วงของมันจะไปรวมกับ
tun-excluded-routesเป็นเส้นทางที่ถูกยกเว้นของทันเนล และใช้ในลักษณะเดียวกันกับ Chute Android บน Android 13 ขึ้นไป (Android 11 และ 12 จะละเว้นตัวเลือกนี้) มันไม่มีผลบน macOS ไม่ว่าจะเป็นโหมดขั้นสูงแบบใด
แสดงหน้าข้อผิดพลาดสำหรับ Reject
show-error-page-for-reject = true
เมื่อเปิดใช้งาน Chute ส่งคืนหน้าข้อผิดพลาดที่เป็นมิตรกับผู้ใช้สำหรับคำขอที่ถูกปฏิเสธ ข้อนี้ใช้เฉพาะกับคำขอที่เข้ามาทางช่องทางขาเข้าของพร็อกซี HTTP เท่านั้น เมื่อปิดตัวเลือกนี้ คำขอแบบนั้นจะถูกตอบด้วย HTTP/1.1 503 Service Unavailable แทน ส่วนคำขอที่ถูกปฏิเสธจากช่องทางขาเข้าอื่นจะถูกทิ้งไม่ว่าอย่างไรก็ตาม
ค่าเริ่มต้น:
false
Optimistic DNS
optimistic-dns = false
เมื่อเปิดใช้งาน ระเบียนที่แคชไว้ซึ่ง TTL หมดอายุแล้วยังคงถูกส่งคืนทันที พร้อมกับถูกค้นหาใหม่ในพื้นหลัง สิ่งนี้ลดความหน่วงในการเชื่อมต่อโดยมีค่าใช้จ่ายคืออาจส่งคืนระเบียน DNS ที่เก่า ระเบียนที่หมดอายุจะถูกส่งคืนแบบนี้เพียงช่วงเวลาจำกัดเท่านั้น คือนานเท่ากับ TTL ของระเบียนนั้นเอง และไม่น้อยกว่า 5 นาที หลังจากนั้นคำขอจะรอคำตอบจากต้นทาง เมื่อปิด ระเบียนที่ TTL หมดอายุแล้วจะไม่ถูกส่งคืน และคำขอจะไปยังต้นทาง คำตอบนั้นจะเติมแคชใหม่ การค้นหาครั้งถัดไปจึงตอบจากแคชได้ เมื่อสลับไปยังเครือข่ายอื่น หรือรายการเซิร์ฟเวอร์ DNS เปลี่ยนไป ระเบียนที่แคชไว้ทั้งหมดจะถือว่าหมดอายุ ตัวเลือกนี้ยังกำหนดบนทุกแพลตฟอร์มด้วยว่าทันเนลจะเชื่อมต่อไปยังหลายที่อยู่ของชื่อเดียวพร้อมกันหรือไม่
ค่าเริ่มต้น:
trueตั้งค่าoptimistic-dns = falseเพื่อปิดใช้งาน
อนุญาตการเข้าถึง Wi-Fi
allow-wifi-access = true
ให้อุปกรณ์อื่นในเครือข่ายเดียวกันเข้าถึงพอร์ตพร็อกซี HTTP และ SOCKS5 ของ Chute ได้ โดยขยายที่อยู่ผูกของตัวรับฟังทั้งสองเป็น 0.0.0.0 การกำหนดค่าแบบ Surge — รวมถึงการแม็ป allow-lan ของตัวนำเข้า sing-box — มีเพียงแฟล็กนี้และปล่อย interface ไว้ที่ค่าเริ่มต้น 127.0.0.1 แฟล็กจึงต้องขยายที่อยู่ผูกด้วยตัวเอง
แฟล็กนี้กับการเขียน
interfaceเป็นไวลด์การ์ดอย่างชัดเจนคือสองวิธีเขียนของเจตนาเดียวกัน และ Chute ใช้ยูเนียนของทั้งสอง การกำหนดค่าที่เขียน0.0.0.0อยู่แล้วจะทำงานเหมือนเดิมทุกประการ การเปลี่ยนแฟล็กจะผูกตัวรับฟังทั้งสองใหม่ การถอนสิทธิ์เข้าถึงจึงมีผลตอนโหลดซ้ำ ไม่ต้องรอเริ่มระบบครั้งถัดไปพอร์ตเหล่านี้คือพอร์ตพร็อกซี และไม่มีการยืนยันตัวตนเว้นแต่ตั้ง
http-authบนเครือข่ายที่คุณไม่ได้ควบคุม ให้ตั้งข้อมูลรับรองด้วย
การกำหนดค่าแบบจัดการ
#!MANAGED-CONFIG https://example.com/config.conf interval=86400 strict=false
การกำหนดค่าที่บรรทัดแรกเป็นส่วนหัว #!MANAGED-CONFIG จะถูกดึงจาก URL นั้นใหม่โดยอัตโนมัติ พารามิเตอร์ของส่วนหัวและพฤติกรรมการอัปเดตมีบันทึกไว้ในการกำหนดค่าแบบจัดการ
Replica / การบันทึกทราฟฟิก
replica = true
คีย์ replica ใน [General] (replica = true) เปิดใช้การบันทึกทราฟฟิก ส่วน [Replica] ทำหน้าที่กรองสิ่งที่แสดงใน Chute Dashboard โดยคีย์ต่าง ๆ มีบันทึกไว้ใน Replica
บน iOS, tvOS และ Android ต้องมีใบอนุญาตที่ใช้งานอยู่ด้วย: หากไม่มี
replica = trueจะไม่จับอะไรเลย
การเข้าถึง External Controller (Chute Dashboard)
external-controller-access = password@0.0.0.0:6155
เริ่มเซิร์ฟเวอร์ควบคุมระยะไกลที่ใช้โดย Chute Dashboard ค่าคือ password@host:port; อาจมีชื่อผู้ใช้นำหน้ารหัสผ่านก็ได้ (user:password@host:port) บน iOS และ tvOS ช่องทาง USB ที่มาคู่กันจะถูกเปิดบน port + 1 (ไม่มีบน macOS) วิธีเชื่อมต่ออยู่ในหน้า Chute Dashboard
HTTP Control API และคอนโซลเว็บ
[General]
external-http-controller = 127.0.0.1:9090
external-http-secret = your-secret-token
external-http-ui = true
external-http-cors = false
Chute มี HTTP Control API ในตัวและคอนโซลเว็บ คล้ายกับแดชบอร์ด Clash และ Surge API เปิดเผยสถานะเอนจิน ทราฟฟิก การเชื่อมต่อ DNS การควบคุมนโยบาย และการจัดการการกำหนดค่าผ่านจุดปลายทาง REST
http-api = <secret>@<host>:<port> ของ Surge จะถูกอ่านเป็น external-http-controller ร่วมกับ external-http-secret และยังสามารถเขียนแยกส่วนได้ด้วย: http-api-secret, http-api-ui, http-api-cors จะถูกอ่านเป็น external-http-secret, external-http-ui, external-http-cors ตามลำดับ และ http-api-web-dashboard ก็จะถูกอ่านเป็น external-http-ui เช่นกัน โดยการกำหนดค่าจะถูกบันทึกด้วยคีย์ external-http-* ส่วน http-api-tls ไม่รองรับ (ตัวควบคุมใช้ HTTP ธรรมดา) และจะมีเพียงข้อความแจ้ง
external-http-controller (ค่าเริ่มต้น: ปิดใช้งาน)
external-http-controller = 127.0.0.1:9090
คำขอที่คอนโซลเก็บค้างไว้ระหว่างให้บริการถูกจำกัดที่ 4 MB บน macOS และ 1 MB บน iOS, tvOS และ Android
ที่อยู่และพอร์ตของเซิร์ฟเวอร์ควบคุม HTTP ใช้ 127.0.0.1 สำหรับการเข้าถึงเฉพาะเครื่อง การผูกกับที่อยู่ที่ไม่ใช่ลูปแบ็ก (เช่น 192.168.1.5:9090) ต้องตั้ง external-http-secret อย่างชัดเจน มิฉะนั้นเซิร์ฟเวอร์จะปฏิเสธการเริ่มทำงานและบันทึกว่าขาดอะไร
ที่อยู่ไวลด์การ์ด (0.0.0.0, ::, *) นับเป็นไม่ใช่ลูปแบ็กในการตรวจนี้ เพราะมันรับฟังบนทุกอินเทอร์เฟซ ซึ่งตรงข้ามกับเฉพาะเครื่อง รูปแบบที่รับได้คือ 0.0.0.0:9090, *:9090 (ความหมายเดียวกัน) และสำหรับ IPv6 คือ [::]:9090 — เขียน :::9090 เปล่า ๆ ก็จะใส่วงเล็บเหลี่ยมให้เอง ส่วนที่อยู่ที่แยกวิเคราะห์ไม่ได้จะถูกรายงานเป็นข้อผิดพลาดของการกำหนดค่า แทนที่จะปล่อยให้ตัวควบคุมปิดอยู่เงียบ ๆ และช่วง 127.0.0.0/8 ทั้งหมดนับเป็นลูปแบ็ก ไม่ใช่แค่ 127.0.0.1
external-http-secret (ค่าเริ่มต้น: โทเคนที่สร้างให้)
external-http-secret = your-secret-token
โทเคน Bearer ที่ใช้ยืนยันตัวตนกับ API คำขอต้องมีส่วนหัว Authorization: Bearer <secret> โทเคนรับเฉพาะในส่วนหัวนี้เท่านั้น ไม่รับผ่านพารามิเตอร์คิวรี และเปรียบเทียบด้วยเวลาคงที่ การยืนยันตัวตนล้มเหลวคืนค่า 401 พร้อม {"ok": false, "error": {"code": "unauthorized", "message": "missing or invalid token"}} เส้นทางข้อมูลทุกเส้นถูกป้องกัน: เส้นทาง /api/*, ชื่อแฝงที่เข้ากันได้กับ Clash และเส้นทางแบบเก่าที่ตอนนี้มีเฉพาะบน Chute Android (/status, /policies, /dns, /records เป็นต้น) ซึ่งก็รับโทเคนเฉพาะในส่วนหัวนี้เช่นกัน ส่วนแดชบอร์ดระยะไกลของ Chute Android เองตอนนี้ใช้เฉพาะเส้นทาง /api/* หน้าเว็บและไฟล์สแตติกของคอนโซลเว็บ (/, /assets/… และบน Chute Android รวมถึง /ui) ไม่ต้องใช้โทเคน (เมื่อ external-http-ui = false จะหายไปทั้งหมด — หน้าเว็บตอบ 404)
เมื่อไม่ได้ระบุคีย์นี้ Chute จะสร้างโทเคนให้ แทนที่จะให้บริการโดยไม่ยืนยันตัวตน โทเคนที่สร้างขึ้นจะถูกเขียนลงไฟล์ control-token ในโฟลเดอร์แชร์ของ Chute — ไม่ใช่ข้างไฟล์การกำหนดค่า: บน iOS และ tvOS คือคอนเทนเนอร์ของ App Group ส่วนบน Android คือไดเรกทอรีข้อมูลส่วนตัวของแอป — ด้วยสิทธิ์ที่เจ้าของอ่านได้เท่านั้น ถูกใช้ต่อหลังรีสตาร์ต และแอปจะแสดงให้คุณเห็น — ดูการเปิดคอนโซลเว็บ API ควบคุมสามารถส่งมอบฐานข้อมูลการเชื่อมต่อ ซึ่งบันทึกไว้ทุก URL ทุกส่วนหัว และทุกชื่อกระบวนการที่เห็นในรอบการทำงานนี้ การเปิดทิ้งไว้จึงไม่ใช่ค่าเริ่มต้นที่สมเหตุสมผล
หากยังต้องการให้บริการโดยไม่ยืนยันตัวตน ให้ระบุอย่างชัดเจนในไฟล์การกำหนดค่า:
external-http-secret = none
ค่านี้ได้รับการยอมรับเฉพาะเมื่อผูกกับลูปแบ็กเท่านั้น นอกลูปแบ็ก ทั้ง none และการไม่ระบุคีย์ล้วนไม่พอ เซิร์ฟเวอร์ควบคุมจะปฏิเสธการเริ่มทำงานและบอกว่าต้องการอะไร
หมายเหตุการอัปเกรด: หากคุณเคยอาศัยว่า "ไม่มี
external-http-secretเท่ากับไม่ยืนยันตัวตน" สคริปต์ในเครื่องจะเริ่มได้รับ401ให้อ่านโทเคนที่สร้างขึ้นจากแอป หรือเขียนexternal-http-secret = noneเพื่อคงพฤติกรรมเดิมไว้อย่างตั้งใจ
external-http-ui (ค่าเริ่มต้น: true)
external-http-ui = true
เมื่อเปิดใช้งาน Chute ให้บริการคอนโซลเว็บในตัวที่ที่อยู่ของตัวควบคุม คอนโซลเว็บมีภาพรวม การจัดการการเชื่อมต่อ การตรวจสอบ DNS การตรวจสอบทราฟฟิก การควบคุมนโยบาย และการแก้ไขการกำหนดค่า ตั้งค่าเป็น false เพื่อให้ API เปิดใช้งานในขณะที่ปิดใช้งาน UI
การเปิดคอนโซลเว็บ
คอนโซลให้บริการที่ที่อยู่ของเซิร์ฟเวอร์ควบคุม และแต่ละแอปสามารถส่งที่อยู่กับโทเคนให้คุณได้ — รวมถึงโทเคนที่ระบบสร้างให้ ซึ่งมิฉะนั้นคุณจะไม่มีทางอ่านได้เลย:
- Chute Mac: แถบเมนู → เปิดคอนโซลเว็บ และ คัดลอกโทเคนคอนโซลเว็บ หน้าต่างรายละเอียดการเชื่อมต่อยังมี คำขอและประวัติ ซึ่งเปิดคอนโซลเช่นกัน — เปิดหน้าแรก ไม่ใช่การเชื่อมต่อนั้น
- Chute iOS: แผงควบคุม → แถวคอนโซลเว็บ → เปิด, คัดลอกที่อยู่ หรือ คัดลอกโทเคนการเข้าถึง
- Chute tvOS: แผงควบคุมมีแถว ที่อยู่คอนโซลเว็บ แยกต่างหาก แสดงโฮสต์และพอร์ต เมื่อเลือก ถ้าตัวรับฟังเข้าถึงได้จากอุปกรณ์อื่นจะแสดง QR Code — โทเคนลงชื่อเข้าใช้อยู่ในโค้ด ไม่แสดงบนหน้าจอ — แต่ถ้าตัวควบคุมผูกกับลูปแบ็ก จะแสดงคำอธิบายแทน เพราะคอนโซลบนลูปแบ็กเปิดจากโทรศัพท์ไม่ได้
- Chute Android: แผงควบคุม → ที่อยู่คอนโซลเว็บ → เปิด หรือ คัดลอกที่อยู่ และแถว โทเค็นการเข้าถึงที่สร้างขึ้น ซึ่งแตะเพื่อคัดลอก ทั้งสองแถวจะไม่ปรากฏเมื่อโทเคนเป็นค่าลับที่คุณกำหนดเอง ซึ่งจะไม่ถูกแสดงเลย
ที่อยู่ที่ได้จะพ่วงโทเคนมาในพารามิเตอร์คิวรี หน้าเว็บจะใช้มันตอนโหลดแล้วลบออกจากแถบที่อยู่ ดังนั้นการเปิดลิงก์คือการลงชื่อเข้าใช้ที่สมบูรณ์ ไม่มีใครต้องพิมพ์อักขระฐานสิบหก 32 ตัวด้วยมือ
external-http-cors (ค่าเริ่มต้น: false)
external-http-cors = true
เปิดใช้งานส่วนหัว CORS (Cross-Origin Resource Sharing) ในการตอบกลับ API มีประโยชน์เมื่อคอนโซลเว็บหรือเครื่องมือบุคคลที่สามต้องการเข้าถึง API จากต้นทางที่แตกต่างกัน
จุดปลายทาง API:
| เมธอด | จุดปลายทาง | คำอธิบาย |
|---|---|---|
GET |
/api/status |
สถานะรันไทม์ พอร์ต เวลาทำงาน |
GET |
/api/traffic |
ตัวนับทราฟฟิกส่วนกลางและต่อนโยบาย |
GET |
/api/connections |
การเชื่อมต่อที่ใช้งานปัจจุบัน |
DELETE |
/api/connections/:id |
ปิดการเชื่อมต่อ |
GET |
/api/connections/history |
ระเบียนการเชื่อมต่อในอดีต |
GET |
/api/connections/processes |
สถิติการเชื่อมต่อแยกตามกระบวนการ |
GET |
/api/connections/:id/request |
ข้อมูลคำขอที่บันทึกไว้ของการเชื่อมต่อ |
GET |
/api/connections/:id/response |
ข้อมูลการตอบกลับที่บันทึกไว้ของการเชื่อมต่อ |
GET |
/api/dns |
ระเบียนแคช DNS |
DELETE |
/api/dns/cache |
ล้างแคช DNS |
DELETE |
/api/dns/records/:domain |
ลบระเบียน DNS รายการเดียว |
GET |
/api/config |
การกำหนดค่าปัจจุบัน |
PUT |
/api/config |
โหลดการกำหนดค่าใหม่ |
POST |
/api/config/validate |
แยกวิเคราะห์การกำหนดค่าและรายงานข้อผิดพลาด โดยไม่โหลดมัน |
GET |
/api/policies |
กลุ่มนโยบายและการเลือกปัจจุบัน แต่ละรายการมี hidden ซึ่งเป็น true สำหรับกลุ่มที่ตั้ง hidden=true |
PUT |
/api/policies/:group |
เปลี่ยนการเลือกกลุ่มนโยบาย |
PUT |
/api/mode |
ตั้งค่าโหมดขาออก |
GET |
/api/features |
สถานะสวิตช์คุณสมบัติ |
PUT |
/api/features/mitm |
สลับ MitM |
PUT |
/api/features/record-traffic |
สลับการบันทึกทราฟฟิก |
GET |
/api/rules |
ตารางกฎที่ตัวจับคู่ไล่ตรวจจริง ที่มาของแต่ละกฎ และกฎการเขียนใหม่ที่ทำงานไปแล้ว |
POST |
/api/rules/match |
คำขอจะถูกกำหนดเส้นทางไปที่ใด โดยไม่ต้องส่งจริง |
GET |
/api/logs |
รายการบันทึกล่าสุด |
GET |
/api/loglevel |
ระดับบันทึกปัจจุบัน และส่วนที่กำลังเขียน |
PUT |
/api/loglevel |
เปลี่ยนระดับบันทึกหรือส่วนโดยไม่ต้องรีสตาร์ต |
GET |
/api/health |
สุขภาพของเอนจิน: จำนวนการปฏิเสธ รุ่น หน่วยความจำ และการออกครั้งก่อน |
GET |
/api/events |
เหตุการณ์สำคัญของรอบการทำงานนี้ |
GET |
/api/tailscale |
สถานะปัจจุบันของเอนจิน Tailscale |
GET |
/api/scripts |
สคริปต์แบบ generic ที่สั่งรันได้ตามต้องการ |
POST |
/api/scripts/run |
รันสคริปต์ generic หนึ่งตัวตามชื่อ |
POST |
/api/diagnostics/ping |
ตรวจการเข้าถึงด้วย ICMP หรือ TCP |
POST |
/api/diagnostics/dns-query |
แปลงชื่อโดเมนผ่านรีโซลเวอร์ที่กำลังทำงาน |
POST |
/api/diagnostics/egress-probe |
ตรวจที่อยู่: บนเอนจินของ Apple คือที่อยู่ของอุปกรณ์เอง บนเอนจินของ Android คือที่อยู่ขาออกสาธารณะ |
POST |
/api/diagnostics/internet-test |
การทดสอบอินเทอร์เน็ตแบบตรง: ดึง internet-test-url โดยไม่ผ่านพร็อกซี |
POST |
/api/diagnostics/url-test/:policy |
รันการทดสอบความหน่วงของนโยบาย |
POST |
/api/diagnostics/bundle |
สร้างไฟล์เก็บถาวรวินิจฉัยที่ลบข้อมูลอ่อนไหวแล้ว |
GET |
/api/connections/export |
ส่งออกการเชื่อมต่อเป็น HAR 1.2 |
GET |
/api/rewrites |
ทุกตระกูลการเขียนใหม่/การตอบกลับจำลอง และรายการโฮสต์ MitM |
GET |
/api/rewrites/:family |
กฎของตระกูลหนึ่ง |
POST |
/api/rewrites/:family |
เพิ่มกฎ |
DELETE |
/api/rewrites/:family/:id |
ลบกฎ |
DELETE |
/api/rewrites/:family |
ล้างตระกูล |
GET |
/api/mitm/hosts |
โฮสต์ที่กำลังถอดรหัสอยู่ |
POST |
/api/mitm/hosts |
เพิ่มโฮสต์ |
DELETE |
/api/mitm/hosts/:host |
ลบโฮสต์ |
DELETE |
/api/mitm/hosts |
ล้างรายการ |
GET |
/api/rules/providers |
ผู้ให้บริการกฎและชุดกฎ พร้อมสถานะของแต่ละรายการ — รวมถึงเหตุผลที่บางรายการโหลดไม่สำเร็จ |
หมายเหตุจุดปลายทาง:
GET /api/connectionsรับlimit(จำนวนเต็มบวก ค่าเริ่มต้นและสูงสุด 1000) และcursor(ส่งคืนเฉพาะการเชื่อมต่อที่มีidมากกว่าเคอร์เซอร์)dataในการตอบกลับประกอบด้วยconnections,total,page_size,has_moreและ — เมื่อมีหน้าเพิ่มเติม —next_cursorGET /api/connections/historyรับlimit(ค่าเริ่มต้น 100 สูงสุด 1000) และcursor/before(ชื่อพ้องกัน; การส่งทั้งสองพร้อมกันจะถูกปฏิเสธ)GET /api/connections/:id/requestและ.../responseส่งคืน{"connection_id": <id>, "data": "<base64>"}ข้อมูลที่บันทึกไว้ที่ใหญ่กว่า 2 MiB ส่งคืน413GET /api/configส่งคืนการกำหนดค่าโดยค่าที่ละเอียดอ่อน (http-auth,external-http-secret,ca-p12,ca-passphrase, คีย์ WireGuard และค่าทำนองเดียวกัน) ถูกแทนที่ด้วย<redacted>— อย่าป้อนผลลัพธ์กลับเข้าPUT /api/configโดยตรง มิฉะนั้นตัวยึดตำแหน่งเหล่านี้จะถูกเขียนลงในการกำหนดค่าตามตัวอักษรGETและPUT /api/configเข้าถึงได้ในชื่อ/api/configsด้วย และในชื่อแฝงแบบ Clash/configsPUT /api/configรับได้ทั้ง JSON{"configuration": "<full text>"}หรือข้อความการกำหนดค่าดิบเป็นเนื้อหาคำขอ (จำกัด 1 MB) เมื่อสำเร็จ เอนจินจะโหลดใหม่ — หรือเริ่มทำงานหากยังไม่ได้รันPUT /api/policies/:groupนำการเลือกจากคีย์แรกที่พบในเนื้อหาคำขอตามลำดับpolicy,name,selected,select; ค่าอาจเป็นชื่อนโยบายหรือดัชนีตัวเลขในรูปสตริง ชื่อกลุ่มพิเศษGLOBALตั้งค่านโยบายที่เลือกแบบสากลPUT /api/modeต้องการตัวเลข JSON:{"mode": 0}—0ตามกฎ,1ตรง,2พร็อกซีPUT /api/features/mitmและPUT /api/features/record-trafficรับ{"enabled": true}GET /api/logsรับsince(วินาที Unix); บัฟเฟอร์ในหน่วยความจำเก็บรายการล่าสุด 1000 รายการ แต่ละรายการเป็น{timestamp, wall_time, level, section, message}—timestampและwall_timeมีค่าวินาที Unix เดียวกัน และถูกขยับไปข้างหน้าเมื่อนาฬิกาไม่เดิน เพื่อให้ลำดับของรายการเรียงกันอย่างเคร่งครัดGET /api/healthรายงานว่าเอนจินกำลังถืออะไรอยู่ ปฏิเสธอะไรครั้งล่าสุดเพราะอะไร และรอบก่อนหน้าจบลงอย่างไร (clean,uncleanหรือsuspected_memory— ดูการแก้ไขปัญหา)GET /api/eventsให้บัฟเฟอร์วงแหวนในหน่วยความจำ ส่วน?persisted=1อ่านประวัติที่บันทึกไว้ของรอบนี้แทน และตอบavailable: falseเมื่อปิดการบันทึก- เมื่อไม่ได้กำหนดส่วน
[Tailscale]GET /api/tailscaleจะตอบstate: "idle"ซึ่งเป็นคำตอบปกติ ไม่ใช่ข้อผิดพลาด - การตรวจ
POST /api/diagnostics/*รับอาร์กิวเมนต์จากคิวรีสตริงหรือ JSON body มีขีดจำกัดสิบวินาที และตอบเพียงครั้งเดียวurl-test/:policyจะปฏิเสธชื่อนโยบายที่ไม่มีอยู่ แทนที่จะไปวัดREJECT GET /api/scriptsแสดงรายการสคริปต์ generic ที่เปิดใช้งานอยู่ในรูป{name, type}ส่วนPOST /api/scripts/runรับnameจากเนื้อหาคำขอหรือคิวรีสตริง มีขีดจำกัดเวลาเหมือนการตรวจวินิจฉัย และตอบ{name, timedOut, result}—timedOutแยกสคริปต์ที่ไม่เคยเรียก$doneออกจากสคริปต์ที่ทำงานจนจบ ชื่อที่ไม่ใช่สคริปต์ generic ที่เปิดใช้งานอยู่จะได้404POST /api/rules/matchตอบว่าคำขอจะไปที่ใด โดยไม่เปิดการเชื่อมต่อ มันรับhost(หรือurlเพื่อดึงโฮสต์และพอร์ตมา ซึ่งกฎURL-REGEXจะถูกทดสอบกับurlนี้ตามที่เขียนไว้ทุกตัวอักษร แม้ในทราฟฟิกจริงกฎนี้จะเห็นเพียงคำขอhttp://ธรรมดาเท่านั้น),port(ค่าเริ่มต้น 443) และตัวเลือกเสริมip,protocol,process,process_path,src_ip,src_port,in_port,in_type,in_user,in_name,network,ssid,bssid,from_tun,user_agent— ฟิลด์ที่ไม่รู้จักจะถูกปฏิเสธพร้อมรายการที่ยอมรับ ไม่ใช่ถูกเพิกเฉย คำตอบมีกฎmatched(บรรทัดกฎ ชนิด นโยบายที่มันระบุ และresolved_policyที่กลุ่มกำลังชี้อยู่),policy,need_resolveและrule_countกับmatch_generationที่ใช้คำนวณ เนื่องจากโดเมนถูกจับคู่สองครั้ง — ครั้งหนึ่งด้วยชื่อ และอีกครั้งเมื่อรู้ที่อยู่แล้ว —passesจึงมีหนึ่งรายการต่อหนึ่งรอบ ถ้าไม่ส่งipมาจะมีเฉพาะรอบก่อนการแปลง และคำตอบจะบอกไว้ในnoteเพิ่มexplain=trueเพื่อดูกฎที่อาจตรงได้เช่นกันสูงสุด 50 ข้อ พร้อมจำนวนชุดกฎที่ไม่ได้กางออกPOST /api/config/validateแยกวิเคราะห์การกำหนดค่าแล้วทิ้ง: เอนจินที่กำลังทำงานไม่รับอะไรไปเลย ส่งเป็น{"configuration": "<full text>"}หรือส่งข้อความดิบก็ได้ คำตอบคือvalid,error_count,advisory_count,rule_count,policy_countและรายการerrorsที่มี{line, severity, content, error}—severityแยกบรรทัดที่ถูกปฏิเสธออกจากบรรทัดที่ยอมรับพร้อมข้อความแจ้ง และcontentคือบรรทัดที่มีปัญหาในรูปแบบที่ปิดบังแล้ว เพราะบรรทัด[Proxy]ที่ผิดมักพารหัสผ่านที่ทำให้มันผิดมาด้วย ใช้มันก่อนPUT /api/configซึ่งจะรีสตาร์ตรอบการทำงานที่คุณกำลังดีบักอยู่GET /api/loglevelรายงานlevelปัจจุบัน,nslog_level,sectionsที่กำลังเขียนลงไฟล์ และavailable_levels/available_sectionsที่คุณตั้งได้ ส่วนPUT(หรือPATCH) รับlevel,sectionsหรือทั้งคู่:sectionsเป็นอาร์เรย์ของชื่อส่วนหรือสตริง"all"และอาร์เรย์ว่างจะถูกปฏิเสธ — ถ้าจะหยุดบันทึกให้ใช้levelเป็นnoneการเปลี่ยนระดับด้วยวิธีนี้ไม่รีสตาร์ตรอบการทำงาน ซึ่งเป็นประเด็นสำคัญ:loglevel = verboseในไฟล์ต้องโหลดใหม่ และการโหลดใหม่จะทำให้สิ่งที่คุณพยายามจะดูหายไปGET /api/rulesยังรายงานrewrite_hitsด้วย — ทุกกฎเขียนใหม่หรือกฎการตอบกลับจำลองที่ทำงานในรอบนี้พร้อมจำนวนครั้ง กฎที่ไม่ปรากฏตรงนั้นคือกฎที่ไม่เคยตรงเลย ซึ่งเป็นคำอธิบายที่พบบ่อยที่สุดของการเขียนใหม่ที่ดูเหมือนไม่ทำอะไร ตารางนี้ติดตามกฎที่ต่างกันได้สูงสุด 512 กฎ และรายงานส่วนที่เกินในrewrite_hit_dropped_rulesrulesจะแสดงทุกกฎที่ตัวจับคู่ไล่ตรวจตามลำดับ: กฎอัตโนมัติของ Tailscale ตามด้วยกฎของโมดูล แล้วจึงเป็นส่วน[Rule]ของการกำหนดค่า และปิดท้ายด้วยFINALส่วนrule_regionsจะบอกที่มาของแต่ละบรรทัดตามดัชนีเดียวกัน (front,module,configuration)POST /api/rewrites/:familyรับ{"rule": "<configuration line>"}— ข้อความเดียวกับที่คุณจะเขียนในไฟล์ บรรทัดที่แยกวิเคราะห์ไม่ได้จะถูกปฏิเสธด้วย400แทนที่จะถูกเก็บเป็นกฎที่ไม่มีวันตรง:familyเป็นหนึ่งในurl-rewrite,header-rewrite,body-rewrite,mockกฎที่เพิ่มด้วยวิธีนี้อยู่ในเอนจินที่กำลังทำงานเท่านั้น และจะไม่ถูกเขียนกลับลงไฟล์การกำหนดค่าGET /api/connections/export?format=harคืน เอกสาร HAR 1.2 และPOST /api/diagnostics/bundleคืนไฟล์ zip — ทั้งคู่เป็นไฟล์ จึงไม่ถูกห่อด้วย{"ok": ..., "data": ...}ต่างจากทุกจุดปลายทางอื่นexportรับsource(currentเป็นค่าเริ่มต้น หรือhistory),limit(ค่าเริ่มต้น 100 สูงสุด 300),idsและbodies=1เพื่อรวมเพย์โหลดที่จับไว้ แต่ละรายการมีอ็อบเจกต์_klบรรจุสิ่งที่ HAR ไม่มีฟิลด์รองรับ ได้แก่ นโยบายที่เลือก กฎที่ตรง และการเขียนใหม่ที่ทำงาน- ระเบียนของการเชื่อมต่อที่ต่อพ่วงใน
GET /api/connectionsและGET /api/connections/historyมีchainPathคือเส้นทางจากอุปกรณ์นี้ถึงทางออก เช่นAirport/HK-01 → Landingค่าจะว่างสำหรับการเชื่อมต่อที่ใช้นโยบายเดียว และการส่งออก HAR เก็บไว้ใน_kl.chainในตัวนับรายนโยบายของGET /api/trafficอัปสตรีมจะนับไบต์ที่รับส่งให้การเชื่อมต่อที่ต่อพ่วงด้วย ส่วนยอดรวมทั้งหมดนับเพียงครั้งเดียว
ตัวอย่าง — อ่านสถานะ จากนั้นสลับกลุ่มนโยบาย:
curl -H "Authorization: Bearer your-secret-token" http://127.0.0.1:9090/api/status
{"ok":true,"data":{"running":true,"outbound_mode":0,"mitm":false, ...}}
curl -X PUT -H "Authorization: Bearer your-secret-token" \
-d '{"policy": "ProxyB"}' http://127.0.0.1:9090/api/policies/MainGroup
{"ok":true,"data":{"outbound_mode":0,"selectable_groups":[...], ...}}
ตัวอย่าง — ถามว่าคำขอจะไปที่ใดก่อนจะส่งจริง:
curl -X POST -H "Authorization: Bearer your-secret-token" \
-d '{"url": "https://api.example.com/v1/orders", "explain": true}' \
http://127.0.0.1:9090/api/rules/match
{"ok":true,"data":{"policy":"MainGroup","matched":{"rule":"DOMAIN-SUFFIX,example.com,MainGroup", ...}, ...}}
จำกัดบันทึกให้เหลือระบบย่อยเดียวขณะทำซ้ำปัญหา โดยไม่ต้องรีสตาร์ตรอบการทำงาน:
curl -X PUT -H "Authorization: Bearer your-secret-token" \
-d '{"level": "verbose", "sections": ["MitM", "DNS"]}' \
http://127.0.0.1:9090/api/loglevel
หมายเหตุ: คุณสมบัตินี้ถูกปิดใช้งานโดยค่าเริ่มต้น ทุกการตอบกลับใช้รูปแบบครอบ (envelope)
{"ok": true, "data": {...}}เมื่อสำเร็จและ{"ok": false, "error": {"code": "...", "message": "..."}}เมื่อเกิดข้อผิดพลาด; เนื้อหาคำขอถูกจำกัดที่ 1 MBปลายทาง
PUTยังรับPATCHด้วย มีพาธชื่อแฝงที่เข้ากันได้กับ Clash สำหรับแดชบอร์ดจากบุคคลที่สาม:/version,/traffic,/connections,/configs,/proxies,/rules— พาธเหล่านี้เข้าถึงได้ แต่การตอบกลับใช้รูปแบบครอบและชื่อฟิลด์ของ Chute แทน schema ของ Clash (/versionส่งคืน{"name", "run_id", "egress_probe"}โดยegress_probeเป็นnetwork_addressบนเอนจินของ Apple และegress_ipบนเอนจินของ Android) ดังนั้นแดชบอร์ด Clash จะไม่สามารถใช้ได้ทันที
URL ทดสอบพร็อกซี
[General]
proxy-test-url = http://cp.cloudflare.com/generate_204
test-timeout = 3
proxy-test-url คือ URL ทดสอบของทุกกลุ่ม url-test, fallback และ load-balance ที่ไม่ได้ตั้ง url ของตัวเอง และ test-timeout (วินาที) คือระยะหมดเวลาของกลุ่มเหล่านั้นที่ไม่มี timeout กลุ่มจะยังคงใช้คีย์เหล่านี้ต่อไปแม้หลังบันทึกการกำหนดค่า มีเพียง url หรือ timeout ที่เขียนไว้ในบรรทัดของกลุ่มเท่านั้นที่แทนที่ได้ ค่า proxy-test-url ที่ไม่ถูกต้องถือเป็นข้อผิดพลาดของการกำหนดค่า ส่วน internet-test-url ใช้โดยการทดสอบอินเทอร์เน็ตโดยตรงของคอนโซลเว็บ และดึงโดยไม่ผ่านพร็อกซี หากไม่ตั้งค่า เอนจินจะใช้ URL ตรวจสอบความสำเร็จในตัว
UDP ผ่านนโยบายที่ไม่รองรับ UDP
udp-policy-not-supported-behaviour = DIRECT
กำหนดสิ่งที่เกิดกับดาต้าแกรม UDP เมื่อนโยบายของมันส่งต่อ UDP ไม่ได้ เช่น พร็อกซี HTTP ธรรมดา: REJECT (ค่าเริ่มต้น) จะทิ้ง ส่วน DIRECT จะส่งโดยตรงแทน block-quic จะถูกตัดสินก่อนหน้านี้ ตามนโยบายที่กฎเลือก: เมื่อ block-quic = auto QUIC ที่มุ่งไปยังพร็อกซีที่ส่งต่อ UDP ไม่ได้จะถูกปฏิเสธแทนที่จะถูกส่งโดยตรง ส่วน UDP อื่นยังคงถอยกลับไปใช้ DIRECT ตามเดิม UDP ของนโยบายที่ต่อพ่วงซึ่งผ่านอัปสตรีมของมันไม่ได้ ก็จัดการแบบเดียวกัน และอัปสตรีม DoQ หรือ DoH3 ที่ทำตามโหมดขาออกไปตกที่นโยบายที่ไม่รับส่ง UDP ก็เช่นกัน: REJECT จะข้ามอัปสตรีมนั้น ส่วน DIRECT จะสอบถามโดยตรง
พร็อกซีด่านหน้า
[General]
global-underlying-proxy = Airport
ส่งนโยบายพร็อกซีทุกตัวที่ไม่มี underlying-proxy ของตัวเอง ผ่านนโยบายหรือกลุ่มที่ระบุ — สิ่งที่ Shadowrocket เรียกว่าพร็อกซีด่านหน้า (前置代理) และตั้งได้เฉพาะในแอป นโยบายของผู้ให้บริการพร็อกซีก็รวมอยู่ด้วย สิ่งที่คงไว้ตามเดิม: นโยบายทุกตัวที่การเชื่อมต่อผ่านนโยบายด่านหน้าเองอาจผ่าน — สมาชิกของมัน อัปสตรีมของสมาชิก และฮอปของ Relay ในนั้น — เพื่อไม่ให้นโยบายด่านหน้าวนผ่านตัวเอง; นโยบายที่เขียน underlying-proxy=DIRECT ซึ่งเป็นการเลือกไม่ใช้; กลุ่มนโยบาย ซึ่งสมาชิกเป็นผู้ตัดสิน; และ DIRECT, REJECT กับ TAILSCALE ไม่เขียนคีย์นี้หรือเขียน DIRECT เพื่อปิด ชื่อที่ไม่ได้กำหนดไว้จะทำให้นโยบายทุกตัวที่ควรครอบคลุมถูกปฏิเสธ แทนที่จะเชื่อมต่อโดยตรง
close-if-proxy-chain-missing (Shadowrocket) จะถูกอ่านและเขียนกลับเมื่อบันทึกโปรไฟล์ Chute ทำงานเหมือนค่า true ของมันเสมอ: นโยบายที่ต่อพ่วงซึ่งอัปสตรีมหายไปจะถูกปฏิเสธ ส่วน false — ค่าเริ่มต้นของ Shadowrocket ซึ่งข้ามฮอปที่หายไปแล้วเชื่อมต่อโหนดโดยตรง — จะไม่ถูกทำตาม และมีข้อความแจ้งในบันทึกหนึ่งครั้ง
ลายนิ้วมือไคลเอนต์
global-client-fingerprint = chrome
กำหนดลายนิ้วมือไคลเอนต์ TLS ให้ทุกนโยบายที่ไม่ได้ระบุfingerprint ของตนเอง รวมถึงนโยบายที่ผู้ให้บริการพร็อกซีจัดมาให้ ค่าของนโยบายจะมาก่อนเสมอ ดังนั้นค่านี้เป็นค่าเริ่มต้นไม่ใช่การเขียนทับ
ค่าที่รองรับคือ chrome, firefox, safari และ ios รวมถึง edge, 360,qq, android และ random ซึ่งทั้งหมดถูกจัดการเป็น Chrome รวมถึงชื่ออื่นที่ระบุไว้ในfingerprint ค่าที่ไม่รู้จักจะถูกละเว้นพร้อมคำเตือน Ignoring unsupported global-client-fingerprint '<value>' และใช้ TLS ของแพลตฟอร์มแทน
ค่าเริ่มต้น: ว่าง หมายถึงใช้ TLS ของแพลตฟอร์ม นโยบาย ShadowTLS อ่านค่านี้เสมอ ส่วนนโยบาย VLESS อ่านเมื่อตั้ง
tls=trueหรือreality=trueนโยบาย Trojan และ VMess อ่านเมื่อตั้งtls=trueและนโยบาย Shadowsocks อ่านเมื่อตั้งทั้งws=trueและtls=trueนโยบายที่ใช้การขนส่งแบบ gRPC ก็ต้องเขียนtls=trueด้วย และนโยบาย ShadowsocksR ไม่อ่านค่านี้
หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก