Skip to content

Маршрутизация — mihomo

Движок маршрутизации mihomo — это список компактных однострочных строк-правил под верхнеуровневым ключом rules:. Каждое правило имеет вид:

<TYPE>,<payload>,<target>[,no-resolve][,src]

Правила вычисляются в порядке объявления; побеждает первое совпавшее. Цель — это имя прокси, имя группы прокси либо одно из встроенных имён DIRECT / REJECT / COMPATIBLE.

Типы правил

mihomo определяет более 30 типов правил. Наиболее употребимые:

Сопоставление по назначению

ТипПолезная нагрузкаПример
DOMAINточный доменDOMAIN,example.com,proxy
DOMAIN-SUFFIXсовпадение по суффиксу (любой поддомен)DOMAIN-SUFFIX,example.com,proxy
DOMAIN-KEYWORDподстрока в любой метке доменаDOMAIN-KEYWORD,google,proxy
DOMAIN-REGEXрегулярное выражение RE2 по полному доменуDOMAIN-REGEX,^([a-z]+)\.cdn\.example$,proxy
DOMAIN-WILDCARDшаблон с *+ совпадает с одной меткой)DOMAIN-WILDCARD,*.example.com,proxy
GEOSITEкатегория из geosite.dat / MaxMindGEOSITE,category-ads,REJECT
GEOIPкатегория из geoip.dat / MaxMindGEOIP,CN,DIRECT
IP-CIDRсовпадение по CIDRIP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-SUFFIXсовпадение по младшим битам IPIP-SUFFIX,::1/128,DIRECT
IP-ASNASN из MaxMindIP-ASN,13335,proxy

Сопоставление по источнику

ТипПолезная нагрузкаПример
SRC-IP-CIDRCIDR источникаSRC-IP-CIDR,192.168.1.0/24,DIRECT
SRC-IP-SUFFIXIP-суффикс источникаSRC-IP-SUFFIX,::1/128,DIRECT
SRC-GEOIPGeoIP-категория источникаSRC-GEOIP,CN,DIRECT
SRC-IP-ASNASN источникаSRC-IP-ASN,4134,DIRECT
SRC-PORTдиапазон портов источникаSRC-PORT,53,DNS
IN-PORTпорт входящего слушателяIN-PORT,8388,DIRECT
IN-USERпользователь аутентификации входящегоIN-USER,alice,proxy
IN-NAMEимя входящего слушателяIN-NAME,vless-in,proxy
IN-TYPEтип входящего слушателяIN-TYPE,SOCKS5,proxy

Сопоставление по соединению

ТипПолезная нагрузкаПример
DST-PORTпорт назначения (один, диапазон, список)DST-PORT,443,proxy
NETWORKtcp или udpNETWORK,udp,proxy-udp
DSCPзначение DSCPDSCP,46,proxy-priority
UIDлокальный ID пользователя (Linux/macOS)UID,1000,proxy

Сопоставление по процессу

ТипПолезная нагрузкаПример
PROCESS-NAMEбазовое имя процессаPROCESS-NAME,curl,proxy
PROCESS-PATHабсолютный путьPROCESS-PATH,/usr/bin/curl,proxy
PROCESS-NAME-REGEX / PROCESS-PATH-REGEXрегулярное выражениеPROCESS-NAME-REGEX,^chrome.*$,proxy
PROCESS-NAME-WILDCARD / PROCESS-PATH-WILDCARDшаблонPROCESS-NAME-WILDCARD,fire*,proxy

Наборы и комбинаторы

ТипПолезная нагрузкаПример
RULE-SETимя набора правил (объявляется в rule-providers)RULE-SET,gfw,proxy
SUB-RULEименованное подправило (объявляется в sub-rules)SUB-RULE,(NETWORK,udp),sub-udp
AND / OR / NOTлогические комбинаторыAND,((DOMAIN-SUFFIX,com),(IP-CIDR,1.0.0.0/8)),proxy
MATCHбезусловное умолчаниеMATCH,proxy

