ตัวเลือกเบ็ดเตล็ด
[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 ตัวเลือกนี้บังคับให้การเชื่อมต่อไปยังช่วงโดเมน/IP เหล่านี้ถูกจัดการโดย Chute TUN แทนพร็อกซี Chute ในเวอร์ชัน macOS การตั้งค่าเหล่านี้จะถูกนำไปใช้กับระบบเมื่อเปิดใช้งาน "Set as System Proxy" ตัวเลือกนี้ใช้เพื่อแก้ไขปัญหาความเข้ากันได้กับบางแอป
- เพื่อระบุโดเมนเดียว ให้ป้อนชื่อโดเมน - ตัวอย่างเช่น 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)
ชื่อพ้องเพื่อความเข้ากันได้:
doh-serverถูกยอมรับให้เป็นชื่อพ้องของ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 บรรทัดนี้สามารถระบุซ้ำได้เพื่ออนุญาตข้อมูลรับรองหลายชุด
บายพาสคำขอของระบบ
bypass-system = true
เมื่อเปิดใช้งาน คำขอที่ส่งโดยกระบวนการของระบบจะบายพาสการประมวลผลของ Chute
ค่าเริ่มต้น:
true
Always Real IP
always-real-ip = *.example.com, tracker.example.org
เมื่อ Chute ให้บริการที่อยู่ IP ปลอมสำหรับคำถาม DNS ที่ถูกไฮแจ็ก (ดู hijack-dns) ชื่อโฮสต์ที่ตรงกับรายการที่คั่นด้วยคอมมานี้จะถูกตอบด้วยที่อยู่ IP จริงที่แก้ไขแล้วเสมอแทน รองรับ wildcard
ขัดจังหวะการเชื่อมต่อที่มีอยู่
interrupt-exist-connections = true
เมื่อเปิดใช้งาน การเปลี่ยนนโยบายที่เลือกในกลุ่มนโยบายใดๆ (ผ่าน URL Test, Fallback, Load Balance, SSID หรือการเลือกด้วยตนเอง) จะปิดการเชื่อมต่อที่มีอยู่ที่ใช้นโยบายเก่าอย่างนุ่มนวล สิ่งนี้รับประกันว่าการเชื่อมต่อใช้พร็อกซีที่เลือกใหม่ทันทีแทนที่จะค้างอยู่กับพร็อกซีเก่า
การเชื่อมต่อที่ได้รับผลกระทบแต่ละรายการถูกปิดอย่างนุ่มนวลด้วยเวลาหมด 3 วินาทีก่อนที่จะถูกบังคับปิด
ค่าเริ่มต้น:
falseนี่คือการตั้งค่าส่วนกลาง — มันส่งผลต่อกลุ่มนโยบายทั้งหมด
Network Framework (macOS / tvOS)
network-framework = true
เปิดใช้งาน Apple Network.framework สำหรับการเชื่อมต่อขาออก การใช้ Network.framework สามารถให้ประสิทธิภาพที่ดีขึ้นและการรวมสแตก TLS สมัยใหม่บนแพลตฟอร์มที่รองรับ
ค่าเริ่มต้น:
trueบน macOS,falseบน iOS และ tvOS
ยกเว้นชื่อโฮสต์อย่างง่าย
exclude-simple-hostnames = true
เมื่อเปิดใช้งาน คำขอไปยังชื่อโฮสต์อย่างง่าย (ชื่อป้ายเดียวที่ไม่มีจุด เช่น localhost) ข้ามกฎพร็อกซีและถูกแก้ไขในเครื่อง สิ่งนี้ช่วยหลีกเลี่ยงการค้นหา DNS ที่ไม่จำเป็นสำหรับชื่อเครือข่ายท้องถิ่น
บน Chute Mac มีการย้ายข้อมูลแบบครั้งเดียวที่เปิดใช้งานตัวเลือกนี้เป็นค่าเริ่มต้นในการรันครั้งแรก แต่หากผู้ใช้ตั้งค่าปิดไว้อย่างชัดเจน ระบบจะเคารพการตั้งค่านั้น
ค่าเริ่มต้น:
false
ปิดใช้งานการบันทึกฐานข้อมูล
disable-db-record = true
เมื่อเปิดใช้งาน Chute หยุดเขียนระเบียนทราฟฟิกไปยังฐานข้อมูลในเครื่อง สิ่งนี้สามารถปรับปรุงประสิทธิภาพและลดการใช้พื้นที่เก็บข้อมูล แต่ประวัติทราฟฟิกจะไม่พร้อมใช้งานใน Chute Dashboard
ค่าเริ่มต้น:
false
การแสดงความเร็วในแถบเมนู (เฉพาะ Mac)
menu-bar-show-speed = true
เมื่อเปิดใช้งาน Chute Mac แสดงความเร็วอัปโหลดและดาวน์โหลดปัจจุบันในแถบเมนู
ค่าเริ่มต้น:
false
ไฮแจ็กเซิร์ฟเวอร์ 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 ทั้งหมด
เส้นทางที่ยกเว้น
tun-excluded-routes = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
Chute VIF สามารถประมวลผลเฉพาะโปรโตคอล TCP และ UDP ใช้ตัวเลือกนี้เพื่อข้ามช่วง IP ที่ระบุเพื่ออนุญาตให้ทราฟฟิกทั้งหมดผ่านได้
หมายเหตุ: ตัวเลือกนี้ทำงานเฉพาะกับประเภท Enhanced Mode แบบ VIF (utun) — มันไม่มีผลเมื่อใช้ประเภท PacketTunnel VPN คำขอที่จัดการโดย 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 ใช้ตัวเลือกนี้เพื่อเพิ่มเส้นทางที่เล็กกว่า
หมายเหตุ: ตัวเลือกนี้ทำงานเฉพาะกับประเภท Enhanced Mode แบบ VIF (utun) — มันไม่มีผลเมื่อใช้ประเภท PacketTunnel VPN
การดมกลิ่นโปรโตคอล
sniffing-enabled = true
sniffing-timeout = 100
Chute สามารถตรวจจับโปรโตคอลที่แท้จริงของการเชื่อมต่อโดยการตรวจสอบไบต์เริ่มต้น สิ่งนี้ทำให้กฎเช่น PROTOCOL,TLS,Proxy ทำงานได้อย่างถูกต้องแม้สำหรับการเชื่อมต่อขาเข้าที่ไม่ใช่ HTTP
sniffing-enabled (ค่าเริ่มต้น: false)
sniffing-enabled = true
เปิดใช้งานการตรวจจับโปรโตคอลสำหรับการเชื่อมต่อ TCP
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 จะยังคงถูกปฏิเสธตามกฎนั้น |
สำหรับทราฟฟิกที่เข้ามาทาง TUN Chute จะตอบกลับโฟลว์ QUIC ที่ถูกปฏิเสธด้วยข้อความ ICMP/ICMPv6 Port Unreachable ทำให้ไคลเอนต์ที่รองรับสามารถถอยกลับไปใช้ TCP ได้โดยไม่ต้องรอ QUIC หมดเวลา
การตรวจจับ QUIC สำหรับ
block-quicทำงานโดยอัตโนมัติและไม่ต้องใช้sniffing-enabledโดยsniffing-enabledใช้ควบคุมการตรวจจับโปรโตคอล TCP หากต้องการจัดการแต่ละโฟลว์ QUIC ด้วยกฎ ให้ใช้กฎPROTOCOL,QUIC,...
บายพาส TUN
bypass-tun = 192.168.0.0/16, 10.0.0.0/8
คล้ายกับ skip-proxy แต่ทำงานในระดับการจัดเส้นทาง TUN/VIF การเชื่อมต่อไปยังช่วง IP เหล่านี้จะบายพาสอินเทอร์เฟซ TUN ทั้งหมดและผ่านสแตกเครือข่ายของระบบโดยตรง
หมายเหตุ: ตัวเลือกนี้ทำงานเฉพาะกับประเภท Enhanced Mode แบบ VIF (utun) มันไม่มีผลเมื่อใช้ประเภท PacketTunnel VPN
แสดงหน้าข้อผิดพลาดสำหรับ Reject
show-error-page-for-reject = true
เมื่อเปิดใช้งาน Chute ส่งคืนหน้าข้อผิดพลาดที่เป็นมิตรกับผู้ใช้สำหรับคำขอที่ถูกปฏิเสธแทนที่จะเพียงแค่ทิ้งการเชื่อมต่อ
Optimistic DNS
optimistic-dns = false
เมื่อเปิดใช้งาน Chute ส่งคืนผลลัพธ์ DNS ที่แคชไว้ทันทีในขณะที่รีเฟรชระเบียนในพื้นหลัง สิ่งนี้ลดเวลาแฝงในการเชื่อมต่อโดยมีค่าใช้จ่ายคืออาจส่งคืนระเบียน 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
การเข้าถึง External Controller (Chute Dashboard)
external-controller-access = password@0.0.0.0:6155
เริ่มเซิร์ฟเวอร์ควบคุมระยะไกลที่ใช้โดย Chute Dashboard ค่าคือ password@host:port; อาจมีชื่อผู้ใช้นำหน้ารหัสผ่านก็ได้ (user:password@host:port) บน iOS ช่องทาง USB ที่มาคู่กันจะถูกเปิดบน port + 1 (ไม่มีบน macOS) วิธีเชื่อมต่ออยู่ในหน้า Chute Dashboard
HTTP Control API และ Web UI
[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 ในตัวและ UI การจัดการบนเว็บ คล้ายกับแดชบอร์ด Clash และ Surge API เปิดเผยสถานะเคอร์เนล ทราฟฟิก การเชื่อมต่อ DNS การควบคุมนโยบาย และการจัดการการกำหนดค่าผ่านปลายทาง REST
external-http-controller (ค่าเริ่มต้น: ปิดใช้งาน)
external-http-controller = 127.0.0.1:9090
ที่อยู่และพอร์ตของเซิร์ฟเวอร์ควบคุม 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 เท่านั้น ส่วนไฟล์สแตติกของ Web 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 ให้บริการ Web UI ในตัวที่ที่อยู่คอนโทรลเลอร์ Web UI มีแดชบอร์ดภาพรวม การจัดการการเชื่อมต่อ การตรวจสอบ DNS การตรวจสอบทราฟฟิก การควบคุมนโยบาย และการแก้ไขการกำหนดค่า ตั้งค่าเป็น false เพื่อให้ API เปิดใช้งานในขณะที่ปิดใช้งาน UI
การเปิดคอนโซลเว็บ
คอนโซลให้บริการที่ที่อยู่ของเซิร์ฟเวอร์ควบคุม และแต่ละแอปสามารถส่งที่อยู่กับโทเคนให้คุณได้ — รวมถึงโทเคนที่ระบบสร้างให้ ซึ่งมิฉะนั้นคุณจะไม่มีทางอ่านได้เลย:
- Chute Mac: แถบเมนู → เปิดคอนโซลเว็บ และ คัดลอกโทเคนคอนโซลเว็บ หน้าต่างรายละเอียดการเชื่อมต่อยังมี คำขอและประวัติ ซึ่งเปิดคอนโซลเช่นกัน — เปิดหน้าแรก ไม่ใช่การเชื่อมต่อนั้น
- Chute iOS: แผงควบคุม → แถว Web UI → เปิด, คัดลอกที่อยู่ หรือ คัดลอกโทเคนการเข้าถึง
- Chute tvOS: แผงควบคุมมีแถว ที่อยู่ Web UI แยกต่างหากใต้สวิตช์ Web UI แสดงโฮสต์และพอร์ต เมื่อเลือก ถ้าตัวรับฟังเข้าถึงได้จากอุปกรณ์อื่นจะแสดงคิวอาร์โค้ด — โทเคนลงชื่อเข้าใช้อยู่ในโค้ด ไม่แสดงบนหน้าจอ — แต่ถ้าตัวควบคุมผูกกับลูปแบ็ก จะแสดงคำอธิบายแทน เพราะคอนโซลบนลูปแบ็กเปิดจากโทรศัพท์ไม่ได้
- Chute Android: แผงควบคุมแสดงที่อยู่เป็นคำบรรยายใต้สวิตช์ HTTP API และมีแถว โทเค็นการเข้าถึงที่สร้างขึ้น แยกต่างหาก แตะเพื่อคัดลอก — แถวนี้ปรากฏเฉพาะเมื่อเคอร์เนลเป็นผู้สร้างโทเคน ซีเคร็ตที่คุณกำหนดเองจะไม่ถูกแสดงเลย
ที่อยู่ที่ได้จะพ่วงโทเคนมาในพารามิเตอร์คิวรี หน้าเว็บจะใช้มันตอนโหลดแล้วลบออกจากแถบที่อยู่ ดังนั้นการเปิดลิงก์คือการลงชื่อเข้าใช้ที่สมบูรณ์ ไม่มีใครต้องคัดเลข 16 ฐาน 32 ตัวด้วยมือ
external-http-cors (ค่าเริ่มต้น: false)
external-http-cors = true
เปิดใช้งานส่วนหัว CORS (Cross-Origin Resource Sharing) ในการตอบกลับ API มีประโยชน์เมื่อ Web UI หรือเครื่องมือบุคคลที่สามต้องการเข้าถึง 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 |
กลุ่มนโยบายและการเลือกปัจจุบัน |
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 |
POST |
/api/diagnostics/ping |
ตรวจการเข้าถึงด้วย ICMP หรือ TCP |
POST |
/api/diagnostics/dns-query |
แปลงชื่อโดเมนผ่านรีโซลเวอร์ที่กำลังทำงาน |
POST |
/api/diagnostics/egress-probe |
ตรวจหา IP ขาออกปัจจุบัน |
POST |
/api/diagnostics/url-test/:policy |
รันการทดสอบความหน่วงของนโยบาย |
POST |
/api/diagnostics/bundle |
สร้างไฟล์เก็บถาวรวินิจฉัยที่ลบข้อมูลอ่อนไหวแล้ว |
GET |
/api/connections/export |
ส่งออกการเชื่อมต่อเป็น HAR 1.2 |
GET |
/api/rewrites |
ทุกตระกูลการเขียนใหม่/Mock และรายการโฮสต์ 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/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โดยตรง มิฉะนั้นตัวยึดตำแหน่งเหล่านี้จะถูกเขียนลงในการกำหนดค่าตามตัวอักษรPUT /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, level, section, message}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 POST /api/rules/matchตอบว่าคำขอจะไปที่ใด โดยไม่เปิดการเชื่อมต่อ มันรับhost(หรือurlเพื่อดึงโฮสต์และพอร์ตมา),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ด้วย — ทุกกฎเขียนใหม่หรือ Mock ที่ทำงานในรอบนี้พร้อมจำนวนครั้ง กฎที่ไม่ปรากฏตรงนั้นคือกฎที่ไม่เคยตรงเลย ซึ่งเป็นคำอธิบายที่พบบ่อยที่สุดของการเขียนใหม่ที่ดูเหมือนไม่ทำอะไร ตารางนี้ติดตามกฎที่ต่างกันได้สูงสุด 512 กฎ และรายงานส่วนที่เกินในrewrite_hit_dropped_rulesPOST /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 ไม่มีฟิลด์รองรับ ได้แก่ นโยบายที่เลือก กฎที่ตรง และการเขียนใหม่ที่ทำงาน
ตัวอย่าง — อ่านสถานะ จากนั้นสลับกลุ่มนโยบาย:
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"}) ดังนั้นแดชบอร์ด Clash จะไม่สามารถใช้ได้ทันที
ลายนิ้วมือไคลเอนต์
global-client-fingerprint = chrome
กำหนดลายนิ้วมือไคลเอนต์ TLS ให้ทุกนโยบายที่ไม่ได้ระบุ fingerprint ของตนเอง ค่าของนโยบาย จะมาก่อนเสมอ ดังนั้นค่านี้เป็นค่าเริ่มต้นไม่ใช่การเขียนทับ
ค่าที่รองรับคือ chrome, firefox, safari และ ios รวมถึง edge, 360,
qq, android และ random ซึ่งทั้งหมดถูกจัดการเป็น Chrome ค่าที่ไม่รู้จักจะถูก
ละเว้นและใช้ TLS ของแพลตฟอร์มแทน
ค่าเริ่มต้น: ว่าง หมายถึงใช้ TLS ของแพลตฟอร์ม เฉพาะนโยบาย Trojan, VMess, VLESS และ ShadowTLS เท่านั้นที่อ่านค่านี้
หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก