Shadowrocket 規則類型詳解:DOMAIN-SUFFIX、GEOIP、IP-CIDR 與 FINAL 的寫法

說明 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 的比對範圍與寫法,並解析規則由上而下的比對順序。

本文重點

Shadowrocket(小火箭)的 Rule 不會自動依「精確度」排序,而是依設定順序比對。本文適合已有自己的服務商與連線設定、準備調整分流的使用者:先確認 Global Routing 設為 Config,再區分網域規則與 IP 規則,最後將 FINAL 放在末尾。讀完即可撰寫一組容易理解、能逐條驗證的規則,並分辨「沒有比對到」與「比對到但連線失敗」。

先確認規則生效條件

先檢查 Home 中的 Global Routing,再編輯 Config。使用 Config 時,請求會依目前啟用的設定檔進行分流;Proxy 與 Direct 是不同的全域處理模式,不能用來驗證自訂 Rule 是否生效。Scene 會依已設定的情境處理,也不等於固定使用某一份 Config。排查期間先固定使用 Config,避免情境變化影響判斷。

6 類
本文介紹的 Rule 類型,並非所有類型
3 類
網域比對:DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD
4 種
Global Routing:Proxy / Direct / Config / Scene
  1. 在 Home 確認已有可用的連線設定,並開啟連線開關;首次建立系統 VPN 設定時,依照系統提示授權。
  2. 進入 Config,確認目前啟用的檔案。編輯前先保留副本,避免遠端檔案更新與本機修改混在一起。
  3. 返回 Home,將 Global Routing 設為 Config;儲存修改後,依介面提示重新載入或建立連線。
  4. 關閉待測試 App 的舊連線,再發出新請求。已建立的長連線通常不會因為修改一行規則就立即改變路徑。

Home 用於管理連線與服務項目,Config 用於存放設定檔,Settings 則是全域設定所在位置。Settings → On Demand 控制在何種條件下建立連線,不負責將特定網域指派給某條 Rule;若出現「中斷後又自動連線」,應檢查這裡,而不是反覆修改 FINAL。

先比對,再執行策略

常見規則由類型、比對內容與策略組成,並以英文半形逗號分隔。例如 DOMAIN,api.example.com,DIRECT 表示:網域恰好是 api.example.com 時,執行 DIRECT。FINAL 沒有比對內容欄位,因此寫成 FINAL,PROXY,不要補成三段。

發出新請求 取得目標資訊 依序比對規則 執行命中策略 建立輸出連線

同一個請求命中前面的規則後,就不會繼續尋找後面「更精確」的規則。假設 DOMAIN-SUFFIX,example.com,PROXY 排在前面,而 DOMAIN,api.example.com,DIRECT 排在後面,後者就不會為這個網域提供例外。正確做法是將例外規則移到範圍較廣的規則前面。

三種網域規則

網域規則比對的是主機名稱,而非完整網址。不要在比對欄位填入 https://、路徑 /login、查詢參數或連接埠 :443。以下的 example.com 都是文件範例,並非需要設定的實際服務。

類型與寫法比對範圍容易混淆的情況
DOMAIN,api.example.com,DIRECT 只比對 api.example.com 不比對 example.com 或 img.api.example.com
DOMAIN-SUFFIX,example.com,PROXY 比對 example.com 及其子網域 不比對 notexample.com,網域邊界很重要
DOMAIN-KEYWORD,example,PROXY 比對主機名稱中包含 example 的請求 可能同時比對 example.net 與 notexample.com,範圍較廣

只想改變單一 API 的輸出路徑時,優先使用 DOMAIN;要涵蓋同一主網域下的資源網域時,使用 DOMAIN-SUFFIX;只有明確需要子字串比對時才使用 DOMAIN-KEYWORD。關鍵字規則不會判斷網站歸屬,字詞過短可能影響無關網域,也更難界定故障範圍。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,media-sample,PROXY
FINAL,DIRECT

在這組範例中,api.example.com 先比對到 DIRECT,img.example.com 比對到後綴規則;未符合前面任何條件的請求則執行 FINAL 的 DIRECT。若將第一行移到後綴規則之後,API 例外就會被涵蓋。只要調整順序就足以改變結果,不必同時修改 DNS 或連線參數。

GEOIP 與 IP-CIDR

GEOIP 依目標 IP 在本機地理資料庫中的歸屬進行比對。GEOIP,CN,DIRECT 表示對歸屬於 CN 的目標 IP 使用 DIRECT。判斷依據不是網頁語言、網域後綴或服務商註冊地。同一網域可能解析至不同地區的位址,因此結果會同時受到解析結果與資料庫內容影響。

