ตัวเลือกเบ็ดเตล็ด

[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


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_cursor
  • GET /api/connections/history รับ limit (ค่าเริ่มต้น 100 สูงสุด 1000) และ cursor/before (ชื่อพ้องกัน; การส่งทั้งสองพร้อมกันจะถูกปฏิเสธ)
  • GET /api/connections/:id/request และ .../response ส่งคืน {"connection_id": <id>, "data": "<base64>"} ข้อมูลที่บันทึกไว้ที่ใหญ่กว่า 2 MiB ส่งคืน 413
  • GET /api/config ส่งคืนการกำหนดค่าโดยค่าที่ละเอียดอ่อน (http-auth, external-http-secret, ca-p12, ca-passphrase, คีย์ WireGuard และค่าทำนองเดียวกัน) ถูกแทนที่ด้วย <redacted> — อย่าป้อนผลลัพธ์กลับเข้า PUT /api/config โดยตรง มิฉะนั้นตัวยึดตำแหน่งเหล่านี้จะถูกเขียนลงในการกำหนดค่าตามตัวอักษร
  • GET และ PUT /api/config เข้าถึงได้ในชื่อ /api/configs ด้วย และในชื่อแฝงแบบ Clash /configs
  • 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, 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 ที่เปิดใช้งานอยู่จะได้ 404
  • POST /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_rules rules จะแสดงทุกกฎที่ตัวจับคู่ไล่ตรวจตามลำดับ: กฎอัตโนมัติของ 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 ไม่อ่านค่านี้

S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-29 21:57:05

หน้านี้เป็นฉบับแปลจากเวอร์ชันภาษาอังกฤษ หากเนื้อหาไม่ตรงกัน ให้ยึดเวอร์ชันภาษาอังกฤษเป็นหลัก

results matching ""

    No results matching ""