Модификаторы

После цели допускаются два опциональных модификатора через запятую:

  • no-resolve — для правил IP/GEOIP: не разрешать домен назначения в IP ради сопоставления. Ускоряет правило ценой точности.
  • src — для правил IP-суффикса: сопоставлять IP источника вместо IP назначения.

rule-providers

Верхнеуровневый rule-providers: объявляет именованные источники правил, на которые вы ссылаетесь из правил RULE-SET. Два типа доставки и три формата:

yaml
rule-providers:
  geosite-cn:
    type: http
    behavior: domain        # 'domain', 'ipcidr', or 'classical'
    format: mrs             # 'yaml', 'text', or 'mrs' (binary)
    url: https://example.com/geosite-cn.mrs
    interval: 86400         # refresh interval in seconds
    path: ./rule-providers/geosite-cn.mrs
    proxy: DIRECT           # outbound used for the download

  local-block:
    type: file
    behavior: classical
    format: yaml
    path: ./rule-providers/block.yaml

Поведения (behavior):

  • domain — по одному домену на строку. Быстро.
  • ipcidr — по одному CIDR на строку.
  • classical — полные строки правил mihomo (всё, кроме цели). Медленнее, но максимально гибко.

sub-rules

Верхнеуровневый sub-rules: объявляет именованные списки подправил, которые можно вызывать через SUB-RULE. Полезно для вложенной логики правил без её дублирования.

yaml
sub-rules:
  sub-udp:
    - GEOIP,CN,DIRECT
    - MATCH,udp-proxy

rules:
  - SUB-RULE,(NETWORK,udp),sub-udp
  - MATCH,proxy

Примеры

Классическая маршрутизация с обходом CN:

yaml
rules:
  - DOMAIN-SUFFIX,local,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,proxy

Разделение по процессам:

yaml
rules:
  - PROCESS-NAME,curl,DIRECT
  - PROCESS-NAME-WILDCARD,fire*,proxy
  - MATCH,DIRECT

Логические комбинаторы:

yaml
rules:
  - AND,((NETWORK,udp),(DST-PORT,443)),quic-proxy
  - OR,((DOMAIN-SUFFIX,onion),(GEOSITE,private)),tor
  - NOT,((GEOIP,CN)),proxy
  - MATCH,DIRECT

Использование rule-providers через правило RULE-SET:

yaml
rule-providers:
  gfw:
    type: http
    behavior: domain
    format: mrs
    url: https://example.com/gfw.mrs
    interval: 86400
    path: ./providers/gfw.mrs

rules:
  - RULE-SET,gfw,proxy
  - MATCH,DIRECT

Примечания

  • Правила вычисляются по порядку. Ставьте IP-правила с модификатором no-resolve ближе к началу списка, чтобы не делать по одному DNS-запросу на соединение для заведомо локального трафика.
  • Типы правил GEOSITE / GEOIP читают из geoip.dat / Country.mmdb и geosite.dat. Переопределения URL живут в верхнеуровневом блоке geox-url.
  • Синтаксис комбинаторов (AND,(<rule>,<rule>),target) заключает каждое вложенное правило в круглые скобки. Вложенные правила не содержат цели — действует цель внешнего комбинатора.
  • Правила RULE-SET игнорируют модификаторы no-resolve / src на внешнем правиле; вместо этого задавайте эти свойства в самом объявлении поставщика правил.
  • У mihomo нет поля final. Для поведения «поймать всё» используйте MATCH,<target> в конце rules:.

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

  • Xray-core использует структурированные JSON-правила с полями по каждому критерию и полиморфной формой сопоставления. Компактной строковой формы нет. См. Маршрутизация — Xray-core.
  • sing-box тоже использует структурированные правила, но с явными перечислениями action (route / direct / bypass / reject / hijack-dns / sniff / resolve) и отдельным блоком rule_set для именованных списков правил. См. Маршрутизация — sing-box.

Core Tutorial от Argsment