Shadowrocket 自訂規則設定教學:匹配順序、FINAL 預設策略與 PROXY/DIRECT/REJECT

了解 Shadowrocket 自訂規則的逐行匹配方式、規則順序的影響、FINAL 為何必須置於末尾,以及 PROXY、DIRECT、REJECT 的用途。

本文重點

Shadowrocket(小火箭)的自訂規則會依序檢查,由第一條匹配的規則決定策略;具體例外應置於較廣泛的規則之前,FINAL 則放在 [Rule] 區段末尾。本文適合 iPhone、iPad、Mac、Windows、Android 與 Linux 使用者了解規則檔案;介面操作請以裝置實際顯示為準。閱讀後即可建立最精簡的規則、分辨 PROXY/DIRECT/REJECT,並依序檢查目前使用的設定、運作模式、匹配順序與對外連線,找出問題所在。

1. 先確認 Config 模式,再檢查規則是否生效

連線開關已開啟,不代表自訂規則正在參與流量分流。以下以 iPhone/iPad 介面為例:先在 Config 確認已選取準備編輯的設定檔,再回到 Home 查看 Global Routing。排查本文的規則時應使用 Config;不要先以 Proxy 或 Direct 測試,再據此判定規則有誤。

本文假設你已經有可用的服務設定檔。規則只會決定請求採用哪種處理方式,無法產生連線憑證,也無法修復無法連線的伺服器。本網站不提供、不販售,也不推薦節點或訂閱。修改前請先備份目前的設定檔,避免一次取代所有設定後無從比對。

Global Routing排查時的意義適合用來確認什麼
Config依目前設定檔中的規則決定策略規則順序、例外與 FINAL
Proxy主要使用代理連線,不是用來測試本文逐條規則的模式所選代理連線是否可用
Direct主要使用直接連線目前網路是否可直接連線至目的地
Scene依已設定的場景邏輯運作場景的選取與切換;不作為本文的測試基準
新連線請求 目前設定檔 依序匹配 匹配策略 對外連線

Settings → On Demand 可管理按需連線條件,但不會改變 [Rule] 的規則順序。若網路切換後連線狀態有變化,請先確認 On Demand 設定,再檢查規則;「隧道未連線」和「規則匹配錯誤」是兩種不同問題。

2. 規則語法:類型、匹配值、策略各占一欄

多數規則採用「規則類型,匹配值,策略」的逗號分隔格式,關鍵字與分隔符號都使用英文字符。FINAL 沒有匹配值,直接寫成 FINAL,PROXY 即可。以下是 [Rule] 區段的教學範例,不是包含伺服器、DNS 與其他設定的完整設定檔;請將它加入現有的可用設定檔中核對,不要把它當成可單獨連線的檔案。