IP-CIDR 則直接比對 IPv4 網段。192.168.0.0/16 涵蓋 192.168.0.0 至 192.168.255.255;10.20.30.40/32 只代表一個 IPv4 位址。遮罩描述的是位址範圍,不是連接埠範圍,也不是主機數量參數。

IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.20.30.40/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

不要只憑「網站屬於某個地區」就推斷 GEOIP 一定會比對到。內容傳遞網路可能讓同一網域回傳多個目標 IP,App 也可能使用快取位址。先查看新請求的目標位址,再判斷地理規則是否符合預期。

FINAL 與完整順序

FINAL 是前面的規則都未比對到時使用的兜底規則,不是連線失敗後的重試開關。若前面的規則選中了 PROXY,但該輸出連線逾時,請求不會因此自動略過它,再由 FINAL 改走 DIRECT。應修正已選取的輸出連線或規則選擇,而不是再新增一條末尾規則。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,media-sample,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
  1. 具體例外放前面。API 單一網域規則應排在同一網站的後綴規則之前,確保例外能先比對到。
  2. 接著設定網域範圍。先決定已知網站的輸出路徑,再處理 IP 範圍,可減少地理歸屬變動對指定網站的影響。
  3. 安排位址規則。本機網段與 GEOIP 之間也有順序關係;若規則範圍重疊,應將需要優先執行的條件放在前面。
  4. 最後保留兜底規則。將 FINAL 放在末尾。應依照希望如何處理未分類請求,決定使用 DIRECT 或 PROXY,而不是照搬他人的設定習慣。

依現象排查分流問題

每次只修改一項,並以同一個目標發出新請求。查看可用的連線記錄或日誌時,優先記下目標網域、實際 IP、命中規則與最終策略。若日誌只提供部分資訊,就根據現有內容縮小排查範圍,不要把「頁面無法開啟」直接視為規則寫錯。

錯誤:Connection timed out

原因與處理方式:連線未能在指定時間內完成,可能與目標、連線路徑或輸出服務有關;先確認命中的策略,再使用 Home 中的 Connectivity Test 檢查目前連線,並比對同一目標的其他請求。逾時本身不能證明 DOMAIN-SUFFIX 語法有誤。

錯誤:Connection refused

原因與處理方式:通常表示目標端或中間設備明確拒絕連線;請確認請求的目標連接埠,以及使用者現有服務的連接埠設定。例如服務只監聽 443,卻連線至 8443 時,應修正連線參數,而不是依賴調整 FINAL 兜底。

以上英文是網路錯誤訊息,實際顯示內容取決於日誌來源。若沒有錯誤,只是輸出路徑與預期不同,先檢查目前是否仍處於 Proxy 或 Direct,再確認編輯的檔案是否為目前啟用的 Config,最後從第一條 Rule 開始,找出更早比對到的條件。

「新增規則後,為什麼還是走原本的輸出路徑?」

先在 Home 將 Global Routing 固定設為 Config,再確認 Config 中啟用的檔案。將單一網域例外移到範圍較廣的後綴或關鍵字規則之前,儲存後關閉舊連線,再重新請求同一網域;不要只重新整理仍沿用舊連線的頁面。

「設定 GEOIP 的 CN 後,為什麼這個中文網站沒有走 DIRECT?」

查看該次請求實際連線的 IP,而不是網頁語言。如果請求已比對到前面的網域規則,GEOIP 就不會參與後續判斷;若比對流程到達 GEOIP,則應確認該 IP 在資料庫中的歸屬,以及解析結果是否已變動。

「更新訂閱後,自訂規則也會一起更新嗎?」

服務訂閱與 Config 是不同項目。在 Home 更新現有服務訂閱,主要是更新連線項目;需要更新遠端設定時,應在 Config 中操作對應檔案。不要把訂閱更新成功,當成本機 Rule 已儲存或啟用的證明。

「更換通訊協定後,需要重寫 DOMAIN-SUFFIX 嗎?」

更換通訊協定不代表必須重寫。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 屬於連線通訊協定層,網域規則則負責選擇策略。先確認原有策略仍指向有效項目,再依自己的服務參數檢查通訊協定連線。

儲存前逐項確認

可靠的分流設定應能回答三個問題:這條規則比對什麼、為什麼排在這裡,以及命中後使用哪個策略。先維護少量明確的規則,再逐步擴充,比一次加入大量難以說明的關鍵字更容易排查問題。本網站僅說明用戶端設定操作,不提供、不販售或推薦節點或訂閱服務。

免費下載 Shadowrocket