ตัวเลือกเบ็ดเตล็ด
[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 ได้ครบ จะถูกจับคู่ด้วยที่อยู่เหมือนเดิม
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
เมื่อเปิดใช้งาน Chute ส่งคืนผลลัพธ์ DNS ที่แคชไว้ทันทีในขณะที่รีเฟรชระเบียนในพื้นหลัง สิ่งนี้ลดความหน่วงในการเชื่อมต่อโดยมีค่าใช้จ่ายคืออาจส่งคืนระเบียน DNS ที่เก่า เมื่อปิด ระเบียนที่ TTL หมดอายุแล้วจะถูกทิ้งแทนที่จะถูกส่งคืน และคำขอจะไปยังต้นทาง ส่วนการรีเฟรชยังคงเกิดขึ้น การค้นหาครั้งถัดไปจึงตอบจากแคชได้ ตัวเลือกนี้ยังกำหนดบนทุกแพลตฟอร์มด้วยว่าทันเนลจะเชื่อมต่อไปยังหลายที่อยู่ของชื่อเดียวพร้อมกันหรือไม่
ค่าเริ่มต้น:
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 ไม่อ่านค่านี้
หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก