Shadowrocket(小火箭)的規則並非「越精確就會自動優先」,而是依目前生效的設定順序逐條檢查,由第一條命中的規則決定策略。本文適合已有自己的服務商與訂閱、想調整分流方式的使用者,依序說明 Global Routing、規則排序、三種策略與 FINAL,並提供可供核對的設定片段及驗證步驟。
先確認 Global Routing 使用 Config
若要讓自訂規則參與分流,請先前往 Home → Global Routing → Config,選擇依設定檔處理。只修改 Config 中的規則,卻將 Global Routing 保留在 Proxy 或 Direct,便無法用來確認這些規則是否命中。規則決定「採用哪條路徑」,既有服務資訊則決定該路徑能否連線,兩者應分開檢查。
Config
建議使用依目前生效設定中的規則選擇策略。是否直連、代理或拒絕,取決於實際命中的規則,並非一律依地區區分。
適用情境:日常規則分流、自訂規則驗證。
Proxy
將由 Shadowrocket 處理的連線送往目前的代理路徑,不逐條依照 Config 中的分流規則選擇策略。
適用情境:暫時確認既有代理路徑能否連上目標。
Direct
將由 Shadowrocket 處理的連線直接送往目標,不採用設定中的代理分流結果。
適用情境:對照目標在目前網路下的直連狀況。
Global Routing 中的 Scene 可依場景設定決定處理方式,不應直接視為 Config 的同義詞。為減少排查變因,本文統一使用 Config。Settings → On Demand 管理按需連線的觸發條件,與規則清單中哪一列優先無關;排查排序時,請先維持連線狀態及目前網路不變。
由上而下比對:明確例外排在適用範圍較廣的規則之前
一般規則清單會從第一條開始檢查請求,命中後採用該條規則的策略,不再繼續尋找「更明確」的後續規則。因此,若精確的 DOMAIN 規則排在已涵蓋該網域的 DOMAIN-SUFFIX 之後,仍可能沒有生效的機會。排序依據是執行順序,而非字串長度。
[Rule]
DOMAIN,metrics.example.com,REJECT
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
以上為語法範例;example.com 及其子網域僅用於說明比對方式,並非連線服務或可用性測試位址。第一條只處理 metrics.example.com;第二條為 login.example.com 設定直連例外;第三條涵蓋 example.com 本身及其子網域;先前均未命中的請求會繼續比對 GEOIP,最後交由 FINAL 處理。
| 請求網域 | 首次命中 | 策略 |
|---|---|---|
metrics.example.com | 第 1 條 DOMAIN | REJECT |
login.example.com | 第 2 條 DOMAIN | DIRECT |
docs.example.com | 第 3 條 DOMAIN-SUFFIX | PROXY |
若將 DOMAIN-SUFFIX,example.com,PROXY 移到最上方,表中的三個網域都會先命中這條規則,後面的拒絕與直連例外便不會生效。需要優先阻擋或放行的明確目標應排在前面,涵蓋範圍較大的後綴、位址範圍與地區規則接著排列,兜底規則則放在最後。
PROXY、DIRECT、REJECT 與規則關鍵字的差異
一條規則通常同時包含「比對條件」與「處理策略」。例如 DOMAIN-SUFFIX,example.com,PROXY 中,DOMAIN-SUFFIX 是規則類型,example.com 是比對內容,PROXY 則是命中後的處理方式。協定名稱與策略並非同一層概念:既有連線使用 Shadowsocks 或 VLESS,不會改變 DOMAIN-SUFFIX 的比對順序。
判斷方式:分開檢查條件與出口
先確認請求是否命中預期規則,再確認該策略指向的路徑能否使用;不要以「代理連線成功」取代「規則比對正確」的驗證。
| 策略 | 實際意義 | 檢查重點 |
|---|---|---|
PROXY | 使用代理路徑。 | 確認目前選用的代理;若使用策略群組,也要檢查群組內的選項。 |
DIRECT | 直接連線至目標。 | 目前網路是否能直接連上目標。 |
REJECT | 拒絕符合條件的連線。 | 確認目標是否確實應被阻擋,以及是否誤擋必要請求。 |
若設定中有自訂名稱的策略群組,請依實際設定核對群組名稱及群組內的選項,不要任意把未知名稱當成內建策略。REJECT 也不是連線失敗時自動重試的策略;命中後,即使連線失敗,請求也不會繼續嘗試下方的 PROXY。
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP-CIDR 依目標 IP 所屬的位址範圍比對;192.0.2.0/24 是文件範例位址範圍。no-resolve 用來避免只為這條 IP 規則額外進行網域解析,不代表關閉所有 DNS;已有的目標 IP 資訊仍可能參與比對。GEOIP,CN,DIRECT 依據 IP 地理資料庫判斷,不會參考網域後綴或營運者所在地,因此無法保證涵蓋所有希望直連的網站。
FINAL 兜底:只處理前面未命中的請求
FINAL 不需要網域或位址參數,常見寫法為 FINAL,PROXY 或 FINAL,DIRECT。這是無條件兜底規則,因此應放在一般規則清單末尾。若將它放在前面,後續規則便無法處理剩餘請求;放兩條 FINAL,也不會形成「第一條失敗後再試第二條」的容錯流程。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
- 選擇 FINAL,PROXY:未被前面規則明確處理的請求將使用代理路徑。請確認既有代理可正常使用,並接受這部分流量經由該路徑傳送。
- 選擇 FINAL,DIRECT:未命中的請求將直接連線。適合已明確列出需要代理的目標,並希望其他請求都直連的設定。
- 不要漏掉策略欄位:單獨寫 FINAL 並非本文採用的完整規則格式;儲存前請核對逗號與策略名稱。
- 不要混用中文標點:設定片段使用英文逗號,避免將說明文字貼進規則參數。
FINAL 用來處理「前面沒有任何規則命中時該怎麼辦」,不是用來處理「前面已命中但連線失敗時該怎麼辦」。若請求已由 DIRECT 規則處理,即使直連逾時,也不能期待末尾的 FINAL,PROXY 自動接手。此時應檢查前面的比對條件是否過於寬泛,再決定要調整順序或修改策略。
修改與驗證:一次只調整一條規則
開始前,先儲存目前設定的副本,並記下正在使用的設定名稱。Home 中的訂閱用來維護既有服務資訊,Config 中的規則則負責分流;重新整理 Subscribe 不代表規則已修改。遠端設定更新也可能取代編輯內容,因此請區分「更新既有訂閱」與「更新規則設定」,並在操作後重新確認生效中的檔案。
-
確認路由模式
前往 Home → Global Routing → Config。確認既有連線可正常使用,並記下目前選用的代理或策略群組選項,避免測試期間同時更換出口。
-
備份目前設定
前往 Config,確認目前使用的設定,先儲存副本,再開啟該設定的編輯功能。若以文字方式編輯,請找到 [Rule] 區段。
-
加入明確規則
將要驗證的 DOMAIN 或 DOMAIN-SUFFIX 放在可能涵蓋它的寬泛規則之前。末尾保留一條 FINAL,儲存後確認正在使用剛修改的設定。
-
重新建立測試請求
停止目標 App 中尚未完成的舊請求,再重新發起連線。必要時,儲存設定後重新連線 Shadowrocket,避免將修改前已建立的長連線誤當成新規則的測試結果。
-
確認命中結果
根據請求記錄中可見的目標網域、目標 IP 與策略資訊進行判斷。每次只修改一項,並記錄修改前後的結果;若未命中預期規則,先檢查順序,不要立刻更換協定。
網頁通常會同時請求主頁、登入、圖片及介面等多個網域。主頁命中 PROXY,不代表所有資源都命中同一條規則。排查「首頁能開、登入失敗」時,應針對失敗請求的實際網域檢查,而非只為瀏覽器網址列中的網域新增例外。
判斷規則是否生效,應查看新請求的比對結果與策略;延遲測試只能顯示特定測試路徑的回應狀況,無法證明某個網頁請求已命中指定規則。
常見問題:依現象排查規則未生效
明明設定了 DIRECT,為什麼還是走代理?
先前往 Home → Global Routing 確認目前選擇的是 Config,再檢查 DIRECT 規則上方是否有涵蓋相同網域的 DOMAIN-SUFFIX 或其他寬泛規則。將明確例外移到涵蓋規則之前,儲存後重新發起請求。
修改 FINAL 後,目標還是無法開啟?
先確認請求是否真的命中 FINAL。若已命中前面的 REJECT 或 DIRECT,修改 FINAL 不會產生影響。若確實命中 FINAL,PROXY,請再檢查使用中的代理路徑、目標服務與 DNS 解析結果。
規則中有網域,直接連 IP 卻沒有命中?
DOMAIN 與 DOMAIN-SUFFIX 需要可用的網域資訊。直接連線至 IP 不等於連線至相同網域;若要依位址比對,請新增範圍合適的 IP-CIDR。不要只為處理單一目標,就加入涵蓋範圍過大的位址區段。
更新後,剛新增的規則怎麼不見了?
在 Config 檢查目前使用的檔案及其內容,確認是否切換了設定或更新了遠端設定。比對備份中的 [Rule] 區段,還原必要的例外並檢查 FINAL 的位置;不要把 Home 中既有訂閱的重新整理結果,當成規則已儲存的證明。
最後保留一份容易理解的精簡規則清單:明確例外排前面,範圍規則放中間,FINAL 放在末尾。發生異常時,先確認 Global Routing 與目前設定,再追查具體請求。如此可分開處理排序錯誤、出口無法連線與 DNS 問題,避免不斷新增重複規則,反而更難找出原因。