Shadowrocket 自訂規則與優先順序:由上而下比對、FINAL 兜底與 PROXY/DIRECT/REJECT 策略

說明規則由上而下逐條比對的機制、DOMAIN-SUFFIX 與 GEOIP 等關鍵字的排序、FINAL 的兜底寫法,以及 PROXY、DIRECT、REJECT 三種策略的適用情境與常見錯誤。

本文速覽

本文適合已在 Shadowrocket(小火箭)中匯入自有設定、需要調整分流結果的使用者。重點在於判斷請求如何命中規則、如何安排具體規則與廣泛規則的先後順序、何時使用 PROXY、DIRECT 或 REJECT,以及如何用 FINAL 接住所有未命中的請求。

規則優先順序的核心:命中第一條後停止

Shadowrocket 的規則清單不是同時計算後再選擇「最精確」的一條,而是依照設定中的書寫順序,由上而下逐條檢查。某條規則一旦符合目前請求,後續規則便不再參與這次判斷。因此,優先順序由位置決定,不會由規則名稱、字元長度或策略類型自動決定。

例如,同一個網域既可能符合精確的 DOMAIN 規則,也可能符合涵蓋整個後綴的 DOMAIN-SUFFIX 規則。如果 DOMAIN-SUFFIX 寫在前面,即使精確 DOMAIN 更具體,也不會生效。設定時應將例外項目放在廣泛規則之前,並將涵蓋範圍最大的兜底項目放到最後。

發起請求讀取網域逐條比對首條命中執行策略

一次典型的判斷可拆成五個步驟:應用程式發起連線;Shadowrocket 取得目標網域或 IP;從 [Rule] 第一行開始檢查;遇到第一條符合的規則後停止;依照該行末尾的策略處理。若所有具體規則都未命中,便會繼續交由 FINAL 處理。

