本文重點

在 Shadowrocket(小火箭)中,自訂規則應先列出明確例外,再列適用範圍較廣的條件,最後才放 FINAL。本文適合已有可用設定檔、想調整流量分流的使用者:先確認 Global Routing 與目前使用的 Config,再參考範例理解語法,並透過新連線確認實際命中結果。涉及 PROXY 的操作,均以使用者已有自己的服務商與訂閱為前提。

一、先確認 Config 正在使用,再檢查規則順序

規則文字成功儲存,不代表目前連線正在使用這份設定。先在 Home 確認 Global Routing;若要依本文逐條規則分流,應選擇 Config,再到 Config 確認目前使用的設定檔。編輯未啟用的其他檔案,不會影響現用設定的匹配結果。

Global Routing 中的 Proxy、Direct、Config、Scene 是路由模式,不是四種規則關鍵字。Proxy 與 Direct 分別代表全域代理與全域直連;Config 依目前設定檔分流;Scene 則用來依情境安排路由行為,排查時也要確認實際的情境設定。請勿混淆路由模式與規則行末的策略。

  1. 在 Config 中保留目前設定檔的副本,並記下正在使用的設定檔名稱。
  2. 前往 Home → Global Routing 選擇 Config,確認不是在其他路由模式下檢視規則。
  3. 返回 Config,編輯目前選用的設定檔並儲存,然後重新發起測試請求。
  4. 查看 App 內連線記錄中的目標與策略;若仍沿用舊連線,先結束該連線再測試。

二、由上而下匹配:命中後不會再尋找「更具體」的規則

常見規則會依清單順序逐條檢查,由第一條符合的規則決定策略;後續規則不會為同一個請求重新排序。Shadowrocket 不會因為後面的網域更長,就自動將它移到前面。設定檔作者應將例外規則放在涵蓋範圍較廣的規則之前。

請求目標 第一條規則 逐條檢查 命中策略 執行出站

例如,先寫 DOMAIN-SUFFIX,example.com,PROXY,再寫 DOMAIN,api.example.com,DIRECT,對 api.example.com 的網域匹配會先命中第一條。若要讓這個子網域直連,應將 DOMAIN 那一行移到前面。以下網域僅用於說明語法,不代表有可用服務。

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

結論:先移動例外規則,再新增重複規則

網域沒有依預期分流時,先檢查它上方是否已有涵蓋該網域的規則;在清單末尾重複新增相同目標,通常無法改變先前的匹配結果。

三、規則語法:分清匹配條件與策略

多數常見規則採用以逗號分隔的「類型、匹配值、策略」格式。FINAL 是特殊的預設規則,不需要匹配值。建議使用英文逗號,每行只寫一條規則,也不要將整段設定貼進單一匹配值欄位。

規則範例匹配對象確認要點
DOMAIN,api.example.com,DIRECT完整網域只匹配該網域,不包含其所有子網域。
DOMAIN-SUFFIX,example.com,PROXY網域後綴涵蓋 example.com 及其子網域,不是比對任意包含該文字的內容。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolveIPv4 網段匹配指定的 IP 位址範圍;no-resolve 不會為此 IP 規則主動觸發網域解析。
GEOIP,CN,DIRECTIP 地理位置依據所使用的地理資料庫判斷,網域後綴不能作為 IP 地理位置的依據。
FINAL,PROXY前面的規則都未命中作為最後的預設策略;選用 PROXY 時,必須具備可用的代理出站條件。

網域規則不填寫通訊協定前綴、網頁路徑或連接埠。例如,目標網址包含 HTTPS、路徑與 443 連接埠時,DOMAIN 的匹配值仍只填主機名稱;若要依連接埠分流,應使用對應的連接埠規則,而不是把 :443 接在網域後面。

3 個欄位
常見規則的基本欄位:類型、匹配值、策略
2 個欄位
FINAL 的基本欄位:關鍵字、預設策略
443
HTTPS 常用連接埠,不屬於 DOMAIN 匹配值

四、DOMAIN-SUFFIX、IP-CIDR、GEOIP 如何排列

沒有適用於所有設定檔的固定類型順序;需要遵守的是「例外規則要放在涵蓋它的規則之前」。一般可先列出精確網域例外,再列網域後綴、指定網段、範圍較廣的 GEOIP,最後放 FINAL。若某個網段必須優先處理,也可將它往前移,但要清楚它可能涵蓋哪些請求。

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

