a colorful toy on a table

家庭網路多閘道器架構那篇文章講了整體架構,但規則怎麼寫沒有細說。這篇單獨講 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 品牌風格