Группы прокси — mihomo
Группы прокси — это именованные наборы прокси и других групп, которые действуют как единый именованный исходящий. mihomo предлагает четыре типа групп: select (ручной выбор), url-test (автовыбор по задержке), fallback (последовательный, по доступности) и load-balance (распределение трафика).
Общие параметры
Каждый тип группы несёт одну и ту же базу GroupCommonOption. Структурный тег group:"..." — собственный тег mihomo; ключи YAML совпадают с тегом.
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя группы. На него ссылаются правила и другие группы. |
type | string | (required) | select | url-test | fallback | load-balance | Тип группы. `relay` был удалён — вместо него используйте `dialer-proxy` на записи прокси. |
proxies | []string | [] | [<proxy or group name>] | Явный список участников. Для членства на основе провайдеров используйте `use:`. |
use | []string | [] | [<proxy-provider name>] | Брать участников из именованных proxy-providers. |
url | string | (required for url-test/fallback) | <URL> | URL проверки доступности — периодический GET по этому URL измеряет задержку участников. Типично: `http://www.gstatic.com/generate_204`. |
interval | int | 300 | <seconds> | Интервал между проверками доступности, в секундах. |
timeout | int | 5000 | <milliseconds> | Тайм-аут проверки доступности в миллисекундах. |
max-failed-times | int | 5 | <int> | Число подряд неудачных проверок, после которого участник считается недоступным. |
empty-fallback | string | (unset) | <proxy name> | Прокси, на который переключиться, когда в группе не осталось пригодных участников (например, всех убрал `filter`). |
lazy | bool | true | true | false | При true проверки доступности выполняются, только когда группа реально используется. Экономит трафик на резервных группах. |
disable-udp | bool | false | true | false | Отклонять UDP-трафик на этой группе. Полезно, когда не все участники поддерживают UDP. |
filter | string | (unset) | <regex> | <regex>`<regex>... | Regex-фильтр по именам участников. Несколько регулярных выражений можно разделять обратными кавычками. |
exclude-filter | string | (unset) | <regex> | Regex-фильтр — исключить участников, чьё имя совпадает. |
exclude-type | string | (unset) | <proxy type> | Исключить участников определённых типов (например, `direct,ss`). |
expected-status | string | * | <HTTP status range> | Допустимые коды состояния проверки доступности. `2xx` или `200-204,301`. |
include-all | bool | false | true | false | Автоматически включить все прокси и все провайдеры — избавляет от ручного перечисления. |
include-all-proxies | bool | false | true | false | Автоматически включить все записи прокси (но не провайдеры). |
include-all-providers | bool | false | true | false | Автоматически включить все proxy-providers (но не отдельные прокси). |
hidden | bool | false | true | false | Скрыть группу из интерфейса панели управления. |
icon | string | (unset) | <URL> | URL иконки, отображаемой совместимыми панелями. |
Исходный код: adapter/outboundgroup/parser.go:25-46 · зафиксировано на v1.19.29 (e26714a)
Каждый тип группы дополнительно декодирует из той же YAML-записи свою небольшую структуру параметров: SelectorOption, URLTestOption, FallbackOption (сейчас пустая) и LoadBalanceOption. Специфичные для типа ключи перечислены в разделах ниже.
type: select
Ручной выбор. Группа сообщает текущий выбор в Clash API (панели позволяют пользователям переключаться). Проверок доступности нет — выбранный участник используется как есть.
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).
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 сейчас пуста — у типа нет ключей сверх общего набора.
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 | Первое соединение клиента выбирает участника; последующие соединения того же клиента переиспользуют его. |
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:
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`🇯🇵'` совпадает с любым прокси, в имени которого есть любая из трёх строк.
Примеры
Типичная многоуровневая схема:
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 реализует ту же идею как типы исходящих, а не как отдельное понятие «группа»:
{
"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>] | Исходящие-участники. |
default | string | (first in outbounds) | <outbound tag> | Начальный выбор при запуске. |
interrupt_exist_connections | bool | false | true | false | При смене выбора закрывать активные соединения, шедшие через прежнего участника. |
Исходный код: option/group.go:5-9 · зафиксировано на v1.13.15 (3708fa1)
URLTest:
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
outbounds | []string | (required) | [<outbound tag>] | Исходящие-участники. |
url | string | https://www.gstatic.com/generate_204 | <URL> | URL проверки доступности. |
interval | badoption.Duration | 3m | <duration> | Как часто перепроверять участников. |
tolerance | uint16 | 50 | <milliseconds> | Переключаться на нового участника, только если он быстрее более чем на указанное число миллисекунд. Предотвращает метания, когда задержки двух участников близки. |
idle_timeout | badoption.Duration | 30m | <duration> | Прекратить проверки доступности после такого времени простоя — возобновить при следующем обращении. |
interrupt_exist_connections | bool | false | true | 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 нет — балансировщики маршрутизируют автоматически согласно стратегии.
