Прочие параметры

[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.


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 его не читают.

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

Эта страница — перевод английской версии. При расхождениях приоритет имеет английская версия.

results matching ""

    No results matching ""