當你完成 Clash 的基礎設定後,很快就會遇到這樣的需求:國內網站直連、境外網站走代理、公司內網不走代理、遊戲流量單獨處理、順便把廣告擋掉。這些都不是「開代理」能解決的,而是 Clash 規則引擎的核心能力。本文從規則語法講起,帶你一步步建構屬於自己的分流策略。

規則引擎是如何工作的

Clash 處理每一個網路請求時,會依順序逐條比對 rules 清單中的規則。一旦某條規則命中,就立即執行對應的動作(走某個代理群組、直連或拒絕),不再繼續往下比對。因此規則的排列順序至關重要——越具體的規則應該放在越前面,越寬泛的規則放在越後面。

典型的規則清單結構如下:

rules:
  - DOMAIN-SUFFIX,company.internal,DIRECT
  - DOMAIN-SUFFIX,google.com,Proxy
  - GEOIP,CN,DIRECT
  - MATCH,Proxy

最後一條 MATCH 是兜底規則,必須放在清單末尾,否則後面的規則永遠不會被執行。

Clash Meta / Mihomo 核心支援更多規則類型(如 GEOSITEPROCESS-NAMERULE-SET),功能比原版 Clash 更強大。本文範例均基於 Mihomo 核心語法。

常用規則類型詳解

網域類規則

DOMAIN 精確比對完整網域,DOMAIN-SUFFIX 比對網域及其所有子網域,DOMAIN-KEYWORD 比對網域中包含指定關鍵字的請求。三者從精確到模糊,使用場景不同:

日常設定中,DOMAIN-SUFFIX 用得最多,既能覆蓋子網域又不會誤比對無關網域。只有在需要精確控制時才用 DOMAIN

IP 類規則

IP-CIDRIP-CIDR6 依 IP 位址段比對,常用於內網直連或封鎖特定 IP 段。例如:

- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve

這三條是 RFC 1918 定義的私有位址段,幾乎所有訂閱設定都會包含,確保區域網路裝置互訪不走代理。no-resolve 表示不為此規則觸發 DNS 解析,避免循環查詢。

地理位置規則

GEOIP 根據 IP 歸屬地比對,GEOSITE 根據網域分類資料庫比對。這是實現「國內直連、國外代理」最簡潔的方式:

- GEOSITE,cn,DIRECT
- GEOSITE,google,Proxy
- GEOIP,CN,DIRECT
- GEOIP,LAN,DIRECT

GEOSITE 基於網域分類,比 GEOIP 更準確——例如一個部署在境外的 CDN 節點,GEOIP 可能誤判為境外,而 GEOSITE,cn 能正確識別為國內服務。

程序與連接埠規則

PROCESS-NAME 依發起請求的程式名比對,適合讓特定軟體走指定線路:

- PROCESS-NAME,Telegram.exe,Proxy
- PROCESS-NAME,WeChat.exe,DIRECT
- PROCESS-NAME,steam.exe,Game

DST-PORTSRC-PORT 依目標或來源連接埠比對,較少單獨使用,但在精細控制遊戲 UDP 流量時很有用。

代理群組:規則的目標

規則右側的第三個參數是代理群組名稱或動作。除了 DIRECT(直連)、REJECT(拒絕)和 REJECT-DROP(靜默丟棄)之外,其餘都是你自訂的代理群組。

常見的代理群組類型:

一個實用的多群組策略範例:

proxy-groups:
  - name: Proxy
    type: select
    proxies: [Auto, HK, JP, US, DIRECT]
  - name: Auto
    type: url-test
    proxies: [HK, JP, US]
    url: http://www.gstatic.com/generate_204
    interval: 300
  - name: AdBlock
    type: select
    proxies: [REJECT, DIRECT]

Rule-Provider:訂閱第三方規則集

手動維護幾百條規則不切實際。Rule-Provider 允許你從遠端 URL 訂閱規則集,Clash 會定期拉取更新。設定格式如下:

rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/rules/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
  direct:
    type: http
    behavior: domain
    url: "https://example.com/rules/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400

rules:
  - RULE-SET,reject,AdBlock
  - RULE-SET,direct,DIRECT
  - GEOSITE,cn,DIRECT
  - MATCH,Proxy

behavior 可選 domainipcidrclassicaldomainipcidr 是最佳化過的二進位格式,比對速度更快;classical 相容完整 Clash 規則語法,靈活性最高。

使用第三方 Rule-Provider 時,請確認來源可信。惡意規則集可能將正常網域指向 REJECT 導致服務無法使用,或指向惡意節點竊取流量。

廣告攔截實戰