[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
5 種
範例使用 DOMAIN、DOMAIN-SUFFIX、IP-CIDR、GEOIP、FINAL
3 種
範例中的策略為 PROXY、DIRECT、REJECT
1 條
FINAL 放在 [Rule] 末尾作為預設策略

example.com 及其子網域用於說明匹配方式;192.0.2.0/24 是文件專用的示範網段,並非可用的服務位址。上述規則僅用來說明語法與順序,不能證明這些位址提供實際服務。測試時請使用自己有權存取的目標,並依實際用途決定是否需要直接連線或拒絕連線。

3. 由上而下匹配:具體例外要排在廣泛範圍之前

規則不會先收集所有匹配項目,再自動挑出「最精確」的一條。針對同一個請求,排在前面的規則會先進行判斷;一旦匹配並決定策略,就不會再由後續的一般規則覆寫結果。因此,即使精確網域比網域後綴更具體,放在後面也不會自動取得較高優先順序。

例外優先:符合預期

第一行
DOMAIN,local.example.com,DIRECT
第二行
DOMAIN-SUFFIX,example.com,PROXY
最後一行
FINAL,PROXY

local.example.com 會先匹配 DIRECT,其他符合網域後綴的請求則使用 PROXY。

範圍優先:例外規則被遮蔽

第一行
DOMAIN-SUFFIX,example.com,PROXY
第二行
DOMAIN,local.example.com,DIRECT
最後一行
FINAL,PROXY

local.example.com 已匹配第一行,後面的 DIRECT 不會改變這次判斷。

結論:先列例外,再列範圍,最後放預設策略

新增規則卻「沒有作用」時,先往上檢查是否有舊規則涵蓋相同目標。將必要的精確例外移到該規則之前,再建立新連線測試;這比反覆切換策略更容易找出原因。

  1. 先明確寫出目標:例如只有 local.example.com 直接連線,其餘 example.com 子網域使用代理。
  2. 先放精確的 DOMAIN 例外,再放 DOMAIN-SUFFIX 範圍;若有拒絕例外,也應依預期的優先順序排列。
  3. 確認是否已有更前面的規則涵蓋目標,包括目前設定檔引入的其他規則。
  4. 儲存後確認仍選取該設定檔;以新連線測試,不要依舊頁面中既有的連線下結論。

4. FINAL 為何必須放在最後?預設策略該怎麼選?

FINAL 沒有額外的匹配條件。如果將 FINAL,PROXY 放在 [Rule] 開頭,前面沒有規則可供篩選,後續的網域或 IP 規則就無法再處理這些請求。同樣地,放在中間也會遮蔽後面的規則。維護時請保留一條明確的 FINAL,並將它放在 [Rule] 區段末尾,而不是任意放在設定檔的其他位置。

[Rule]
DOMAIN,local.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY

此範例的意思是:先處理明確的網域需求,再讓 GEOIP 判斷其餘目的 IP,最後將仍未匹配的請求交給 PROXY。FINAL 不是連線失敗時的備用線路,也不是「上一條代理連線失敗就改用直接連線」的容錯開關。規則選擇 PROXY 後,即使末尾有 FINAL,DIRECT,連線失敗也不會因此自動改用直接連線重試。

預設策略寫法未匹配請求的處理方式修改前請先確認
FINAL,PROXY交由代理策略處理代理出口可用,且符合未知目標的預期連線路徑
FINAL,DIRECT直接連線至目的位址未列出的目標可使用目前網路直接連線
FINAL,REJECT拒絕其他請求已列出所有允許的存取範圍,否則一般服務也可能遭到拒絕

不要只為了暫時開啟網頁就頻繁更改預設策略。先決定未列出的目標應採用哪條連線路徑,再補上必要的例外。將 FINAL 作為清楚的預設策略,有助於規則增加後仍能解釋每次分流結果。

5. PROXY、DIRECT、REJECT 不是三種連線協定

這三個關鍵字代表處理策略,不是協定名稱。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 是連線設定涉及的協定概念;使用 PROXY 並不會自動將目前連線改成某種協定。如果目前設定檔使用自訂策略群組,也要檢查群組名稱及實際選取的對外連線;未定義的群組名稱不能當成可用策略。

策略用途常見誤解
PROXY將匹配的請求交由代理連線處理;請確認目前選取的連線或相關策略設定不會自動選取最快的連線,也不保證伺服器可連線
DIRECT使用目前網路直接連線至目的位址不代表停止所有 VPN,也不代表其他請求都直接連線
REJECT拒絕符合條件的請求不是修復連線,也不是降低優先順序後等待重試

例如,DOMAIN,blocked.example.com,REJECT 會拒絕這個精確網域,不會連帶拒絕所有 example.com 子網域。若要拒絕整個網域範圍,應改用 DOMAIN-SUFFIX,example.com,REJECT;這也會擴大影響範圍,務必確認不會誤擋登入、API 或資源網域。

6. IP-CIDR、GEOIP 與 DNS:不要把網域請求直接當成 IP 請求

網域規則通常會依據請求中的網域進行判斷;IP-CIDR 與 GEOIP 則需要目的 IP 資訊。一個網域可能對應多個位址,位址也可能隨網路、解析結果或服務部署而變動。將某次看到的 IP 固定寫成直接連線規則,未必能涵蓋下次存取,也不能據此斷定整個網域都會採用相同策略。

no-resolve 用於避免只為了匹配這條 IP 規則而主動觸發網域解析。它不是「停用 DNS」,也不代表所有網域請求都能透過這條 IP 規則判斷;若沒有可供判斷的目的 IP,就無法靠它強行判定是否符合網段。

HTTPS 常見的目的連接埠是 443,但本文的 DOMAIN-SUFFIX 規則沒有連接埠條件。它依網域匹配,不限於 443。若某個 API 仍然失敗,請分別檢查目標網域、實際位址、目的連接埠與連線錯誤;不要將應用程式伺服器拒絕連線誤判為規則未匹配。

7. 儲存後如何驗證:一次只改一個變數

驗證時應區分「匹配是否正確」與「所選對外連線能否成功連線」。前者要確認請求被分配到哪種策略,後者則要確認連線是否成功。規則匹配 PROXY 但代理連線失敗,仍可能代表規則順序正確;反過來說,頁面可以開啟也不能證明流量一定採用預期策略。

  1. 保留基準:複製目前可用的設定檔,記錄修改前的 Global Routing、所選連線與要測試的網域。
  2. 一次只改一項:先新增一條精確的 DOMAIN 規則,或只調整兩行的順序;不要同時更改 DNS、連線協定與 FINAL。
  3. 確認選取項目:返回 Config 確認正在使用的設定檔,再到 Home 確認 Global Routing 設為 Config,且連線狀態正常。
  4. 建立新連線:關閉舊頁面後重新發出請求,必要時結束應用程式中既有的連線。已建立的連線可能會繼續使用建立時的路徑。
  5. 檢查記錄:在裝置可查看的連線記錄或日誌中,確認目標、匹配規則與策略;若記錄未顯示所有欄位,可使用暫時的精確規則進行比對,不要自行猜測結果。
  6. 還原並歸檔:若修改造成異常,先還原備份;確認有效後再合併至日常設定檔,並記下規則用途。

新增 DIRECT 規則後,為什麼這個網域仍使用 PROXY?

先確認 Global Routing 是否設為 Config,再確認編輯的設定檔就是目前使用的設定檔。從該 DOMAIN 規則往上檢查是否有 DOMAIN-SUFFIX 或其他規則涵蓋它,將必要的例外移到範圍規則之前,儲存後以新連線再次測試。

FINAL 設為 DIRECT,為什麼代理連線失敗後沒有改用直接連線?

FINAL 只處理未匹配前面規則的請求,不會處理已匹配 PROXY 後發生的連線錯誤。先確認該請求匹配的規則,再檢查目前的代理連線;若服務本身需要直接連線,應新增範圍明確的 DIRECT 規則,而不是依賴連線失敗後改用其他路徑。

更新訂閱後,自訂規則會被覆寫嗎?

先分清 Home 中的連線訂閱更新,與 Config 中的遠端設定檔更新。前者主要更新連線資料,後者則可能重新載入規則內容。編輯前請先儲存本機備份;若需要持續更新遠端設定檔,請先確認更新範圍,不要只在遠端內容上進行一次性的修改。

開啟 On Demand 後,為什麼規則仍然沒有作用?

在 Settings → On Demand 確認自動連線條件,再回到 Home 檢查實際連線狀態與 Global Routing。On Demand 負責決定何時連線,不會自動將運作模式視為 Config,也不會調整規則順序。

日常維護可遵循同一原則:具體例外在前、範圍規則居中、FINAL 放在末尾。遇到問題時先檢查目前的設定檔與匹配記錄,再確認對外連線是否可用;不要用不斷新增重複規則的方式掩蓋尚未查明的連線故障。

下載 Shadowrocket