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