分流規則入門:DOMAIN、GEOIP、RULE-SET 全解析
本文目錄
分流規則決定每一條連線的命運:直連、走代理,還是直接拒絕。訂閱通常已經附了一整套規則,但只要你想讓某個網站固定直連、某個服務固定走特定地區,就得自己動手改 rules。
規則的語法其實只有一個模式:規則類型,比對內容,出口[,附加參數]。難的不是語法,而是搞清楚哪一條會先被比對到、為什麼你加的那條看起來沒生效。這篇把比對邏輯、常用類型與偵錯方式一次講完。
規則怎麼生效:由上而下,命中即停
核心拿到一條新連線後,會從 rules 的第一行開始往下比對,只要命中就立刻採用該行指定的出口,後面的規則完全不再看。這帶來兩個實務結論:
- 順序就是優先級。自己新增的規則要放在整份清單靠前的位置,塞在最下面很可能被前面的廣域規則先攔走。
- 最後一行一定要有
MATCH。它是兜底規則,比對前面都沒命中的所有流量。少了它,未命中的連線會沒有明確去向。
出口可以寫代理群組名稱、DIRECT(直連)或 REJECT(拒絕,常用來擋廣告網域)。群組名稱必須和 proxy-groups 裡定義的完全一致,差一個字核心就會報找不到,群組類型的差異見代理群組完整解析。
網域類規則:三個兄弟差在哪
| 規則類型 | 比對方式 | 範例 | 會命中什麼 |
|---|---|---|---|
DOMAIN | 完全相同 | DOMAIN,www.example.com,DIRECT | 只有這個網域本身 |
DOMAIN-SUFFIX | 結尾相符 | DOMAIN-SUFFIX,example.com,PROXY | 該網域及其所有子網域 |
DOMAIN-KEYWORD | 包含關鍵字 | DOMAIN-KEYWORD,analytics,REJECT | 網域中任何位置含該字串者 |
九成情況用 DOMAIN-SUFFIX 就對了,它涵蓋整個網域家族又不會誤傷。DOMAIN-KEYWORD 威力大但也最容易誤判,例如用一個太常見的字串當關鍵字,會連帶把不相干的網站一起攔下來,加之前想一下涵蓋範圍。
IP 類規則與 no-resolve 的意義
IP-CIDR 比對目標 IP 是否落在某個網段,常用來讓區域網路與本機位址直連;GEOIP 則依內建資料庫判斷目標 IP 屬於哪個國家或地區:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,TW,DIRECT
關鍵在 no-resolve。IP 類規則需要知道目標 IP,但很多連線一開始只有網域名稱;若不加這個參數,核心為了比對就得先做一次 DNS 解析,等於把解析提前,既拖慢速度也可能造成非預期的解析行為。加上 no-resolve 表示「還不知道 IP 就跳過這條」,讓後面的網域規則有機會先接手。習慣上,放在規則清單前段的 IP 規則都會加上它。
RULE-SET 與 rule-providers:外部規則集
規則多到上千條時,全部塞進設定檔並不實際。rule-providers 讓你把規則集放在外部檔案或網址,設定檔裡只留一行引用,還能定期自動更新:
rule-providers:
my-direct:
type: http
behavior: domain
format: yaml
url: "https://example.com/rules/direct.yaml"
path: ./ruleset/my-direct.yaml
interval: 86400
rules:
- RULE-SET,my-direct,DIRECT
- MATCH,PROXY
behavior 要和規則集內容相符,常見為 domain(純網域清單)、ipcidr(IP 網段)與 classical(可混寫多種規則類型);interval 是更新間隔(秒),86400 就是一天一次;path 是本機快取路徑。type 若改成 file,則直接讀本機檔案,不對外更新。範例中的網址請換成你實際使用的規則集來源。
一段完整的 rules 結構長這樣
rules:
- DOMAIN-SUFFIX,local,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- DOMAIN-KEYWORD,ads-tracking,REJECT
- DOMAIN-SUFFIX,gov.tw,DIRECT
- DOMAIN-SUFFIX,example-media.com,串流影音
- RULE-SET,my-direct,DIRECT
- GEOIP,TW,DIRECT
- MATCH,PROXY
順序的安排是有意的:先處理本機與區域網路,再擋掉不想要的流量,接著是明確指定的網域,然後才是大範圍的規則集與地區判斷,最後用 MATCH 收尾把其餘流量交給代理群組。自己新增規則時,插在對應區塊的開頭最保險。
注意:GEOIP 這類廣域規則要放在具體網域規則之後。放太前面的話,凡是解析到本地 IP 的服務都會被判為直連,你後面針對特定網域寫的規則就永遠輪不到。
怎麼確認規則到底有沒有命中
改完規則不要憑感覺判斷,客戶端提供兩個現成的觀察窗口:
- 連線面板:列出目前每一條連線的目標網域、命中的規則與實際使用的節點。想知道某個網站走了哪條路,開著面板再重新整理該網頁,一看就明白。
- 日誌頁面:把
log-level調成debug,可以看到更詳細的比對與解析過程,排查完記得調回info,否則日誌會非常吵。
如果連線面板顯示的出口跟你預期不同,八成是前面某條規則先命中了;若是網頁根本連不上、面板卻看不到對應連線,問題通常出在解析階段而不是規則,這時候該檢查的是 DNS,做法見 mihomo DNS 設定詳解。想再確認整份設定檔的結構有沒有寫壞,回頭用 mihomo -t 檢查一次,細節見設定檔入門。