適合已在 Shadowrocket(小火箭)匯入自己的設定檔,並需要調整特定網域流向的讀者。以下透過可核對的規則範例,說明逐條比對、三種常見策略與 FINAL 兜底,並列出規則未如預期生效時的檢查順序。
先確認規則模式:Config 與逐條比對
在 Home 查看 Global Routing。選擇 Config 時,連線會依目前設定檔中的規則處理;選擇 Proxy 或 Direct,則會採用相應的全域路由模式,不適合用來驗證單一自訂分流規則。Scene 是另一種依情境選擇路由的模式,也不能和 Config 下的逐條規則測試混為一談。開始排查前,記下目前使用的設定檔及所選代理,避免修改的是一個檔案,測試的卻是另一個。
規則的基本讀法是:從清單頂端開始,逐行檢查請求是否符合條件;一旦命中,就採用該行指定的策略,不再比對後續規則。網域後綴、目標 IP 所屬網段與地理位置是不同的判斷條件,不應只憑名稱猜測優先順序。同一個請求若可能符合多行條件,結果由排在前面的命中規則決定。
規則一行怎麼寫:條件、目標與策略
常見規則以英文逗號分隔欄位。DOMAIN-SUFFIX,example.com,PROXY 表示網域為 example.com 或以 .example.com 結尾時,使用 PROXY;GEOIP,CN,DIRECT 表示符合該 IP 地理位置條件時,使用 DIRECT。這裡的 example.com 是文件中的示例網域,不代表必須匯入的服務位址。編輯時請保留關鍵字、逗號及策略名稱的英文寫法,不要在規則中混用中文標點。
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-SUFFIX,ads.example.com,REJECT
IP-CIDR,192.0.2.0/24,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY
上述五行是用來示範結構,並非建議直接取代現有設定。192.0.2.0/24 是文件示例網段:IP-CIDR 斜線後的數字代表前綴長度,實際編輯時應填入自己確實需要比對的目標網段。REJECT 代表拒絕符合條件的請求;DIRECT 代表不經所選代理直接連線;PROXY 則代表交由目前設定所指向的代理路徑處理。DIRECT 能否連上目標,仍取決於目前網路及目標本身是否可連線。
網域與位址條件
- DOMAIN-SUFFIX
- 比對指定網域及其子網域
- IP-CIDR
- 比對指定的目標 IP 網段
- GEOIP
- 依目標 IP 的地理位置條件比對
網域條件與 IP 條件檢查的對象不同,調整前請先確認請求實際連線的目標。
策略與兜底
- PROXY
- 交由所選代理路徑處理
- DIRECT
- 直接連線至目標
- REJECT
- 拒絕此請求
- FINAL
- 為先前未命中的請求指定策略
策略寫在條件之後;FINAL 不必再填寫網域或網段。
先列特例,再列廣泛條件
假設要 REJECT ads.example.com,而其他 example.com 網域走 PROXY,就必須把較具體的子網域規則放在範圍較廣的後綴規則之前。若依照上一段程式碼的順序排列,對 ads.example.com 的請求會先命中第一行 DOMAIN-SUFFIX,example.com,PROXY,根本不會檢查第二行的 REJECT。規則名稱看起來比較精確,不會讓後面的規則自動提前比對。
- 在 Config 開啟目前使用的設定檔,找到要修改的規則區段,並保留修改前的規則文字以供比對。
- 將只適用於
ads.example.com的規則,放在example.com後綴規則上方;儲存後再次確認清單中的排列順序。 - 讓 Global Routing 維持在 Config,重新發出目標請求,再查看 App 內的連線記錄,核對目標與實際採用的策略。
DOMAIN-SUFFIX,ads.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
網段也適用相同原則:若較小的 IP-CIDR 範圍需要 DIRECT,而涵蓋它的較大範圍需要 PROXY,應先列出較小範圍。調整順序時,只移動確實有重疊的規則,不要為了單一網域問題大幅重排整份設定。測試時也應發出新請求;已建立的連線無法可靠地用來判斷剛儲存的規則順序。
判斷順序:先找第一條可能命中的規則
結果不如預期時,從清單頂端開始,找出同樣可能涵蓋目標的規則;先調整這條規則與目標規則的相對位置,再考慮變更策略。
FINAL 為什麼要放在最後
FINAL,PROXY 會為前面所有規則都未命中的請求指定 PROXY。它的用途是收尾,而不是提高 PROXY 的優先順序。由於 FINAL 不限定特定網域或網段,若放在需要檢查的具體規則之前,後續規則便沒有比對機會。若希望未分類的請求直接連線,可依自己的設定目標使用 FINAL,DIRECT;兩種寫法沒有適用所有網路環境的絕對優劣,重點是明確指定未命中流量的去向。
- 特定目標:先列出需要個別處理的網域或 IP-CIDR;條件重疊越明確,越容易核對順序。
- 較廣範圍:接著列出通用網域後綴、GEOIP 等條件,確認它們是否會提前涵蓋特例。
- 最後一行:以 FINAL 為其餘請求收尾;若變更兜底策略,也要一併重新測試未列出專屬規則的目標。
例如清單只有 DOMAIN-SUFFIX,example.com,DIRECT 和 FINAL,PROXY 時,符合該後綴的請求會走 DIRECT,其他未命中的請求則走 PROXY。若在兩行之間加入 GEOIP,CN,DIRECT,只有符合此條件、且未先命中網域規則的請求才會交由 GEOIP 行處理。逐行說明結果,比只說「中國大陸直連、其他走代理」更精確,因為清單前面可能還有其他命中條件。
儲存規則後未如預期生效:依序排查
先區分「規則沒有被套用」與「選定的路徑無法連線」。前者應檢查 Global Routing、目前使用的設定檔及排在前面的規則;後者則要確認所選代理或直連路徑是否可用。Shadowrocket 負責處理規則,但規則本身無法讓原本連不上的目標變得可連線。如果使用者已有自己的服務商與訂閱,也應確認目前使用的設定及連線資訊,與準備測試的對象一致;排查時不必更換訂閱來源。
- 回到 Home,確認 Global Routing 設為 Config,並確認正在編輯的設定檔就是目前使用的設定檔。
- 從清單第一行往下檢查可能命中目標的條件,尤其留意範圍較廣的 DOMAIN-SUFFIX、IP-CIDR 與 FINAL 是否排在目標規則之前。
- 核對請求實際使用的網域或目標 IP。網頁可能同時向多個網域發出請求;測試頁面顯示異常,不代表對應頁面主網域的規則未命中。
- 儲存修改後發起新連線並查看 App 內的記錄;若已命中 PROXY 仍無法連線,再分別檢查所選代理及目標是否可連線。
已設定 REJECT,為什麼請求還是走 PROXY?
從清單頂端檢查前面是否有涵蓋該目標的 DOMAIN-SUFFIX 或 FINAL。將具體的 REJECT 規則移到範圍較廣的規則之前,儲存後以新請求重新測試。
修改 FINAL 後,指定網域的流向為什麼沒變?
FINAL 只處理先前未命中的請求。先找出該網域在 FINAL 之前命中的第一行;若要改變流向,請檢查該行的策略或位置。
設定 GEOIP,CN,DIRECT 後,為什麼有些網頁仍走 PROXY?
先核對該連線對應的目標及前面的規則。GEOIP 判斷的是目標 IP 的地理位置條件,而非網頁使用的語言;若請求先命中網域規則,就不會繼續檢查 GEOIP。
切換到 Proxy 後,要如何驗證剛寫的規則?
先將 Home 的 Global Routing 切回 Config,確認目前使用的設定檔,再發出新請求。Proxy 全域模式下的連線結果,無法證明 Config 中的特定規則已命中。
若要排查訂閱帶入的規則,先確認本機編輯的位置,以及訂閱更新後的設定內容。更新可能會改變目前使用的規則文字,重新測試前應再次確認目標規則是否仍存在、順序是否正確。若採用 PROXY 策略,也要分開確認規則是否命中,以及代理連線是否正常:命中只代表請求已分配至該路徑,不保證該路徑當下可用。