rule 模式如何決定連線的出口
Clash 的 rule 模式會由上而下檢查 rules 清單,第一條匹配成功的規則會立即生效,後續規則不再參與判斷。規則左側是匹配類型,中間是匹配內容,右側是策略名稱。策略可以是 DIRECT、REJECT,也可以是設定中已存在的代理群組,例如 PROXY、Auto 或 境外節點。
一次請求可用於匹配的資訊通常包括目標網域、目標 IP、目標連接埠、網路類型與程序資訊。不同入站方式取得的資訊不完全相同:系統代理處理 HTTP 或 SOCKS 連線時,網域通常相當明確;TUN 模式接管系統流量後,是否保留網域還會受到 DNS 模式、網域嗅探與應用程式連線方式影響。因此,同一組規則在系統代理與 TUN 下可能出現不同的命中記錄。
四種基本結果
| 規則結果 | 連線行為 | 常見用途 |
|---|---|---|
DIRECT |
由目前裝置直接連線至目標 | 中國大陸網站、區域網路裝置、可信任的下載來源 |
REJECT |
拒絕連線,不再交由後續規則處理 | 廣告網域、追蹤請求、已知干擾位址 |
| 代理群組名稱 | 交由選定節點或自動測速群組處理 | 境外網站、開發服務、串流媒體 |
MATCH |
接收前面尚未匹配的剩餘連線 | 規則清單最後的兜底規則 |
DOMAIN-SUFFIX、GEOIP、RULE-SET 與 MATCH 的寫法
DOMAIN-SUFFIX:依網域後綴處理
DOMAIN-SUFFIX,example.com,PROXY 會匹配 example.com 本身及其子網域,例如 www.example.com 和 api.example.com。與其逐一撰寫完整網域,這種方式更適合處理同一服務下的多個子網域,也是手動規則中使用頻率較高的類型。
rules:
- DOMAIN,router.local,DIRECT
- DOMAIN-SUFFIX,gov.cn,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-SUFFIX,example.com,PROXY
DOMAIN 只匹配一個完整網域,不會自動包含子網域。DOMAIN-KEYWORD 只要網域中出現指定字串就會命中,涵蓋範圍較廣,也更容易誤傷。需要精確放行登入網域或更新網域時,優先使用 DOMAIN;需要涵蓋整個網站時,使用 DOMAIN-SUFFIX。
GEOIP:依目標 IP 的歸屬地區處理
GEOIP,CN,DIRECT 會使用客戶端載入的 IP 地理資料庫,判斷目標位址是否屬於中國大陸。它適合處理沒有網域、直接連線 IP,或未被網域規則涵蓋的中國大陸請求。GEOIP 判斷依賴本機資料庫,資料庫過舊時,新分配的網段可能會被誤分到兜底策略。
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.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
- GEOIP,CN,DIRECT
- MATCH,PROXY
no-resolve 表示該 IP 規則不主動將網域解析為 IP。區域網路 CIDR 規則只需檢查已取得的目標位址,加上此參數可以減少額外的 DNS 查詢。不要機械式地為所有 GEOIP 規則加上 no-resolve,否則只有網域、尚未取得目標 IP 的請求可能會略過地區判斷。
RULE-SET:將大量規則拆分為獨立檔案
當廣告規則、中國大陸網域規則達到數百或數千條時,全部塞進主設定會降低可讀性。rule-providers 用於定義規則檔案,RULE-SET 則在主規則清單中呼叫它。Clash Meta,也就是 mihomo,支援 domain、ipcidr 與 classical 等行為類型;不同類型對應不同的載荷格式。
rule-providers:
allow:
type: file
behavior: domain
path: ./ruleset/allow.yaml
ads:
type: file
behavior: classical
path: ./ruleset/ads.yaml
direct-domain:
type: file
behavior: domain
path: ./ruleset/direct-domain.yaml
rules:
- RULE-SET,allow,DIRECT
- RULE-SET,ads,REJECT
- RULE-SET,direct-domain,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
behavior: domain 的檔案只存放網域載荷,適合中國大陸網域或放行清單。behavior: classical 可以存放包含類型的完整規則,例如 DOMAIN-SUFFIX、DOMAIN-KEYWORD 和 IP-CIDR。本機檔案方便先檢查內容再啟用;需要自動更新時,可改用 type: http,同時設定規則位址、儲存路徑與更新間隔。
MATCH:必須放在最後
MATCH,PROXY 不檢查網域或 IP,會匹配所有尚未命中的連線。只要 MATCH 出現在中間,下面的規則就永遠沒有執行機會。常見目標是「中國大陸直連,其餘代理」,因此先放例外放行、廣告拒絕、區域網路直連、中國大陸網域與 GEOIP,最後再用 MATCH 交給代理群組。
中國大陸直連、境外代理與廣告攔截的設定範本
以下範本適合合併至既有訂閱設定。假設訂閱中已存在名為 PROXY 的策略群組;如果客戶端顯示的群組名稱是「節點選擇」或「代理」,就需要將規則末尾的 PROXY 改成實際名稱。策略名稱區分大小寫,空格與中文字元也必須完全一致。
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false
profile:
store-selected: true
rule-providers:
allow:
type: file
behavior: domain
path: ./ruleset/allow.yaml
ads:
type: file
behavior: classical
path: ./ruleset/ads.yaml
direct-domain:
type: file
behavior: domain
path: ./ruleset/direct-domain.yaml
rules:
- RULE-SET,allow,DIRECT
- RULE-SET,ads,REJECT
- DOMAIN,localhost,DIRECT
- DOMAIN-SUFFIX,local,DIRECT
- DOMAIN-SUFFIX,lan,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,10.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
- IP-CIDR,169.254.0.0/16,DIRECT,no-resolve
- RULE-SET,direct-domain,DIRECT
- DOMAIN-SUFFIX,gov.cn,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
mixed-port: 7890 會在同一個連接埠接收 HTTP 與 SOCKS5 連線,適合桌面客戶端將系統代理統一指向 127.0.0.1:7890。allow-lan: false 表示目前範例不向區域網路開放代理連接埠。如果確實需要讓電視、手機或遊戲主機連線至這台電腦,還要另外設定監聽位址與防火牆規則,不能只修改規則清單。
三個本機規則檔案
allow.yaml 用於覆蓋廣告清單中的誤攔截項目。由於它位於廣告規則之前,相同網域會先被放行。domain 行為的載荷可以寫成以下形式:
payload:
- 'login.example.net'
- '+.account.example.net'
ads.yaml 使用 classical 行為,每個項目都包含完整規則類型。廣告清單應盡量使用精確網域與後綴,謹慎使用涵蓋範圍過大的關鍵字:
payload:
- DOMAIN,ads.example.net
- DOMAIN-SUFFIX,tracking.example.net
- DOMAIN-KEYWORD,telemetry-example
direct-domain.yaml 使用 domain 行為,儲存需要直連的中國大陸服務後綴:
payload:
- '+.gov.cn'
- '+.edu.cn'
- '+.example.cn'
匹配順序:放行、攔截、直連與兜底
規則順序不只是整理方式,也會改變最終出口。建議順序是:精確放行清單、廣告拒絕、區域網路位址、中國大陸網域、中國大陸 IP、專用服務策略,最後是 MATCH。將放行清單排在廣告清單之前,可以處理登入介面、驗證碼與付款頁面遭第三方規則誤攔截的情況。
- 精確放行:處理必須直連且不能被廣告規則攔截的網域。
- 廣告拒絕:對明確的廣告與追蹤網域回傳拒絕結果。
- 區域網路直連:確保路由器、NAS、印表機與本機開發服務不進入代理。
- 中國大陸網域直連:優先依據網域規則分流,減少不必要的 IP 判斷。
- 中國大陸 IP 直連:處理直接存取 IP 或未被網域規則涵蓋的連線。
- 境外服務分組:串流媒體、程式碼託管等有獨立策略需求時,放在 MATCH 之前。
- MATCH 兜底:將其餘連線交給預設代理群組。
為什麼不能先寫 GEOIP 再寫廣告規則
廣告網域可能會解析到中國大陸 IP。如果 GEOIP,CN,DIRECT 位於廣告規則之前,請求會先依 IP 判定為直連,後面的 RULE-SET,ads,REJECT 就沒有機會執行。將廣告網域規則放在 GEOIP 前面,才能優先依據網域拒絕請求。
為什麼不建議只使用 DOMAIN-SUFFIX,cn
DOMAIN-SUFFIX,cn,DIRECT 能涵蓋大量以 .cn 結尾的網站,但中國大陸服務也可能使用 .com、.net 或雲端服務網域;境外服務也可能使用中國網域提供部分介面。更穩妥的做法是讓維護過的中國大陸網域規則集負責主要判斷,再以 .cn 與 GEOIP,CN 補足遺漏。
訂閱更新時如何保留自訂規則
直接編輯訂閱產生的 YAML 檔案,下一次更新通常會覆蓋修改內容。若桌面客戶端提供「全域擴充設定」「覆寫」「Merge」或「腳本」功能,應將自訂 rule-providers 與規則插入邏輯放在覆寫層。選單名稱因客戶端而異,常見入口是「訂閱」→「編輯」→「覆寫設定」,或「設定」→「設定檔」→「全域擴充」。
合併時要先確認客戶端採用追加還是替換。如果 rules 只是被追加到訂閱規則末尾,而原設定已存在 MATCH,新規則仍然不會命中。正確做法應是將自訂規則插入原有 MATCH 之前,或明確替換整段 rules。
原始 Clash 與 mihomo 的相容性界線
基本的 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、IP-CIDR、GEOIP、RULE-SET 與 MATCH 在常見 Clash 設定中都有廣泛支援。mihomo 還提供 GEOSITE、複合邏輯規則、規則集二進位格式與更完整的程序匹配能力。設定需要在不同核心之間共用時,先保留基礎語法,再依客戶端能力加入擴充欄位。
TUN、DNS 與規則命中的關係
TUN 模式接管的不只是瀏覽器流量,還包括不遵循系統代理的應用程式、部分命令列工具與 UDP 連線。此時客戶端需要從網路封包、DNS 對應或嗅探結果中還原目標網域。若只能看到目標 IP,DOMAIN-SUFFIX 與 domain 類型的 RULE-SET 就無法參與,連線會繼續落到 IP-CIDR、GEOIP 或 MATCH。
fake-ip 模式
mihomo 常見的 fake-ip DNS 模式會為網域回傳保留位址,並在核心中儲存「虛擬 IP—原網域」的對應。應用程式連線至這個虛擬位址時,核心仍能取回網域並執行網域規則。遇到區域網路裝置探索、企業內網或依賴真實 DNS 回應的程式時,可以將相關網域加入 fake-ip 過濾清單,而不是切換整個 DNS 模式。
redir-host 模式
redir-host 會回傳真實解析結果,再依網域或 IP 執行分流。它對部分區域網路與特殊應用程式更直觀,但 DNS 查詢路徑與實際連線路徑必須保持一致,否則可能出現解析結果在中國大陸、連線卻進入境外代理的情況。排查時要同時觀察 DNS 記錄與連線記錄,不要只看節點測速結果。
建議的測試流程
- 在客戶端的「記錄」頁面將等級暫時調整為 Info,重新造訪目標網站。
- 查看連線記錄中的 Host、Destination IP、Rule 與 Chain 欄位。
- 確認廣告網域命中
RULE-SET,ads,結果為REJECT。 - 確認區域網路位址命中
IP-CIDR,結果為DIRECT。 - 確認中國大陸網站命中 direct-domain 或
GEOIP,CN。 - 確認未分類的境外網站最終命中 MATCH,並進入預期的代理群組。
測試時每次只修改一個條件。調整規則後執行「設定」→「重新載入」,並關閉舊連線後重新發起請求。瀏覽器的長連線、HTTP/2 工作階段與應用程式連線池可能繼續沿用修改前的出口,只重新整理頁面不一定會觸發新規則。
常見故障與定位方法
設定可以載入,但所有流量都經過代理
先檢查模式是否仍為 Rule,再查看規則清單最前面是否出現 MATCH 或涵蓋範圍過大的代理規則。若中國大陸網域規則使用 RULE-SET,確認規則提供器的項目數不為 0,並檢查本機 path 是否以設定檔所在目錄為基準正確解析。
啟用廣告規則後,登入或付款頁面無法開啟
在連線記錄中找出被 REJECT 的具體網域,將必要網域加入 allow 規則集,並確保 RULE-SET,allow,DIRECT 位於廣告規則之前。不要直接停用整份廣告清單,也不要使用過寬的頂級網域放行;優先新增登入介面的完整網域或最小可用後綴。
中國大陸網站命中 MATCH
查看連線記錄是否保留 Host。有網域但未命中時,通常是中國大陸網域規則缺少該項目;只有目標 IP 時,則檢查 GEOIP 資料庫與 DNS 設定。還要確認規則使用的策略名稱確實存在,部分客戶端遇到無效策略時會拒絕載入整份設定。
修改 YAML 後提示解析失敗
YAML 使用空格縮排,不能使用定位字元。rules 與 rule-providers 必須位於正確層級,清單項目前需要短橫線。包含冒號、井字號或特殊字元的網域載荷可以用單引號包裹。錯誤提示提供行號時,還要檢查上一行是否漏寫冒號,因為實際錯誤位置經常落在下一行。
延遲測試正常,但網頁仍然無法開啟
延遲測試只驗證測試位址經由某個代理群組的連線結果,不代表目標網頁命中了相同策略。開啟連線頁面核對實際 Rule 與 Chain;如果請求被 DIRECT、REJECT 或其他專用群組提前接手,應調整規則順序,而不是反覆切換測速節點。