Clash 的廣告攔截原理很簡單:將廣告網域比對到 REJECTREJECT-DROP,請求在本機被丟棄,廣告內容永遠不會載入。相比瀏覽器擴充功能,Clash 在系統層面攔截,能覆蓋所有 App 內的廣告請求。

推薦的廣告攔截規則排列順序:

  1. 區域網路和內網 IP 直連(避免誤攔本機服務)
  2. 廣告網域規則集 → REJECT
  3. 國內網域 → DIRECT
  4. 國外網域 → Proxy
  5. MATCH 兜底

開啟廣告攔截後,部分網站的「反廣告攔截」偵測可能觸發,頁面會提示你關閉廣告攔截器。這是正常現象,可以在規則中為特定網域加入例外:

- DOMAIN-SUFFIX,anti-adblock-example.com,DIRECT

將例外規則放在廣告規則集之前,這樣會優先命中直連而非被拒絕。

實戰:客製你的分流策略

以下是一個適合大多數使用者的完整規則框架,你可以在此基礎上增減:

rules:
  # 1. 本地與內網
  - GEOIP,LAN,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve

  # 2. 廣告攔截
  - RULE-SET,reject,REJECT

  # 3. 自訂直連(公司、銀行、政務)
  - DOMAIN-SUFFIX,company.com,DIRECT
  - GEOSITE,cn,DIRECT

  # 4. 自訂代理(特定服務走特定節點)
  - DOMAIN-SUFFIX,openai.com,US
  - DOMAIN-SUFFIX,netflix.com,Proxy

  # 5. 國內 IP 直連
  - GEOIP,CN,DIRECT

  # 6. 兜底
  - MATCH,Proxy

在 Clash Verge Rev 等客戶端中,你可以透過「設定 → 規則」介面視覺化編輯,也可以直接修改 YAML 檔案。修改後點選「重新載入設定」即可生效,無需重啟客戶端。

規則除錯:確認流量走向

寫完規則後,如何驗證某條流量確實依預期分流?Clash 提供了連線日誌功能。在 Clash Verge Rev 中開啟「連線」面板,可以即時看到每個請求比對的網域、目標 IP、使用的規則和最終走的代理群組。

除錯技巧:

  1. 先存取目標網站,在連線日誌中找到對應項目
  2. 查看「規則」欄,確認命中了哪條規則——如果不是預期的規則,說明順序需要調整
  3. 如果顯示 MATCH,說明前面所有規則都未命中,需要加入更具體的規則
  4. 修改規則後重新載入設定,重新整理頁面複測

對於批次驗證,可以使用 Clash 的 API 介面查詢規則命中情況。進階使用者還可以透過 LOG-LEVEL 設為 debug,在日誌檔案中看到完整的規則比對過程,但日常使用時建議保持 info 等級,避免日誌檔案膨脹。

規則合併:覆寫 vs 取代

使用訂閱時,你的自訂規則如何與訂閱提供的規則共存?常見有兩種方式:

在 Clash Verge Rev 的「設定 → 覆寫」功能中,可以用 YAML 片段追加規則而無需修改完整設定檔。例如只加入廣告攔截和自訂直連:

prepend-rules:
  - RULE-SET,reject,REJECT
  - DOMAIN-SUFFIX,mycompany.com,DIRECT

這種方式的好處是訂閱更新時不會覆蓋你的自訂規則,是日常維護最推薦的做法。

常見問題排查

規則修改後沒有生效

確認已重新載入設定(不是僅儲存檔案)。部分客戶端有「規則」和「設定」兩個編輯入口,改錯了位置不會生效。檢查 YAML 縮排是否正確——YAML 對縮排極其敏感,少一個空格就會導致整段規則被忽略。

國內網站走了代理

通常是 GEOIP,CN,DIRECT 位置太靠後,被前面的 MATCH,Proxy 搶先比對。將 GEOIP/GEOSITE 規則上移,確保兜底規則在最後。

廣告攔截導致 App 功能異常

某些 App 的統計、推播、更新服務網域與廣告網域在同一規則集裡。為受影響的 App 加入 DOMAIN-SUFFIX 例外,或暫時將廣告規則集從 REJECT 改為 DIRECT 排查具體網域。

總結

Clash 的規則系統是分流代理的靈魂。掌握 DOMAIN-SUFFIXGEOSITEGEOIP 三類核心規則,搭配 Rule-Provider 訂閱維護,就能建立一套穩定、個人化的分流策略。廣告攔截只需將廣告網域指向 REJECT,在規則順序正確的前提下即可實現系統級去廣告。

規則設定沒有「一次到位」——隨著使用場景變化,你會不斷微調。建議從訂閱提供的預設規則出發,每次只加入一兩條自訂規則並測試,比一次性重寫全部規則要穩妥得多。