分流基礎:規則、策略組與流量接管

國內外分流並不是依網頁語言判斷流量走向。Clash 核心會讀取連線資訊,依序比對規則,再將連線交給對應策略。核心能否辨識網域、目標 IP 與程序資訊,都會影響最終結果。國內網站也可能呼叫海外介面,海外網站也可能使用本地 CDN,因此應以實際連線為單位排查,而非只看網址列。

本文設定適用於使用 mihomo 核心的用戶端。舊版 Clash 核心與部分行動裝置用戶端支援的欄位不盡相同,匯入前請先查看用戶端的核心說明。範例使用本機規則檔,避免遠端規則下載失敗與分流錯誤混為一談。

完整主設定:先明確指定出口

範例環境與檔案位置

範例假設本機已有可用的 SOCKS5 上游,監聽於 127.0.0.1:1080,且不需要驗證。mihomo 本身監聽於 127.0.0.1:7890。這兩個連接埠不可互相指向,否則會形成代理迴圈。只有設定檔而沒有可用的上游,並不會自動具備海外代理能力。

在核心工作目錄中儲存 config.yaml,並建立 rules 資料夾。後續提到的三個規則檔也必須一併建立。桌面用戶端可能會使用獨立的核心工作目錄;相對路徑以該目錄為準,不一定是訂閱檔所在的目錄。

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false

proxies:
  - name: 本機上游
    type: socks5
    server: 127.0.0.1
    port: 1080
    udp: false

proxy-groups:
  - name: 海外代理
    type: select
    proxies:
      - 本機上游
  - name: 國內直連
    type: select
    proxies:
      - DIRECT
  - name: 廣告處理
    type: select
    proxies:
      - REJECT
      - DIRECT

rule-providers:
  ad-domains:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/ad-domains.yaml
  cn-domains:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/cn-domains.yaml
  overseas-services:
    type: file
    behavior: classical
    format: yaml
    path: ./rules/overseas-services.yaml

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
  - DOMAIN-SUFFIX,local,DIRECT
  - RULE-SET,ad-domains,廣告處理
  - DOMAIN,cloud.tencent.com,國內直連
  - RULE-SET,cn-domains,國內直連
  - RULE-SET,overseas-services,海外代理
  - MATCH,海外代理

若已有訂閱節點,可讓「海外代理」引用訂閱提供的節點或策略組,取代範例中的「本機上游」。請勿直接將整段 proxies 覆寫到目前使用的訂閱中。部分用戶端在更新訂閱時會重寫設定,長期修改請透過用戶端支援的覆寫或合併功能儲存;具體選項名稱會因用戶端版本而異。

範例停用 IPv6 是為了縮小初次排查的範圍,不代表 IPv6 不能參與分流。範例上游也未提供 UDP 轉發;可先用瀏覽器的 TCP 請求進行基本驗證,遊戲、語音與 QUIC 則需另外確認上游協定及流量接管方式。

規則檔寫法:domain 與 classical 的差異

廣告網域檔

將以下內容儲存為 rules/ad-domains.yaml。behavior: domain 使用網域清單語法,不需填寫策略名稱,也不要加上 DOMAIN-SUFFIX, 前綴。此處的 +. 代表同時涵蓋網域本身及其子網域。

payload:
  - '+.doubleclick.net'
  - '+.googlesyndication.com'

廣告規則應保留回復彈性。部分網站會將統計、登入或播放介面設在關聯網域下,擴大封鎖範圍可能導致頁面內容不完整。若確認是誤擋,可先將「廣告處理」切換為 DIRECT 進行驗證,再針對特定網域新增例外;不要一開始就刪除所有分流規則。

國內直連網域檔

將以下內容儲存為 rules/cn-domains.yaml。清單只涵蓋列出的網域及其子網域,無法自動辨識所有國內網站。新增網域前,請查看連線面板中的實際請求來源,不要只憑網址列的網域判斷頁面所有資源的來源。

payload:
  - '+.baidu.com'
  - '+.bilibili.com'
  - '+.bilibili.tv'
  - '+.qq.com'
  - '+.tencent.com'
  - '+.jd.com'
  - '+.taobao.com'

網域分類代表的是路由偏好,並非伺服器實際所在地的證明。同一品牌的不同服務可能部署在不同地區。若希望國際服務走代理,應先為該服務新增更精確的網域規則,再加入涵蓋整個品牌網域的直連規則。

海外服務規則檔

將以下內容儲存為 rules/overseas-services.yaml。behavior: classical 可存放包含規則類型的項目,但項目末尾仍不需填寫策略名稱;主設定中引用此規則集的規則已指定「海外代理」。

payload:
  - DOMAIN-SUFFIX,github.com
  - DOMAIN-SUFFIX,githubusercontent.com
  - DOMAIN-SUFFIX,githubassets.com
  - DOMAIN-SUFFIX,wikipedia.org
  - DOMAIN-SUFFIX,wikimedia.org

這裡將 GitHub 網頁、原始內容與靜態資源網域分開列出,方便日後調整特定資源的出口。雖然最後的 MATCH 也會將這些連線交給代理,明確列出規則仍有其作用:日誌可顯示命中的規則集,日後更改兜底策略時,也不會影響這些服務原本指定的出口。

比對順序:第一條命中的規則決定連線走向

規則不會自動依「越精確越優先」排序。DOMAIN 精確規則只有排在較寬泛的規則之前,才能優先套用。規則集也不會自動合併衝突:同一網域若同時出現在廣告集與直連集中,結果由先檢查到的引用規則決定。

