
家庭网络多网关架构那篇文章讲了整体架构,但规则怎么写没有细说。这篇单独讲 mihomo 的分流规则,从语法基础到实用配置模板,逐步拆解。
规则的基本概念
mihomo 的流量分流通过 rules 字段控制,每条规则的格式:
规则类型,匹配值,策略组
比如:
rules:
- DOMAIN-SUFFIX,google.com,代理
- IP-CIDR,192.168.0.0/16,DIRECT
- GEOIP,CN,DIRECT
- MATCH,代理 # 兜底规则,匹配所有剩余流量
规则按顺序匹配,第一条命中即执行,后面的不再判断。 顺序非常重要。
规则类型详解
域名类规则
# 精确匹配域名
- DOMAIN,www.google.com,代理
# 匹配域名及其所有子域名(最常用)
- DOMAIN-SUFFIX,google.com,代理
# 覆盖:google.com / mail.google.com / api.google.com
# 域名关键词(性能较差,少用)
- DOMAIN-KEYWORD,google,代理
# 匹配任何包含 "google" 的域名
# 正则表达式(最灵活,但最慢)
- DOMAIN-REGEX,^.*\.google\.com$,代理
优先级建议: DOMAIN > DOMAIN-SUFFIX > DOMAIN-KEYWORD
越精确的规则放越前面,性能更好,也避免误匹配。
IP 类规则
# IPv4 CIDR
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
# IPv6 CIDR
- IP-CIDR6,::1/128,DIRECT
# 注意:IP-CIDR 会触发 DNS 解析,对纯域名规则之前的流量有性能影响
# 建议加 no-resolve 后缀,跳过 DNS 解析直接匹配连接 IP
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GeoIP 规则
根据 IP 所属国家分流:
# 中国大陆 IP 直连
- GEOIP,CN,DIRECT
# 私有 IP 直连
- GEOIP,PRIVATE,DIRECT,no-resolve
GeoIP 数据库来自 MaxMind,mihomo 会自动更新。精度不是 100%,但对大多数场景足够。
进程规则(仅桌面客户端)
按发起请求的进程名分流:
# 特定应用走代理
- PROCESS-NAME,curl,代理
- PROCESS-NAME,wget,代理
# 开发工具直连
- PROCESS-NAME,node,DIRECT
端口规则
# 特定目标端口
- DST-PORT,80,DIRECT
- DST-PORT,443,代理
# 端口范围
- DST-PORT,3000-3999,DIRECT
兜底规则
# MATCH 必须放在最后,匹配所有未命中规则的流量
- MATCH,代理
规则集(Rule Providers)
手动写每个域名不现实,mihomo 支持引入外部规则集:
rule-providers:
reject:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400 # 每天更新一次
direct:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
gfw:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400
cn-cidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
rules:
- RULE-SET,reject,REJECT # 广告/恶意域名拦截
- RULE-SET,direct,DIRECT # 已知直连域名
- RULE-SET,proxy,代理 # 已知需要代理的域名
- RULE-SET,gfw,代理 # GFW 屏蔽域名
- RULE-SET,cn-cidr,DIRECT # 国内 IP 段
- GEOIP,CN,DIRECT
- MATCH,代理
Loyalsoldier/clash-rules 是目前维护最好的规则集,覆盖全面,定期更新。
完整配置模板
以下是我实际使用的配置结构,适合多节点 + 精细分流场景:
# ── 代理节点 ──
proxies:
- name: "DMIT-HK-Reality"
type: vless
server: 43.x.x.x
port: 443
uuid: 你的UUID
flow: xtls-rprx-vision
reality-opts:
public-key: 你的公钥
servername: www.apple.com
client-fingerprint: chrome
tls: true
- name: "DMIT-HK-Hysteria2"
type: hysteria2
server: 43.x.x.x
port: 443
password: 你的密码
sni: bing.com
skip-cert-verify: true
- name: "DMIT-US"
type: vless
# ... 美国节点配置
# ── 策略组 ──
proxy-groups:
# 主用香港节点(自动选速度最快的)
- name: "香港"
type: url-test
url: http://www.gstatic.com/generate_204
interval: 60
tolerance: 50
proxies:
- DMIT-HK-Reality
- DMIT-HK-Hysteria2
# 备用美国
- name: "美国"
type: url-test
interval: 60
proxies:
- DMIT-US
# 自动故障切换
- name: "代理"
type: fallback
url: http://www.gstatic.com/generate_204
interval: 30
proxies:
- 香港
- 美国
# 手动选择(用于特殊场景)
- name: "手动"
type: select
proxies:
- DMIT-HK-Reality
- DMIT-HK-Hysteria2
- DMIT-US
- DIRECT
# 流媒体专用(用原生 IP 解锁)
- name: "流媒体"
type: select
proxies:
- DMIT-HK-Reality
- DMIT-US
# AI 工具(需要特定地区 IP)
- name: "AI工具"
type: select
proxies:
- DMIT-US
- DMIT-HK-Reality
# ── 规则集引入 ──
rule-providers:
reject:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
cn-cidr:
type: http
behavior: ipcidr
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
# ── 分流规则 ──
rules:
# 广告拦截
- RULE-SET,reject,REJECT
# 私有 IP 直连
- GEOIP,PRIVATE,DIRECT,no-resolve
# AI 工具走美国节点
- DOMAIN-SUFFIX,openai.com,AI工具
- DOMAIN-SUFFIX,anthropic.com,AI工具
- DOMAIN-SUFFIX,claude.ai,AI工具
- DOMAIN-KEYWORD,openai,AI工具
# 流媒体
- DOMAIN-SUFFIX,netflix.com,流媒体
- DOMAIN-SUFFIX,nflxvideo.net,流媒体
- DOMAIN-SUFFIX,spotify.com,流媒体
- DOMAIN-SUFFIX,disneyplus.com,流媒体
# 国内直连规则集
- RULE-SET,direct,DIRECT
# 代理规则集
- RULE-SET,proxy,代理
# 国内 IP 直连
- RULE-SET,cn-cidr,DIRECT,no-resolve
- GEOIP,CN,DIRECT
# 兜底走代理
- MATCH,代理
DNS 配置(防止 DNS 泄露)
规则配了但 DNS 没配好,会导致真实 IP 泄露或者规则不生效:
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip # 或 redir-host,fake-ip 更推荐
fake-ip-range: 198.18.0.0/15
fake-ip-filter: # 这些域名不走 fake-ip
- '*.lan'
- localhost.ptlogin2.qq.com
nameserver:
- 223.5.5.5 # 阿里(国内查询)
- 119.29.29.29 # 腾讯
fallback: # 国外域名走这里
- https://1.1.1.1/dns-over-https
- https://8.8.8.8/dns-over-https
fallback-filter:
geoip: true
geoip-code: CN
ipcidr:
- 240.0.0.0/4
调试技巧
查看规则命中情况
mihomo 提供 REST API,可以查看流量被哪条规则命中:
# 查看连接列表(包含匹配的规则)
curl http://127.0.0.1:9090/connections
在 Yacd / MetaCubeX 等 Dashboard 里更直观,可以实时看到每条连接走的是哪个节点、命中了哪条规则。
测试特定域名的走向
# 用 mihomo 的 HTTP 代理测试
curl -x http://127.0.0.1:7890 https://www.google.com -I
curl -x http://127.0.0.1:7890 https://www.baidu.com -I
延伸阅读:
📷 封面图 · Flux Schnell AI 生成 · panshi.io 品牌风格