Shadowrocket 規則寫法入門:DOMAIN-SUFFIX、GEOIP、IP-CIDR 與 FINAL 的比對範圍

了解 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 的比對方式,以及規則由上而下的匹配順序。

本文重點

設定 Shadowrocket(小火箭)規則時,應先確認比對對象,再檢查排列順序,最後核對命中後採用的策略。本文適合已備有自己的服務商設定或訂閱,並準備修改 Config 的使用者。閱讀後可分辨網域規則與 IP 規則、撰寫最基本的規則段,並從連線紀錄找出「規則未生效」的原因。本網站不提供、不銷售,也不推薦節點或訂閱。

規則格式:類型、比對值與策略

常見規則以英文逗號分隔,例如 DOMAIN-SUFFIX,example.com,DIRECT。第一欄決定檢查項目,第二欄是比對條件,第三欄則指定命中後如何處理連線。規則並非網頁 URL 篩選器:網域欄位不填 https://、路徑、查詢參數或連接埠。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,tracker,REJECT
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

以下是語法說明範例,並非適用於所有網路的完整設定。[Rule] 是規則區段;修改現有設定時,應編輯原有區段,不要重複新增。example.com 與 192.0.2.0/24 是文件中的範例值,不能用來確認實際服務是否可連線。

FINAL 沒有比對值,因此寫作 FINAL,PROXY,不能照三欄格式補成 FINAL,example.com,PROXY。範例中的 no-resolve 是 IP 規則的附加參數,不是第四種策略。

DOMAIN 系列:精確、後綴與包含比對

網域規則主要用來決定「這個名稱應採用哪種策略」。三種規則的差異在於比對範圍,而非優先順序。以下以同一個網域為例;表格中的「命中」表示符合比對條件,該規則是否實際生效,仍取決於前面是否已有規則先行命中。

規則範例可比對無法比對
DOMAIN,example.com,DIRECTexample.comwww.example.com
DOMAIN-SUFFIX,example.com,DIRECTexample.com、www.example.comnotexample.com、example.com.other.test
DOMAIN-KEYWORD,example,DIRECTexample.com、notexample.com網域中不含 example 的目標

DOMAIN-SUFFIX 會依網域標籤邊界比對,不是「結尾字元相同就算符合」。一般直接填入 example.com 即可,不必加上 *.。若只想處理 api.example.com,不希望影響其他子網域,使用 DOMAIN 會更容易確認比對範圍。

應用程式可能同時連線至主站、登入、圖片與 API 等多個網域。只替主站新增一條規則,不能據此推斷其他請求也會符合。請依連線紀錄逐項確認,不要一味擴大關鍵字範圍。

GEOIP 與 IP-CIDR:位址歸屬與位址範圍

GEOIP,CN,DIRECT 會依所使用的地理資料庫,檢查目標 IP 的地區歸屬。判斷依據不是網頁語言、網域後綴、使用者所在位置或服務商註冊地。網域可能解析至不同地區的位址,因此「中文網站一定會命中 CN」並不是可靠的排錯依據。

IP-CIDR 依 IPv4 位址與前綴長度判斷範圍。例如 192.0.2.0/24 涵蓋 192.0.2.0 至 192.0.2.255;192.0.2.8/32 則只比對單一位址。IPv6 位址範圍應使用相應的 IP-CIDR6,不要將 IPv6 位址填入 IPv4 範例。

IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR,192.0.2.0/24,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

上例將單一位址的例外規則放在較大的位址範圍之前:目標為 192.0.2.8 時,第一行已經命中,第二行不會再改變結果。若將兩行對調,範圍較廣的 /24 就會先套用至這個位址。

命中順序:具體例外在前,FINAL 在後

規則會依序檢查,第一條命中的規則就會決定該連線採用的策略,下方看起來「更精確」的規則不會覆蓋它。DOMAIN 不會自動排在 DOMAIN-SUFFIX 前面,IP-CIDR 也不會因為範圍較小而自動取得優先權。

發起連線取得目標資訊依序比對決定策略執行連線
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

依照此順序,login.example.com 會使用 DIRECT,img.example.com 會使用 PROXY,不符合前兩行條件的目標則交由 FINAL 處理。若將後綴規則移至第一行,登入網域也會先命中該規則,精確網域例外便不再生效。