順序 比對項目 設定原因
1迴圈連線與私人 IPv4 位址讓本機服務與常見區域網路目標優先直連
2廣告網域集優先封鎖已確認的廣告請求
3特定服務例外優先於後續較寬泛的網域分類
4國內網域集明確列出的國內服務直連
5海外服務集明確指定需使用代理的服務
6MATCH處理前述規則都未命中的連線

例外規則應放在要覆蓋的規則之前

主設定中的 cloud.tencent.com 是特定服務規則範例。該網域原本就會命中 +.tencent.com,因此目前的出口不會改變。若某項服務需要改走代理,請將這條精確規則的策略改為「海外代理」,而不是把整個騰訊網域集都移到代理組。

若要為廣告規則新增放行例外,例外必須排在廣告規則集之前。相反地,若將 MATCH,DIRECT 放在第一條,後續的廣告、國內與海外規則都不會再被檢查。兜底規則必須放在最後。

更新規則與補充 GEOIP:降低誤判風險

從本機檔案改用 HTTP 規則來源

本機的 type: file 規則集不會依時間間隔自動下載更新。如需自動更新,請改用 type: http,並提供可連線的 HTTPS 規則網址、快取 path 與 interval。例如 interval: 86400 代表每隔 86400 秒,也就是 24 小時檢查一次,並非每天固定在午夜更新。

選擇遠端規則來源時,請先確認內容格式。behavior: domain 對應網域清單,behavior: classical 對應含規則類型的項目;format: yaml 則對應含有 payload 的 YAML 檔案。網頁預覽網址、完整訂閱設定與二進位規則檔,不能視為相同的 YAML 規則來源。即使下載成功,內容格式不符仍會載入失敗。

GEOIP CN 僅供補充

若已備妥核心所需的 GeoIP 資料,可在 MATCH 前加入 GEOIP,CN,國內直連,為未命中網域規則的連線補上中國 IP 分類。此規則取決於目標 IP 與資料庫,無法取代服務網域分類。海外服務若使用中國大陸 CDN,可能被歸類為直連;國內服務若使用海外位址,也可能繼續走代理。

加入 no-resolve 後,例如 GEOIP,CN,國內直連,no-resolve,規則不會只為了比對而主動解析網域。如果連線當下沒有可供比對的實際目標 IP,規則可能會被略過。因此,此設定可避免部分規則觸發 DNS 解析,但並非「更精準辨識國內流量」的開關。主設定不依賴 GeoIP,方便先驗證基本分流。

驗證與排查:先看規則命中,再確認連線結果

四步檢查設定

  1. 檢查語法與檔案。使用 mihomo 命令列時,可在範例目錄執行 mihomo -t -d . -f config.yaml。使用桌面用戶端時,請利用其設定檢查功能,並確認三個本機規則檔都已載入。
  2. 確認流量接管。啟用系統代理,或使用下方明確指定代理的命令。若命令可以連線,但瀏覽器的連線面板沒有記錄,應先檢查瀏覽器代理設定,不要急著修改規則。
  3. 檢查目前策略。確認模式為規則模式、「海外代理」目前選用的是可用上游,而「廣告處理」目前選用的是 REJECT。
  4. 重新建立連線。修改規則後,請關閉既有連線再測試。瀏覽器可能重複使用舊連線,切換策略不保證已建立的工作階段會立即改用新出口。
curl -I --proxy http://127.0.0.1:7890 https://www.baidu.com
curl -I --proxy http://127.0.0.1:7890 https://github.com
curl -I --proxy http://127.0.0.1:7890 https://www.wikipedia.org

在 Windows 環境中,若終端機將 curl 對應成其他命令,可改用 curl.exe。這些命令測試的是經由 7890 連接埠送出的請求,不會驗證 TUN 接管,也不能只憑 HTTP 狀態碼判斷整個網站的所有資源都能正常使用。

利用命中紀錄定位問題

測試目標 預期規則 預期策略
www.baidu.comcn-domains國內直連 → DIRECT
github.comoverseas-services海外代理 → 本機上游
www.wikipedia.orgoverseas-services海外代理 → 本機上游
ad.doubleclick.netad-domains廣告處理 → REJECT

上表是根據範例設定推估的預期結果,並非實測速度或可用性保證。驗證廣告網域時,重點是確認連線由哪條規則處理,而不是要求廣告服務載入頁面。若規則與策略都符合預期,但仍無法連線,請繼續檢查上游連線、目標服務與 DNS,不要反覆調整規則順序。

DNS 與 TUN 常見干擾因素

網域規則需要核心取得網域資訊。應用程式若直接連線 IP、瀏覽器使用獨立的加密 DNS,或 TUN 環境中的 DNS 解析路徑未正確接管,都可能影響網域辨識。fake-ip 可透過虛擬位址映射協助還原網域關聯,但需一併檢查用戶端 DNS 設定、TUN DNS 劫持與繞過項目,不能只修改一個欄位,就認為所有請求都能依網域比對。

只有在日誌無法協助定位問題時,才暫時將 log-level 改為 debug;排查完成後請恢復為 info。分享日誌前,請移除訂閱網址、驗證資訊與個人瀏覽紀錄。最終驗收時,應分別確認三件事:連線確實進入核心、命中預期規則,以及對應出口確實可用。三項都符合,才算完成可靠的國內外分流設定。