Skip to content

路由 — mihomo

mihomo 的路由引擎是顶层 rules: 键下的紧凑一行式 规则字符串 列表。每条规则形如:

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

规则按声明顺序求值;命中第一条即停。target 可以是代理名、代理组名, 或内置 DIRECT / REJECT / COMPATIBLE 之一。

规则类型

mihomo 定义 30+ 种规则类型。最常用的:

目的地匹配

类型载荷示例
DOMAIN精确域名DOMAIN,example.com,proxy
DOMAIN-SUFFIX后缀匹配(任意子域)DOMAIN-SUFFIX,example.com,proxy
DOMAIN-KEYWORD任意 label 中包含子串DOMAIN-KEYWORD,google,proxy
DOMAIN-REGEX对完整域名应用 RE2 正则DOMAIN-REGEX,^([a-z]+)\.cdn\.example$,proxy
DOMAIN-WILDCARD* 的 glob(+ 匹配一个 label)DOMAIN-WILDCARD,*.example.com,proxy
GEOSITEgeosite.dat / MaxMind 类目GEOSITE,category-ads,REJECT
GEOIPgeoip.dat / MaxMind 类目GEOIP,CN,DIRECT
IP-CIDRCIDR 匹配IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-SUFFIX按 IP 尾部比特匹配IP-SUFFIX,::1/128,DIRECT
IP-ASNMaxMind 中的 ASNIP-ASN,13335,proxy

来源匹配

类型载荷示例
SRC-IP-CIDR来源 CIDRSRC-IP-CIDR,192.168.1.0/24,DIRECT
SRC-IP-SUFFIX来源 IP-suffixSRC-IP-SUFFIX,::1/128,DIRECT
SRC-GEOIP来源 GeoIP 类目SRC-GEOIP,CN,DIRECT
SRC-IP-ASN来源 ASNSRC-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
NETWORKtcpudpNETWORK,udp,proxy-udp
DSCPDSCP 值DSCP,46,proxy-priority
UID本地用户 ID(Linux / macOS)UID,1000,proxy

进程匹配

类型载荷示例
PROCESS-NAME进程 basenamePROCESS-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-WILDCARDglobPROCESS-NAME-WILDCARD,fire*,proxy

集合与组合类型

类型载荷示例
RULE-SETrule-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

修饰符

target 之后可选两个逗号分隔的修饰符:

  • no-resolve —— 对 IP / GEOIP 规则,不为匹配解析目的域名。规则更 快,但牺牲精度。
  • src —— 对 IP-suffix 规则,匹配源 IP 而非目的 IP。

rule-providers

顶层 rule-providers: 声明命名的规则源,可被 RULE-SET 规则引用。 两种传输类型与三种格式:

yaml
rule-providers:
  geosite-cn:
    type: http
    behavior: domain        # 'domain'、'ipcidr' 或 'classical'
    format: mrs             # 'yaml'、'text' 或 'mrs'(二进制)
    url: https://example.com/geosite-cn.mrs
    interval: 86400         # 刷新间隔,秒
    path: ./rule-providers/geosite-cn.mrs
    proxy: DIRECT           # 下载使用的出站

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

behavior:

  • domain —— 载荷为每行一个域名。最快。
  • ipcidr —— 载荷为每行一个 CIDR。
  • classical —— 载荷为完整 mihomo 规则字符串(除 target 外的部分)。 最慢但最灵活。

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-SET 使用 rule-providers:

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

说明

  • 规则按顺序求值。把 no-resolve 修饰符尽早放在 IP 规则上,避免 显然内网的流量每条连接都触发一次 DNS 查询。
  • GEOSITE / GEOIP 规则从 geoip.dat / Country.mmdbgeosite.dat 读取。URL 覆盖位于顶层 geox-url 块。
  • 组合语法(AND,(<rule>,<rule>),target)每个嵌套规则用括号包裹。 嵌套规则省略 target —— 外层组合的 target 生效。
  • RULE-SET 规则会忽略外层规则上的 no-resolve / src 修饰符; 请把这些属性设在 rule-provider 声明本身上。
  • mihomo 没有 final 字段。请在 rules: 末尾放一条 MATCH,<target> 作为兜底。

跨内核说明

  • Xray-core 使用按字段的结构化 JSON 规则与多态匹配形态。没有 紧凑字符串形式。参见 Routing — Xray-core
  • sing-box 同样使用结构化规则,但带显式 action 枚举 (route / direct / bypass / reject / hijack-dns / sniff / resolve), 并有独立的 rule_set 块承接命名规则列表。参见 Routing — sing-box

由 Argsment 出品的 Core Tutorial