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

一次看懂 DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP、IP-CIDR、FINAL 的比對範圍,附規則範例與常見錯誤。

本文快速導覽

Shadowrocket(小火箭)的規則會先決定「比對哪些連線」,再決定「套用哪種策略」。本文適合已有可用設定、想調整分流範圍的使用者:先區分網域與 IP 規則,再依由上而下的順序排列例外,最後透過新的連線紀錄確認結果。範例僅說明規則語法,不提供連線服務;如需代理連線,請以使用者已有的服務商與訂閱為前提。

1. 規則基本格式:類型、比對值、策略

一般比對規則通常由三個欄位組成,並以英文半形逗號分隔:規則類型、比對值、策略。規則應放在設定檔的 [Rule] 區段;FINAL 不需要比對值,因此只需填兩個欄位。先確認格式,再檢查比對範圍,比起一味增加規則更容易找出問題。

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

DIRECT 表示直接連線,PROXY 表示使用代理策略,REJECT 表示拒絕符合條件的連線。策略欄位也可以引用設定中實際存在的策略名稱,但名稱必須完全一致。本文統一使用內建策略詞,避免範例引用未定義的策略名稱。

收到連線請求 讀取目標 依序比對 決定策略 建立連線

2. DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD 的比對範圍

這三類規則檢查的是網域,不是完整網址。請填入 example.com,不要填入含有 https://、連接埠或路徑的 URL。同一網頁的主頁、圖片與 API 可能分別連到不同網域,因此一條網域規則不會自動涵蓋頁面中的所有連線。

規則比對範圍不會比對的範例
DOMAIN,example.com,DIRECT只比對 example.comwww.example.com
DOMAIN-SUFFIX,example.com,DIRECT比對 example.com 及其子網域,例如 a.b.example.comnotexample.com
DOMAIN-KEYWORD,example,DIRECT比對網域中含有 example 的請求網域為 sample.test,只有 URL 路徑含有 example 的請求

DOMAIN-SUFFIX 會依網域層級邊界比對,不是比對任意字串的結尾。通常直接填入 example.com,不要寫成 *.example.com。如果只想個別處理 api.example.com,使用 DOMAIN 就能明確指定範圍,也不會一併比對其下其他子網域。

DOMAIN-KEYWORD 的比對範圍較廣:example 可能比對到目標網站,也可能比對到其他含有相同字串的網域。它不是正規表示式,請勿將正規表示式符號當作比對語法。若只需處理特定網域及其子網域,優先使用能精確表達需求的網域後綴規則。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,telemetry,REJECT
FINAL,DIRECT

在這個範例中,api.example.com 符合第一行,其他 example.com 子網域則符合第二行。第三行只會檢查尚未比對的請求,確認網域是否含有 telemetry;不會回頭覆蓋前兩行已決定的策略。

3. IP-CIDR 與 GEOIP:比對目標 IP,不檢查網址文字

IP-CIDR 會依 IPv4 網段比對,斜線後的數字代表網路前綴長度,不是連接埠。192.168.1.0/24 涵蓋 192.168.1.0 至 192.168.1.255 的地址範圍;/32 則代表單一 IPv4 地址。IPv6 網段請使用對應的 IP-CIDR6 類型。

[Rule]
IP-CIDR,192.168.1.0/24,DIRECT,no-resolve
IP-CIDR,192.0.2.8/32,DIRECT,no-resolve
IP-CIDR6,2001:db8::/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

其中 192.0.2.8 和 2001:db8::/32 是文件範例地址,不是可用的服務入口。連線至 192.168.1.20:8080 時,網段規則比對的是 192.168.1.20,不會只比對連接埠 8080。將連接埠填入 CIDR 比對值,會混淆兩種不同條件。

欄位或類型意義檢查重點
IP-CIDR目標 IPv4 是否位於指定網段填寫網路地址與前綴長度,不要填 URL
GEOIP,CN目標 IP 在使用的地理資料庫中是否歸類為 CN不是依網域後綴、網頁語言或裝置位置判斷
no-resolve不會為了檢查這條 IP 規則而主動觸發網域解析不代表停用所有 DNS,也不代表網域請求一定會符合規則

網域請求若要參與 IP 類規則比對,必須有可供判斷的目標地址;是否會為規則比對而觸發解析,則取決於規則選項與請求情境。加入 no-resolve 後,如果當下沒有可用的目標 IP,就不能將這條網段規則視為網域涵蓋規則。若要穩定涵蓋特定網域,直接新增明確的網域規則會更容易確認。

GEOIP 的結果取決於所使用的 IP 地理資料庫。同一網域可能解析出多個地址,地址所屬地區也可能變動,因此它表達的需求不同於 DOMAIN-SUFFIX。若要讓指定網域固定使用某種策略,請將該網域的例外規則放在通用 GEOIP 規則之前。

4. 由上而下比對:為什麼 FINAL 要放在最後

