Прочие параметры
[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; записи loopback пропускаются, потому что трафик loopback в туннель не попадает. В версии 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. Хост прослушивания с подстановочным значением (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 фиксированный список из 18 имён хостов Apple — push, шлюз iCloud, проверка captive-портала, OCSP и подобные — и добавляет IP-CIDR,17.0.0.0/8,DIRECT,no-resolve после ваших правил, прямо перед FINAL, — так что ваше собственное правило, которое раньше совпадёт с 17.0.0.0/8, по-прежнему побеждает. Никакого сопоставления по процессам нет: этот параметр — именно фиксированный список хостов и адресов, а не фильтр по тому, какой процесс сделал запрос.
По умолчанию:
true.
Всегда реальный IP
always-real-ip = *.example.com, tracker.example.org
Когда Chute выдаёт поддельные IP-адреса для перехваченных DNS-запросов (см. hijack-dns), имена хостов, совпадающие с этим списком, разделенным запятыми, всегда получают в ответ свои реальные разрешенные IP-адреса. Поддерживаются подстановочные знаки. 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-сервер. (Например, 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 помощника, ни сетевое расширение Mac не исключают ни одного маршрута. Запросы, обрабатываемые прокси-сервером Chute, не будут затронуты. Комбинируйте 'skip-proxy' и 'tun-excluded-routes', чтобы гарантировать, что определённый HTTP-трафик обходит Chute.
Этот параметр может вызвать системную ошибку ENOMEM (невозможно выделить память). Похоже, это ошибка в системе 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), адреса link-local, многоадресные и широковещательные адреса и длина префикса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 КиБ, так что его имя тоже читается. Пока остаток hello ещё не пришёл, датаграммы потока удерживаются, а не отправляются по «голому» адресу, и уходят вместе по политике имени, как только оно прочитано, — первый фрагмент разрезанного hello больше не идёт другим путём, чем остальная его часть. Ограничители: ожидание в одну секунду, восемь датаграмм или 16 КиБ на поток и 64 одновременно собираемых потока; поток, вышедший за любое из них, а также тот, чьи пакеты Initial так и не составили ClientHello целиком, сопоставляется по адресу, как прежде.
sniffing-timeout (По умолчанию: 100 мс)
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 |
Написание on, принятое в Surge. |
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-эхо-запрос, попавший в туннель, — 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.
Оптимистичный 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 = true
Ключ replica в [General] (replica = true) включает запись трафика; раздел [Replica] фильтрует то, что отображает Chute Dashboard — его ключи описаны в разделе Реплика.
На iOS, tvOS и Android нужна ещё и действующая лицензия: без неё
replica = trueничего не захватывает.
Доступ внешнего контроллера (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 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 API управления и веб-консоль, аналогичный панелям Clash и Surge. API предоставляет статус движка, трафик, соединения, DNS, управление политиками и управление конфигурацией через конечные точки REST.
Запись Surge http-api = <секрет>@<хост>:<порт> читается как 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 МБ на macOS и 1 МБ на 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 генерирует токен, а не отдаёт API без аутентификации. Сгенерированный токен записывается в файл control-token в общей папке Chute — не рядом с конфигурацией: в контейнер группы приложений на iOS и tvOS, в закрытый каталог данных приложения на Android — с правами только для владельца, переиспользуется после перезапуска, и приложения показывают его — см. Открытие веб-консоли. Управляющий API может выдать базу соединений, записи которой содержат каждый URL, заголовок и имя процесса, встреченные за этот запуск; открытый контроллер — неразумное значение по умолчанию.
Если всё же нужно отдавать API без аутентификации, скажите это в конфигурации явно:
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 включённым, отключив интерфейс.
Открытие веб-консоли
Консоль отдаётся по адресу контроллера, и каждое приложение может передать вам адрес и токен — включая сгенерированный, прочитать который иначе негде:
- Chute Mac: строка меню → Открыть веб-консоль и Копировать токен веб-консоли. В окне сведений о соединении также есть Запросы и история, открывающая консоль — её главную страницу, а не это соединение.
- Chute iOS: панель управления → строка Веб-консоль → Открыть, Копировать адрес или Копировать токен доступа.
- Chute tvOS: в панели управления есть отдельная строка Адрес веб-консоли, показывающая хост и порт. При её выборе показывается QR-код, если слушатель доступен с других устройств — токен входа спрятан внутри кода, а не на экране, — а если контроллер привязан к петлевому адресу, вместо него выводится объяснение: петлевую консоль с телефона не открыть.
- 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 МиБ возвращают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 МБ). При успехе движок перезагружается — или запускается, если он не работал.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-тела, ограничены десятью секундами и отвечают ровно один раз.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
Примечание: Эта функция отключена по умолчанию. Каждый ответ использует конверт
{"ok": true, "data": {...}}при успехе и{"ok": false, "error": {"code": "...", "message": "..."}}при ошибках; тела запросов ограничены 1 МБ.Конечные точки
PUTтакже принимаютPATCH. Для сторонних панелей доступны Clash-совместимые псевдонимы путей:/version,/traffic,/connections,/configs,/proxies,/rules— пути доступны, но ответы используют конверт и имена полей Chute, а не схему 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 его не читают.
Эта страница — перевод английской версии. При расхождениях приоритет имеет английская версия.