Clash 規則分流實戰:台灣本地直連、境外走代理的配置寫法與優先級排查

以真實 rules 段為例講解 DOMAIN-SUFFIX、GEOIP、MATCH 的匹配順序,示範分流的最小可用規則集,並解釋規則不生效時的常見排查路徑。

為什麼要做分流

不做分流的配置只有兩種極端:全域代理或全域直連。全域代理會讓台灣本地站點(銀行、政府機構、部分影音站)存取變慢,甚至觸發風控;全域直連則等於沒開代理。規則分流的作用是讓 Clash 在每一次連線發起時判斷目標網域或 IP 屬於哪一類,再決定走直連、走代理還是直接拒絕。這個判斷過程完全由 rules 段驅動,規則寫得越合理,體驗越接近「該走的走,該直連的直連」。

Clash 核心(以及目前活躍維護的 Clash Meta / mihomo 核心)在處理規則時是逐條從上到下匹配的,命中第一條就立即執行對應策略,後面的規則不再參與判斷。這意味著規則順序本身就是邏輯,寫反順序會讓後面精細的規則形同虛設。

匹配順序:DOMAIN-SUFFIX、GEOIP、MATCH 各管什麼

一份典型的 rules 段會混用多種匹配類型,常見的幾種及其含義:

  • DOMAIN-SUFFIX:按網域後綴匹配,例如 DOMAIN-SUFFIX,google.com 會命中 www.google.commail.google.com 等所有以該後綴結尾的網域。
  • DOMAIN-KEYWORD:網域中包含指定關鍵字即命中,匹配範圍更寬,容易誤傷,一般放在後面。
  • GEOIP:按目標 IP 所屬國家/地區判斷,例如 GEOIP,CN,DIRECT 表示目標 IP 歸屬中國大陸則直連。這條規則依賴內建或外部 GeoIP 資料庫,判斷發生在網域解析之後。
  • IP-CIDR / IP-CIDR6:按 IP 段匹配,常用於區域網路位址、內網段的直連處理。
  • MATCH:兜底規則,不做任何條件判斷,前面所有規則都沒命中時執行它,必須放在整個 rules 段的最後一條。

關鍵點在於:網域類規則(DOMAIN-SUFFIX/DOMAIN-KEYWORD)在 DNS 解析前就能判斷,速度快;GEOIP 類規則需要先解析出 IP 再判斷,順序上通常排在網域規則之後。把 GEOIP,CN,DIRECT 放在最前面雖然能保證中國大陸 IP 優先直連,但也意味著所有請求都要先完成一次解析才能判斷,不適合追求速度的場景;把它放在網域規則之後、MATCH 之前,是更均衡的做法。

最小可用規則集範例

下面是一份可以直接理解、按需增補的最小分流規則集,涵蓋了「本地直連、境外代理、區域網路直連、兜底代理」四類最基本的場景:

rules:
  # 局域网与内网地址直连
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT

  # 常见国内域名直连
  - DOMAIN-SUFFIX,cn,DIRECT
  - DOMAIN-SUFFIX,baidu.com,DIRECT
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,alipay.com,DIRECT

  # 常见需要代理的域名
  - DOMAIN-SUFFIX,google.com,PROXY
  - DOMAIN-SUFFIX,youtube.com,PROXY
  - DOMAIN-SUFFIX,github.com,PROXY

  # 按 IP 归属地兜底判断
  - GEOIP,CN,DIRECT

  # 未命中以上任何规则,统一走代理
  - MATCH,PROXY

這裡的 PROXY 是策略群組名稱,需要在 proxy-groups 段提前定義好,通常指向訂閱節點或手動選擇的策略群組;DIRECT 是核心內建的直連策略,不需要額外定義。規則的先後順序嚴格對應上面列出的四類場景,從「精確、代價小」到「寬泛、代價大」依次排列,這也是編寫規則集的通用原則。

提示:MATCH 規則永遠只能出現一次,且必須是整個 rules 段的最後一行。多寫、漏寫或位置錯誤都會導致規則解析異常或後面規則永遠不會被執行到。

用 RULE-SET 取代零散網域清單

手寫幾十條 DOMAIN-SUFFIX 可以應付個人使用,但覆蓋不了完整的站點清單。實際生產環境中更常見的做法是引用規則集(RULE-SET),把大量網域/IP 歸類維護在外部檔案裡,規則段裡只寫引用:

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

rules:
  - RULE-SET,cn-domains,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

規則集會按 interval 設定的秒數定期刷新,不需要手動更新每一條網域。behavior 欄位決定規則集內容的解析方式(domain / ipcidr / classical),需要與規則集檔案本身的格式對應,寫錯會導致規則集載入失敗但不一定報錯明顯,這也是排查規則不生效時容易被忽略的一環。

規則不生效的常見排查路徑

規則寫完之後連線行為和預期不一致,通常可以按下面的順序逐項排查:

  1. 確認策略群組名稱拼寫一致

    規則裡引用的 PROXY、DIRECT 等策略名必須和 proxy-groups 裡定義的 name 完全一致,包括大小寫。名稱不匹配時,不同用戶端的表現不一樣,有的會報錯,有的會靜默回退到預設策略,容易誤判成「規則沒生效」。

  2. 檢查規則順序是否被更寬泛的規則提前攔截

    如果一條 DOMAIN-KEYWORD 或 GEOIP 規則寫在了前面,精確的 DOMAIN-SUFFIX 規則永遠輪不到它執行。把可疑規則暫時挪到最前面測試,能快速確認是不是順序問題。

  3. 確認 DNS 解析結果與預期一致

    GEOIP 類規則依賴解析出的 IP,如果用戶端啟用了 fake-ip 模式或者使用了境外 DNS,解析結果可能和真實歸屬地不符,導致 GEOIP,CN 判斷失效。可以在用戶端的連線日誌或規則命中記錄裡查看具體連線實際匹配到了哪一條規則。

  4. 核對規則集是否成功拉取

    使用 RULE-SET 時,如果外部 url 存取失敗或格式解析報錯,規則集會載入為空,相當於這條引用直接失效,後續流量會一路匹配到兜底 MATCH。查看用戶端啟動日誌或規則集刷新狀態可以確認這一點。

  5. 排除多份配置或多個 profile 互相覆蓋的情況

    部分用戶端支援多套配置切換,如果修改的是備用 profile 而目前生效的是另一份,規則改動自然不會體現。確認目前啟用的配置檔案路徑,是最容易被忽略但最常見的原因。

寫規則集時的幾個實用建議

規則集不是一次寫完就不再維護的東西,幾個長期實用的習慣值得保留:精確規則放前面、寬泛規則放後面,減少誤判;區域網路與內網段規則始終放在最前,避免本地服務被意外代理;GEOIP,CN,DIRECT 通常放在網域規則之後、MATCH 之前,作為中國大陸 IP 的兜底而不是主力判斷依據;涉及跨境辦公、跨境支付等特殊網域,建議單獨列出直連或代理,不要完全依賴 GEOIP 分類,因為部分服務的 IP 歸屬地和實際業務地不完全一致。規則集的價值隨著使用時間增長,建議定期回顧連線日誌,把頻繁被 MATCH 兜底命中的網域補充成明確規則,分流會越來越精準。

取得 Clash 用戶端

配置好規則分流前,先在對應平台安裝用戶端並完成訂閱匯入。

下載用戶端