一般規則會依序檢查,由第一條符合的規則決定策略;系統不會自動依「精確程度」調整優先順序。請將特定例外放前面,接著放較廣泛的規則,並將 FINAL 留在最後,處理先前都未符合的請求。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.1.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY

如果將網域後綴規則移到第一行,api.example.com 就會先符合該規則,後面的精確網域例外便不會生效。同樣地,若將 FINAL,DIRECT 放在最前面,後續規則就沒有正常參與比對的機會。調整順序後,請用新的連線重新確認,不要只重新整理已建立連線的頁面。

5. 在 Config 修改後,分四步確認結果

排查時一次只變更一個條件。先確認修改的是目前使用的設定檔,再確認 Home 的路由模式,最後查看新連線的目標與策略。只看到頂端的連線開關已開啟,並不能證明指定規則已符合。

  1. 儲存原始設定

    進入 Config,確認目前使用的檔案,並先儲存副本。開啟該檔案的文字編輯功能,在 [Rule] 區段中修改;不要將規則加到 [Host] 或其他區段。

  2. 加入精確規則

    將需要的 DOMAIN 例外放在對應的 DOMAIN-SUFFIX 之前,並保留檔案最後的 FINAL。儲存後,確認 Config 使用的是修改後的檔案。

  3. 選擇 Config

    返回 Home → Global Routing → Config,再確認連線狀態。若需使用 PROXY,請先透過 Home → Connectivity Test 檢查既有服務是否連通;測試結果本身不能證明規則已符合。

  4. 確認新連線

    重新送出目標請求,並在 App 內的連線紀錄中比對實際網域、目標 IP 與使用的策略。若頁面同時連線至多個網域,請逐一確認;不要將圖片請求的結果當成主頁請求的結果。

如果紀錄顯示的目標不是預期網域,請先檢查重新導向、API 網域或直接使用 IP 存取的情況,不要立刻擴大規則範圍。若請求仍沿用舊連線,請關閉相關頁面或 App 後重新送出;必要時重新建立 Shadowrocket 連線。使用可重現的新請求驗證,才能分辨是「規則未符合」還是「舊連線尚未變更」。

6. 常見規則錯誤與非規則問題

語法錯誤、比對範圍錯誤與服務無法使用,是三種不同問題。規則只負責決定策略,不會修復訂閱網址或代理連線參數。以下先檢查可直接從文字發現的問題,再處理與規則無關的取得失敗提示。

錯誤寫法或現象問題修正方式
DOMAIN,https://example.com/a,DIRECT將完整 URL 當成網域改用 DOMAIN,example.com,DIRECT;不檢查路徑
DOMAIN-SUFFIX,*.example.com,DIRECT在網域後綴比對值中加入萬用字元改用 DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.1.20:8080,DIRECT混入連接埠,且缺少 CIDR 前綴單一地址寫為 192.168.1.20/32,此規則不限制連接埠
FINAL,example.com,PROXYFINAL 多填了比對值改為 FINAL,PROXY,並放在規則末尾
使用中文逗號分隔欄位欄位分隔符號錯誤改用英文半形逗號,並確認規則位於 [Rule] 區段中

錯誤:Failed to load subscription

原因與處理方式:這是訂閱載入失敗的提示,可能是網址失效或連線失敗,並非某條 DOMAIN-SUFFIX 規則的語法診斷。請先向自己的服務商確認既有訂閱網址是否有效,再於 Home 更新該訂閱;待項目可用且設定已啟用後,再另外排查規則。

若修改的是由遠端來源維護的設定,也請留意再次更新可能會覆蓋本機修改。先確認檔案來源與更新方式,並保留本機副本,以免剛確認完規則就被更新內容取代。更新訂閱項目與修改 [Rule] 區段是兩回事,請勿以反覆更新訂閱取代規則檢查。

7. 規則比對常見問題

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

DOMAIN 只會比對完整網域。若要涵蓋 example.com 及其子網域,請使用 DOMAIN-SUFFIX,example.com,DIRECT;若特定子網域要例外處理,請將對應的 DOMAIN 規則放在前面。

GEOIP,CN 能確保所有中文網站都直接連線嗎?

不能依網頁語言判斷。GEOIP 檢查的是 IP 在資料庫中的歸屬。請先從連線紀錄確認實際目標 IP;若要明確處理特定網域,請新增網域規則並放在 GEOIP 之前。

規則寫對了,為什麼仍然全部使用同一種策略?

先檢查 Home → Global Routing 是否設為 Config,再到 Config 確認啟用中的檔案。接著檢查前面是否有範圍過廣的 DOMAIN-KEYWORD,或提早出現的 FINAL,最後再透過新連線紀錄確認。

no-resolve 會讓所有網域都不解析嗎?

不會。它限制的是為檢查對應 IP 規則而觸發的解析。若想讓特定網域直接連線,請使用明確的 DOMAIN 或 DOMAIN-SUFFIX,不要用 no-resolve 取代網域比對。

從 App Store 下載