這段範例只示範規則順序,不應直接取代完整設定檔:api.example.com 作為直連例外,排在後綴規則之前;metrics.example.com 作為拒絕例外,也放在前面;其餘 example.com 子網域則使用 PROXY。192.168.0.0/16 這一行只涵蓋指定的私有網段,不代表所有區域網路位址。

no-resolve 不代表整個 App 停止 DNS 解析,也不保證這條規則永遠不會匹配網域請求。它限制的是為匹配此 IP 類規則而主動觸發解析;若目標本身就是 IP,或解析流程中已有可用位址,仍應依實際記錄判斷。

五、FINAL 應選 PROXY、DIRECT 還是 REJECT?

FINAL 決定「尚未明確分類的請求」要如何處理,不是連線失敗後的重試開關。若前面的規則已命中 PROXY,即使代理連線失敗,也不會因此繼續套用 FINAL。需要備用出站時,應檢查對應策略組的行為,而不是依賴末尾的預設規則接手失敗請求。

預設規則寫法未匹配請求的處理方式使用前確認
FINAL,PROXY交由代理出站。使用者已有的代理可正常使用;需要直連的目標已在前面的規則中明確列出。
FINAL,DIRECT直接連線至目標。需要代理的目標已由前面的規則涵蓋;其餘目標可接受直接連線。
FINAL,REJECT拒絕其他請求。已建立足夠完整的允許規則,並能排查登入、圖片與 API 遺漏的情況。

DIRECT 仍可能經由系統建立的 VPN 通道處理,但其出站策略是不使用代理伺服器;這不等於關閉 Shadowrocket。REJECT 則是在規則層拒絕請求,不會自動判斷請求是否「有用」。若同一網域承載多種功能,拒絕整個網域可能連正常功能也一併影響。

結論:依未分類流量的預期選擇預設策略

先列清楚哪些目標必須設為例外,再決定其餘請求的處理方式;不要只為了消除一次錯誤,就在三種策略之間反覆切換 FINAL。

六、修改後如何驗證與還原

驗證時應同時查看目標、命中的規則與出站策略,不能只憑網頁「開得起來」就認定設定正確。瀏覽器快取、既有長連線,以及網頁中多個不同網域的請求,都可能讓表面現象與新規則的實際作用範圍不一致。

  1. 保留基準設定:修改前先儲存原設定檔,記下一個可正常存取的目標與目前的路由模式。
  2. 縮小變更範圍:每次只調整一條規則或一個順序,儲存後確認目前 Config 仍選用該檔案。
  3. 建立新連線:關閉測試頁面後重新開啟;必要時結束相關 App 的舊連線,再重新發起請求。
  4. 檢查記錄:在 App 內的連線記錄中找到實際主機名稱或 IP,確認匹配規則與最終策略,不要只看網站的主網域。
  5. 還原基準設定:發生異常時,撤銷剛才新增的規則,或重新選用先前保留的設定檔,再以相同目標重新測試。

若設定檔來自遠端內容,也要確認更新後是否覆蓋本機修改。服務位址清單更新與 Config 規則檔更新並非同一件事,應分別確認更新項目。需要長期保留的自訂規則,應儲存在自己能管理並可還原的設定檔中。

七、自訂規則常見問題

已設定 DIRECT,為什麼流量還是走 PROXY?

先前往 Home → Global Routing 確認目前使用 Config,再到 Config 確認編輯的是現用檔案。接著檢查 DIRECT 上方是否有涵蓋相同目標的 DOMAIN-SUFFIX 或其他規則,將明確例外移到前面,再透過新連線重新測試。

把 FINAL 放在最前面會怎樣?

FINAL 會作為預設規則,處理到達該位置的請求,導致後面的具體規則無法發揮預期作用。請將它移到規則區段的末尾,只保留一條明確的最終預設規則,再檢查上方條件是否涵蓋需要特別處理的目標。

加入 REJECT 後,為什麼登入和圖片一起出問題?

確認遭拒絕的網域是否同時提供登入、圖片或 API 請求。先撤銷剛加入的 REJECT,還原基準設定,再依據連線記錄縮小匹配範圍。DOMAIN-SUFFIX 拒絕的是整組網域,不是單一網頁路徑。

GEOIP 沒有依網站所屬地區匹配,是規則失效了嗎?

不一定。GEOIP 判斷的是請求目標 IP 在資料庫中的歸屬,不是營運主體所在地。先確認實際解析位址與命中記錄;若要固定處理某個網域,可在 GEOIP 之前加入明確的網域規則。