[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY

存取 api.example.com 時,會先命中第一行並使用 DIRECT;存取 www.example.com 時,第一行不符合,接著命中 DOMAIN-SUFFIX 並使用 PROXY。目標位於私有位址範圍 192.168.0.0/16 時使用 DIRECT;其餘請求經 GEOIP 判斷後,仍未命中的部分交給 FINAL。

DOMAIN、DOMAIN-SUFFIX、IP-CIDR 與 GEOIP 如何排序

規則排序應從「範圍窄、意圖明確」逐步過渡到「範圍廣、涵蓋面大」。DOMAIN 只匹配一個完整網域,適合設定個別例外;DOMAIN-SUFFIX 會涵蓋指定網域及其子網域;IP-CIDR 依位址範圍匹配;GEOIP 則根據目標 IP 的地理資料庫分類。FINAL 不檢查具體目標,而是接收前面所有未命中的請求。

1 條
每個請求只採用第一條命中的規則
4 種狀態
Global Routing:Config / Proxy / Direct / Scene
3 種策略
本文使用 PROXY / DIRECT / REJECT
最後 1 行
FINAL 通常只保留一條,並放在末尾

建議採用的排列層級

  1. 本地與保留位址:先處理區域網路位址,以及明確需要 DIRECT 的目標,避免內部裝置的請求進入其他策略。
  2. 精確網域:使用 DOMAIN 表示單一主機的特殊處理方式,例如讓某個 API 網域優先於後面的後綴規則。
  3. 網域後綴:使用 DOMAIN-SUFFIX 處理某個主網域及其所有子網域。
  4. 位址範圍:使用 IP-CIDR 匹配明確的 IPv4 網段。前綴長度越大,涵蓋範圍通常越窄。
  5. 地理分類:將 GEOIP 放在具體網域與位址規則之後,避免廣泛分類過早攔截例外請求。
  6. 最終兜底:將 FINAL 放在最後,明確指定所有剩餘流量的處理方式。

具體規則

DOMAIN
api.example.com,DIRECT
DOMAIN-SUFFIX
example.com,PROXY
IP-CIDR
192.168.0.0/16,DIRECT

例外項目寫在涵蓋範圍較大的規則之前。

廣泛規則

GEOIP
CN,DIRECT
FINAL
PROXY
位置
[Rule] 尾端

先完成具體匹配,再進行地理判斷與最終兜底。

DOMAIN-SUFFIX 的值只填寫網域本身,不要附帶 https://、路徑或查詢參數。規則匹配的是主機名稱,而不是完整網頁網址。若要處理 cdn.example.com,可寫成 DOMAIN,cdn.example.com,DIRECT;若要涵蓋 example.com 及其各級子網域,則寫成 DOMAIN-SUFFIX,example.com,PROXY

IP-CIDR 的前綴長度必須與目標網段相符。以 192.168.0.0/16 為例,它涵蓋從 192.168.0.0192.168.255.255 的位址。若誤寫成 /24,涵蓋範圍會縮小為單一末端網段,其他同類區域網路位址便不會命中。

結論:例外越具體,位置越靠前

需要覆蓋通用規則的單一網域、單一位址範圍或區域網路例外,應放在 DOMAIN-SUFFIX、GEOIP 與 FINAL 之前;僅僅把規則寫得更具體,並不會自動取得更高優先順序。

PROXY、DIRECT 與 REJECT 分別會改變什麼

規則末尾的策略決定請求命中後如何處理。PROXY 表示交由目前設定指定的代理策略處理;DIRECT 表示直接連線至目標;REJECT 表示拒絕該請求。三者是處理動作,不是規則關鍵字。前面的 DOMAIN-SUFFIX、GEOIP、IP-CIDR 等負責判斷「匹配誰」,末尾策略則決定「如何處理」。

策略 處理結果 適用的規則意圖 核對重點
PROXY 交由設定中的代理策略處理 明確需要透過代理路徑存取的網域,或作為 FINAL 兜底 確認目前選取的策略可用,且 Global Routing 為 Config
DIRECT 從目前網路直接連線至目標 區域網路位址、明確的直連網域或 GEOIP 分類 確認本地網路本身能夠連線至目標
REJECT 立即拒絕符合條件的請求 明確需要阻擋的網域或位址範圍 不要將過於寬泛的後綴誤設為 REJECT

PROXY 不代表任意請求都一定成功,它只是將請求交給目前選取的代理策略繼續處理。最終結果仍取決於使用者現有的設定、對應協定參數與網路狀態。Shadowrocket 支援的設定可能包含 Shadowsocks、VMess、VLESS、Trojan、Hysteria2 或 WireGuard 等協定,但規則順序與具體協定彼此獨立:更換協定不會改變 [Rule] 由上而下的匹配方式。

DIRECT 也不代表「忽略 Shadowrocket」。請求仍會先進入規則判斷,只是在命中後選擇直接連線。因此,遇到區域網路裝置無法存取時,應檢查私有位址規則是否位於 FINAL 之前,同時確認 Global Routing 沒有停留在 Proxy。

REJECT 應只用於邊界明確的目標。若將 DOMAIN-SUFFIX,example.com,REJECT 寫在前面,該主網域及所有子網域都會被拒絕,即使後面另有 DOMAIN,api.example.com,DIRECT 也不會生效。正確做法是先寫入允許的例外,再寫入涵蓋範圍較大的拒絕規則。

允許例外

第一行
DOMAIN,api.example.com,DIRECT
第二行
DOMAIN-SUFFIX,example.com,REJECT
結果
API 直接連線,其餘後綴拒絕

精確 DOMAIN 先命中,因此覆蓋後面的後綴規則。

路由狀態

Config
依規則清單分流
Proxy
採用全域代理狀態
Direct
採用全域直連狀態
Scene
依已設定的情境選擇狀態

排查自訂規則時,先在 Home 核對 Global Routing。

FINAL 為什麼必須放在規則末尾

FINAL 是未匹配請求的統一出口。它不限制網域、IP 或位址範圍,因此放在中間時,會接住之前尚未命中的所有請求,後續規則便完全失去執行機會。即使設定允許繼續書寫其他行,位於 FINAL 後面的行也無法改變已完成的首條匹配結果。

# 建議順序
DOMAIN,internal.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

# 錯誤順序
FINAL,PROXY
DOMAIN,internal.example.com,DIRECT

第一組順序會先檢查精確網域、後綴與 GEOIP,最後才使用 PROXY 處理剩餘請求。第二組在第一行便讓所有請求命中 FINAL,因此第二行永遠沒有機會生效。出現「新增規則完全沒有反應」時,首先檢查它是否寫在 FINAL 後面。

FINAL 的策略應由設定目標決定,而不是機械式固定為某個值。若設定採用「列出直連例外,其餘走代理」的結構,可使用 FINAL,PROXY;若設定採用「只列出需要代理的目標,其餘直連」的結構,則可使用 FINAL,DIRECT。兩種結構都成立,但前面的規則必須與兜底方向一致。

結論:先確定預設行為,再撰寫例外規則

先決定未匹配請求最終使用 PROXY 還是 DIRECT,再將與預設行為相反的例外寫在 FINAL 前面。這比不斷追加重複規則更容易檢查,也能避免同一網域出現互相衝突的處理方式。

修改後依固定步驟驗證

  1. 在 Config 中開啟目前使用的設定,確認修改發生在實際啟用的設定上,而不是另一份同名或備用設定。
  2. 檢查 [Rule] 中是否只有一條負責最終兜底的 FINAL,並確認它位於規則清單末尾。
  3. 返回 Home,將 Global Routing 設為 Config。若處於 Proxy 或 Direct,自訂規則的預期分流結果便無法在 Config 狀態下驗證。
  4. 分別測試一個應命中 DIRECT 的目標,以及一個應命中 PROXY 的目標,不要只用單一網站判斷全部規則。
  5. 若結果與預期不符,請從規則頂部開始尋找第一條可能命中的 DOMAIN、DOMAIN-SUFFIX、IP-CIDR 或 GEOIP,而不是只檢查剛新增的那一行。

設定更新、On Demand 與規則未生效的常見原因

使用者已有自己的服務商與訂閱時,設定更新可能會重新寫入遠端提供的規則內容。若自訂規則直接修改在會被更新覆蓋的設定中,重新整理後可能恢復為遠端內容。修改前應分清目前設定是手動維護,還是隨訂閱更新,並在更新後重新檢查 [Rule] 順序與 FINAL 位置。

On Demand 與規則優先順序處理的是不同階段。入口為 Settings → On Demand,它會根據已設定的網路條件決定何時建立連線;連線建立後,請求如何分流仍取決於 Global Routing 與目前的設定規則。On Demand 尚未建立連線時,僅調整 [Rule] 無法取代對連線條件的檢查。

規則執行

入口核對
Home → Global Routing
測試狀態
Config
設定位置
目前 Config 的 [Rule]
終點
FINAL 位於最後一行

先確認啟用的對象,再判斷規則文字是否正確。

自動連線

入口
Settings → On Demand
作用
依網路條件控制連線
規則關係
不改變 [Rule] 的先後順序
排查
分別核對連線與分流

連線時機與請求策略應分成兩個環節檢查。

另一個常見原因是規則內容包含 URL。DOMAIN 與 DOMAIN-SUFFIX 只接受網域部分;將協定標頭、連接埠或路徑一併寫入,會導致匹配對象不正確。例如要匹配存取 https://api.example.com:443/v1/status 時,DOMAIN 值應寫成 api.example.com,連接埠 443 與路徑 /v1/status 不屬於該網域規則的值。

規則名稱與策略名稱也應使用英文原文,並以英文逗號分隔欄位。全形逗號、欄位缺失、額外空格造成的不可見差異,都可能讓一行設定無法依預期解析。複製規則後,可先保留三段式結構,再逐項核對關鍵字、匹配值與策略。

新增 DOMAIN 後為什麼仍然走 PROXY?

先檢查它上方是否已有能夠命中的 DOMAIN-SUFFIX,再確認它沒有寫在 FINAL 後面。需要作為例外的精確 DOMAIN 應移到廣泛後綴規則之前,並在 Home 將 Global Routing 設為 Config 後重新測試。

寫了 DIRECT,區域網路裝置仍然打不開?

檢查目標的實際 IP 是否位於所寫的 IP-CIDR 範圍內。例如 192.168.1.20 可命中 192.168.0.0/16,但不會命中 192.168.2.0/24。接著確認本地 Wi-Fi 本身能夠存取該裝置。

訂閱更新後自訂規則消失了?

更新可能會重新寫入目前的設定內容。先在 Config 中確認目前啟用的設定及其來源,再查看 [Rule] 是否恢復為更新後的內容。需要長期保留的修改,應採用與該設定維護方式相符的規則管理方法。

開啟 On Demand 後,FINAL 會改變嗎?

不會。On Demand 位於 Settings → On Demand,負責連線時機;FINAL 仍是 [Rule] 中的末端兜底。應先確認連線已建立,再檢查請求是否依照 Config 狀態命中規則。

如何快速判斷 REJECT 是否寫得太寬?

查看 REJECT 前面的匹配關鍵字。DOMAIN 只影響一個完整網域,DOMAIN-SUFFIX 會影響主網域及所有子網域。若只需要拒絕單一主機,應使用精確 DOMAIN,並避免讓廣泛的 REJECT 位於必要例外之前。

儲存前的規則檢查清單

一份便於維護的設定通常具有清晰的分層:區域網路與精確例外在前,網域後綴和位址範圍居中,GEOIP 靠後,FINAL 收尾。同一目標不應在多個位置反覆出現互相衝突的策略;若確實需要例外,應以「具體規則在前、通用規則在後」來表達,而不是期待後面的規則覆蓋前面。

完成檢查後,應使用至少兩個方向相反的樣本驗證:一個預期 DIRECT,另一個預期 PROXY;若設定包含 REJECT,再增加一個明確的拒絕目標。逐一從規則頂部推演每個樣本的首條命中項,比只觀察連線開關或單次載入速度,更能定位問題。

Shadowrocket 是 Apple 平台的閉源商業應用程式,iPhone 與 iPad 為主要使用裝置;Mac、Apple TV 與 Apple Vision 的相容性及系統要求以 App Store 頁面標示為準。唯一取得入口為 App Store,開發者應顯示為 Shadow Launch Technology Limited,應用程式 ID 為 932747118,購買方式為一次買斷。用戶端買斷與線路服務是不同事項,設定與訂閱由使用者自行準備及管理。

核對正版入口 查看 App Store 取得說明