Skip to content

Группы прокси — mihomo

Группы прокси — это именованные наборы прокси и других групп, которые действуют как единый именованный исходящий. mihomo предлагает четыре типа групп: select (ручной выбор), url-test (автовыбор по задержке), fallback (последовательный, по доступности) и load-balance (распределение трафика).

Общие параметры

Каждый тип группы несёт одну и ту же базу GroupCommonOption. Структурный тег group:"..." — собственный тег mihomo; ключи YAML совпадают с тегом.

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя группы. На него ссылаются правила и другие группы.
typestring(required)select | url-test | fallback | load-balanceТип группы. `relay` был удалён — вместо него используйте `dialer-proxy` на записи прокси.
proxies[]string[][<proxy or group name>]Явный список участников. Для членства на основе провайдеров используйте `use:`.
use[]string[][<proxy-provider name>]Брать участников из именованных proxy-providers.
urlstring(required for url-test/fallback)<URL>URL проверки доступности — периодический GET по этому URL измеряет задержку участников. Типично: `http://www.gstatic.com/generate_204`.
intervalint300<seconds>Интервал между проверками доступности, в секундах.
timeoutint5000<milliseconds>Тайм-аут проверки доступности в миллисекундах.
max-failed-timesint5<int>Число подряд неудачных проверок, после которого участник считается недоступным.
empty-fallbackstring(unset)<proxy name>Прокси, на который переключиться, когда в группе не осталось пригодных участников (например, всех убрал `filter`).
lazybooltruetrue | falseПри true проверки доступности выполняются, только когда группа реально используется. Экономит трафик на резервных группах.
disable-udpboolfalsetrue | falseОтклонять UDP-трафик на этой группе. Полезно, когда не все участники поддерживают UDP.
filterstring(unset)<regex> | <regex>`<regex>...Regex-фильтр по именам участников. Несколько регулярных выражений можно разделять обратными кавычками.
exclude-filterstring(unset)<regex>Regex-фильтр — исключить участников, чьё имя совпадает.
exclude-typestring(unset)<proxy type>Исключить участников определённых типов (например, `direct,ss`).
expected-statusstring*<HTTP status range>Допустимые коды состояния проверки доступности. `2xx` или `200-204,301`.
include-allboolfalsetrue | falseАвтоматически включить все прокси и все провайдеры — избавляет от ручного перечисления.
include-all-proxiesboolfalsetrue | falseАвтоматически включить все записи прокси (но не провайдеры).
include-all-providersboolfalsetrue | falseАвтоматически включить все proxy-providers (но не отдельные прокси).
hiddenboolfalsetrue | falseСкрыть группу из интерфейса панели управления.
iconstring(unset)<URL>URL иконки, отображаемой совместимыми панелями.

Исходный код: adapter/outboundgroup/parser.go:25-46 · зафиксировано на v1.19.29 (e26714a)

Каждый тип группы дополнительно декодирует из той же YAML-записи свою небольшую структуру параметров: SelectorOption, URLTestOption, FallbackOption (сейчас пустая) и LoadBalanceOption. Специфичные для типа ключи перечислены в разделах ниже.

type: select

Ручной выбор. Группа сообщает текущий выбор в Clash API (панели позволяют пользователям переключаться). Проверок доступности нет — выбранный участник используется как есть.

yaml
proxy-groups:
  - name: Manual
    type: select
    default-selected: Proxy-B
    proxies: [Proxy-A, Proxy-B, Proxy-C, DIRECT]

Дополнительный параметр (SelectorOption, adapter/outboundgroup/selector.go:12-14):

  • default-selected (строка) — участник, выбранный при создании группы, до какого-либо выбора в панели (или выбора, восстановленного из кэша через profile.store-selected). Если не задан или не найден среди участников, используется первый участник.

type: url-test

Автоматический выбор самого быстрого участника периодическим замером задержки по URL. Замер выполняется каждые interval секунд; активный выбор меняется, только когда новый участник быстрее более чем на tolerance (декодируется через URLTestOption в adapter/outboundgroup/urltest.go:17-19).

yaml
proxy-groups:
  - name: Auto
    type: url-test
    url: http://www.gstatic.com/generate_204
    interval: 300
    timeout: 5000
    tolerance: 50
    proxies: [Proxy-JP, Proxy-US, Proxy-HK, Proxy-SG]

Дополнительный параметр (URLTestOption, adapter/outboundgroup/urltest.go:17-19):

  • tolerance (uint16, миллисекунды) — порог переключения. По умолчанию 0 (всегда переключаться на абсолютно самого быстрого, что может приводить к метаниям).

type: fallback

Использовать первого отвечающего участника. Участники проверяются в порядке объявления; первый живой несёт весь трафик. Полезно для схем «основной + резервный». Его структура FallbackOption сейчас пуста — у типа нет ключей сверх общего набора.

yaml
proxy-groups:
  - name: HA
    type: fallback
    url: http://www.gstatic.com/generate_204
    interval: 60
    timeout: 3000
    max-failed-times: 3
    proxies: [Primary, Backup, DIRECT]

type: load-balance

Распределять трафик между участниками. Поле strategy (LoadBalanceOption, adapter/outboundgroup/loadbalance.go:22-24) выбирает алгоритм; по умолчанию consistent-hashing:

СтратегияПоведение
round-robinПеребирать участников по кругу.
consistent-hashingХешировать домен назначения — один и тот же домен всегда идёт к одному участнику. Полезно для «липкой» маршрутизации CDN. По умолчанию.
sticky-sessionsПервое соединение клиента выбирает участника; последующие соединения того же клиента переиспользуют его.
yaml
proxy-groups:
  - name: Distributed
    type: load-balance
    url: http://www.gstatic.com/generate_204
    interval: 300
    strategy: consistent-hashing
    proxies: [Proxy-1, Proxy-2, Proxy-3]

type: relay — удалён

Был группой-цепочкой прокси. Удалён; замена — поле dialer-proxy: на самой записи прокси (пример см. на странице Direct). Конфигурации, всё ещё объявляющие type: relay, завершаются явной ошибкой при запуске (adapter/outboundgroup/parser.go:189-194).

Инструменты формирования состава

Когда прокси много, вручную перечислять их в каждой группе тяжело. Задачу решают четыре флага include-all* плюс filter / exclude-filter:

yaml
proxy-groups:
  - name: All-JP
    type: url-test
    url: http://www.gstatic.com/generate_204
    interval: 300
    include-all: true
    filter: 'JP|Japan|🇯🇵'
    exclude-type: 'direct,reject'

Четыре флага выстраиваются по нарастающей:

  • include-all: true — сокращение для include-all-proxies и include-all-providers: true одновременно.
  • include-all-proxies покрывает записи в proxies:.
  • include-all-providers покрывает записи, подтянутые через proxy-providers:.
  • Обычный use: явно ссылается на именованные провайдеры.

filter принимает регулярные выражения, разделённые обратными кавычками, — каждое действует как OR. Так, filter: 'JP\Japan`🇯🇵'` совпадает с любым прокси, в имени которого есть любая из трёх строк.