建議先列出少數明確的例外,再加入範圍較廣的網域或位址規則,最後保留一條用途清楚的 FINAL。這種排列方式較容易維護,但不代表所有設定都必須依規則類型機械式分組。

在 Config 修改並驗證規則

測試前請先保留原有設定,並確認目前啟用的設定與正在編輯的檔案相同。訂閱中的伺服器項目更新,與 Config 中規則檔案的修改是兩回事;重新整理 Home 中已有的訂閱,不能取代對目前啟用規則的檢查。

  1. 保留原有設定

    進入 Config,先保留可還原的設定副本,再開啟目標設定的編輯入口。找到 [Rule],確認要修改的是規則區段。

  2. 新增單條規則

    先新增一條比對範圍明確的 DOMAIN 規則,並放在可能先行命中的後綴或關鍵字規則之前。每次只修改一項條件,然後儲存。

  3. 啟用規則設定

    在 Config 確認已選取剛儲存的設定,再前往 Home → Global Routing → Config。Proxy 與 Direct 是全域模式,不能用來驗證這裡逐條規則的分流結果。

  4. 建立新連線

    重新開啟目標頁面或重新送出應用程式請求,並檢查連線紀錄中的目標、命中規則與策略。既有長連線可能會持續使用,不能只查看修改前已開啟的頁面。

  5. 確認命中結果

    若紀錄顯示命中其他規則,先檢查該規則的位置;若已命中預期規則但仍連線失敗,再檢查對外連線。完成驗證後,再逐條新增其他條件。

Global Routing 中的 Scene 應配合場景設定,確認目前實際採用的策略;首次驗證時可明確切換至 Config,以減少變數。Settings → On Demand 用於設定依條件建立 VPN 連線的行為,不會改變 DOMAIN-SUFFIX 的比對範圍,也不能取代選擇啟用中的設定。

請以新連線的紀錄作為測試依據,不要只憑頁面是否能開啟來判斷。頁面快取可能讓失敗看起來像成功;背景 API 連線失敗時,主頁面也可能顯示正常,卻無法完成登入。

分開排查規則未生效與連線失敗

「命中哪條規則」和「命中後是否連得上」是兩個不同問題。以下列出網路連線中可能出現的錯誤原文範例,並非規則語法錯誤;確認命中的規則與策略後,才適合進一步檢查這些連線錯誤。

錯誤:Connection refused

原因與解決方式:連線端點拒絕了請求,常見原因是位址、連接埠或監聽服務不符。請先核對連線紀錄中實際連線的端點,再依自己的既有設定確認連接埠與服務狀態;修改 DOMAIN-SUFFIX 無法修正連接埠問題。

錯誤:Operation timed out

原因與解決方式:操作未能在期限內完成,可能與網路路徑、目標或代理連線有關。請先確認命中的策略,再分別檢查目標連線與既有代理連線;不能只憑這則錯誤就判定 GEOIP 資料或規則順序有問題。

設定了 DOMAIN,為什麼子網域沒有一起套用?

DOMAIN 只會比對填入的完整網域。若要同時涵蓋主網域及其子網域,請改用 DOMAIN-SUFFIX,example.com,DIRECT,並確認上方沒有其他規則先行命中。

FINAL 放在最前面會怎樣?

它會接管所有執行到該行的請求,後續規則將無法如預期生效。請將預設規則移至規則區段末尾,再建立新連線並檢查命中紀錄。

帶有 no-resolve 的 IP-CIDR 為什麼沒有命中?

先確認這次請求是否有可用的目標 IP,再檢查位址是否落在前綴範圍內。若只有網域名稱且沒有可用 IP,這條規則不會為了比對而主動解析;不要直接將未命中判定為前綴語法錯誤。

REJECT 已命中,為什麼頁面還有類似內容?

REJECT 拒絕的是符合條件的連線,不會依網頁內容分類。請先確認內容是否來自其他網域或本機快取;若同一網域也承載必要的 API,擴大拒絕範圍可能影響正常功能。

最後依序確認:啟用中的 Config、Global Routing 模式、請求目標、第一條命中的規則、最終策略,以及實際連線結果。關於關鍵字,可參閱規則關鍵字術語;涉及解析行為時,請參閱DNS 設定說明,避免混淆解析問題與規則範圍。

App Store 正版確認