Примеры

Типичная многоуровневая схема:

yaml
proxy-providers:
  vendor1:
    type: http
    url: https://example.com/sub
    interval: 86400
    path: ./providers/vendor1.yaml

proxy-groups:
  - name: 🚀 Proxy
    type: select
    proxies: [♻️ Auto, 🔯 Fallback, 🔮 LoadBalance, DIRECT]

  - name: ♻️ Auto
    type: url-test
    url: http://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50
    use: [vendor1]
    filter: '香港|新加坡|HK|SG'

  - name: 🔯 Fallback
    type: fallback
    url: http://www.gstatic.com/generate_204
    interval: 60
    use: [vendor1]
    filter: '日本|JP'

  - name: 🔮 LoadBalance
    type: load-balance
    url: http://www.gstatic.com/generate_204
    interval: 300
    strategy: consistent-hashing
    use: [vendor1]

  - name: 🎬 Stream
    type: select
    include-all: true
    filter: '美|US|🇺🇸'

rules:
  - DOMAIN-SUFFIX,netflix.com,🎬 Stream
  - MATCH,🚀 Proxy

Сравнение с другими ядрами

Эквивалент в sing-box — исходящие selector / urltest

sing-box реализует ту же идею как типы исходящих, а не как отдельное понятие «группа»:

json
{
  "outbounds": [
    { "type": "selector",
      "tag": "manual",
      "outbounds": ["proxy-jp", "proxy-us", "direct"],
      "default": "proxy-jp",
      "interrupt_exist_connections": false },
    { "type": "urltest",
      "tag": "auto",
      "outbounds": ["proxy-jp", "proxy-us"],
      "url": "https://www.gstatic.com/generate_204",
      "interval": "3m",
      "tolerance": 50 }
  ]
}

Selector:

ПолеТипПо умолчаниюДопустимые значенияОписание
outbounds[]string(required)[<outbound tag>]Исходящие-участники.
defaultstring(first in outbounds)<outbound tag>Начальный выбор при запуске.
interrupt_exist_connectionsboolfalsetrue | falseПри смене выбора закрывать активные соединения, шедшие через прежнего участника.

Исходный код: option/group.go:5-9 · зафиксировано на v1.13.15 (3708fa1)

URLTest:

ПолеТипПо умолчаниюДопустимые значенияОписание
outbounds[]string(required)[<outbound tag>]Исходящие-участники.
urlstringhttps://www.gstatic.com/generate_204<URL>URL проверки доступности.
intervalbadoption.Duration3m<duration>Как часто перепроверять участников.
toleranceuint1650<milliseconds>Переключаться на нового участника, только если он быстрее более чем на указанное число миллисекунд. Предотвращает метания, когда задержки двух участников близки.
idle_timeoutbadoption.Duration30m<duration>Прекратить проверки доступности после такого времени простоя — возобновить при следующем обращении.
interrupt_exist_connectionsboolfalsetrue | falseЗакрывать активные соединения при переключении.

Исходный код: option/group.go:11-18 · зафиксировано на v1.13.15 (3708fa1)

У sing-box нет точного эквивалента групп fallback и load-balance mihomo. Ближайший приём — urltest с очень маленьким tolerance для поведения в духе fallback либо цепочка селекторов.

Эквивалент в Xray — балансировщики

balancers в Xray описаны на странице Маршрутизация. Значения стратегий: random, roundRobin, leastPing, leastLoad. Эквивалента «селектора» (ручного выбора) в Xray нет — балансировщики маршрутизируют автоматически согласно стратегии.

Core Tutorial от Argsment