本文適合已在 Shadowrocket 匯入自己的既有訂閱,並準備修改 Config 的使用者。先確認 Global Routing 設為 Config,再分清規則條件與執行策略;透過可核對的規則片段,了解完整網域、網域後綴、IP 網段與 FINAL 的排列方式。最後以單一變數測試,找出「未命中」和「命中後仍失敗」這兩種不同問題。
先確認 Global Routing,再修改 Config
Shadowrocket 的 Home 用於連線及選擇既有服務,Config 用於管理設定檔,Settings 則是應用程式設定。訂閱項目提供可用的連線參數,不等於目前設定檔中的規則。更新既有訂閱,不代表編輯的規則已啟用;儲存設定檔,也不代表 Home 目前正使用該檔案進行分流。
請從 Home → Global Routing 進入檢查。本文討論的是 Config 模式下的規則判定,不是把 Proxy 或 Direct 當成規則。Global Routing 中也會看到 Scene,這與情境選擇有關。排查本文提到的靜態規則時,請先切換至 Config,避免場景變化帶來額外變數。
Config
建議依目前生效設定中的規則選擇策略。本文的 DOMAIN-SUFFIX、IP-CIDR 與 FINAL 範例皆以此為前提。
適用情況:逐條驗證自訂規則與最終後備規則
Proxy
以代理模式處理流量,而非依本文的自訂規則逐條選擇 DIRECT 或 REJECT。可用此模式作為檢查代理連線是否可用的對照條件。
適用情況:暫時排除規則分流因素
Direct
以直連模式處理流量。若維持此模式,便不能依據連線結果判斷 Config 中的 PROXY 規則是否有效。
適用情況:確認透過本地網路直接連線時的結果
規則列語法:條件在前,策略在後
常見規則以英文逗號分隔欄位,並寫入設定中的 [Rule] 區段。網域規則通常依序填入「類型、比對內容、策略」;FINAL 沒有比對內容欄位,直接寫成「FINAL、策略」。不要把全形逗號或說明文字貼進規則列,也不要為了追加幾條規則,就在同一個檔案中重複建立多個 [Rule] 區段。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
FINAL,PROXY
此處的 example.com 是文件範例網域,192.168.50.0/24 是私有網段範例,並不代表你的網路實際使用這個網段。這段內容用來說明欄位結構與順序,不是建議取代現有設定的通用規則集。
| 關鍵字 | 條件範例 | 檢查要點 |
|---|---|---|
DOMAIN | api.example.com | 比對完整網域,不會一併涵蓋其他子網域。 |
DOMAIN-SUFFIX | example.com | 比對該網域及其子網域,不必加上萬用字元星號。 |
IP-CIDR | 192.168.50.0/24 | 比對目標 IPv4 位址所屬網段,不會依網域文字比對。 |
GEOIP | CN | 依目標 IP 在地理資料庫中的歸屬判定,不依網頁內容判定。 |
FINAL | 無條件欄位 | 接收前面所有規則都未命中的請求,必須放在規則清單最後。 |
DOMAIN-SUFFIX 比對的是網域邊界,不是任意字串包含。例如 example.com 可涵蓋 www.example.com,但不應視為涵蓋 notexample.com。規則中也不填寫 https://、頁面路徑或查詢參數;這些都不是網域欄位的一部分。
比對順序:先列例外,再列較廣範圍
規則並非「後寫的會覆蓋先寫的」,也不會自動優先比對範圍最廣或最精確的項目。每當請求需要進行規則判定時,Shadowrocket 都會由上而下檢查,並採用第一條命中規則的策略。因此,精確例外必須放在涵蓋範圍較廣的規則之前。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
GEOIP,CN,DIRECT
FINAL,PROXY
api.example.com:第一行網域規則已命中,採用 PROXY,不會再由後面的後綴規則改為 DIRECT。www.example.com:未命中第一條規則,命中第二條,採用 DIRECT。- 其他目標:繼續檢查 GEOIP;若不符合條件,最後採用 FINAL 的 PROXY。
若將 DOMAIN-SUFFIX 放在 DOMAIN 前面,api.example.com 會先命中後綴規則,後面的精確例外便不會執行。同樣地,若將涵蓋範圍廣的規則集放在本地例外之前,也可能使例外失效。排查時必須一併檢查前面的規則,不能只確認目標項目「有列出」。
PROXY、DIRECT、REJECT 與 FINAL 的用途
規則類型回答「比對什麼」,策略回答「命中後如何處理」。PROXY、DIRECT、REJECT 是本文使用的策略;FINAL 則是沒有額外比對條件的後備規則類型。區分這兩組概念,就不會把 FINAL 誤認為新的傳輸協定。
PROXY- 將命中的請求交由代理路徑處理。實際連線目標仍須確認目前的選擇及設定中的策略關係;寫上 PROXY 不會自動產生可用服務,也無法修正錯誤的驗證參數。
DIRECT- 透過目前的網路直接連線至目標,不經代理路徑。直連仍取決於本地網路、DNS 與目標服務是否可連線,不代表可以略過所有網路限制。
REJECT- 拒絕符合條件的請求。適合用來測試封鎖明確不需要的目標;若範圍過廣,可能連登入、圖片或應用程式介面一併影響,務必保留還原方式。
[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
此範例先拒絕 blocked.example.com,再讓相同後綴下的其他網域直連,其餘請求則交由 PROXY 處理。若將 FINAL 移到第一行,所有會進入這段規則的請求都會先被它接收,後面的網域規則便無法參與判定。
IP-CIDR、GEOIP 與 DNS:釐清位址的來源
網域條件與 IP 條件使用的資訊不同。DOMAIN-SUFFIX 關注網域,IP-CIDR 和 GEOIP 則關注目標位址。對於只有網域、尚未取得可用目標 IP 的請求,IP 類規則可能需要進行 DNS 解析;網域規則未命中,不應直接歸因於網段寫錯。
IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
IP-CIDR,192.168.50.10/32,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
上面兩條 IP-CIDR 刻意用來說明網段與單一位址的差別:第一條已涵蓋 192.168.50.10,若採用相同策略,通常不必保留第二條。若要對這個單一位址設定不同策略,應將 /32 例外移至 /24 規則之前,而不是加在後面。
no-resolve表示不會只為這條 IP 規則額外觸發網域解析;這不等於停用整個應用程式的 DNS,也不表示請求從此沒有目標 IP。- 若請求已取得可用的目標 IP,仍可依該位址判斷網段。若尚未取得位址,且規則不會觸發解析,就不能期待這條規則透過網域完成 IP 比對。
GEOIP,CN,DIRECT依據 IP 地理歸屬資料庫判定。CDN 調度、DNS 回應及資料庫歸屬都會影響結果,中文頁面不是比對條件。- 透過網域連線時,也要留意 IPv6。IPv4 的 IP-CIDR 項目不會自動涵蓋 IPv6 位址;若發現目標使用 IPv6,請另外檢查適用的 IPv6 規則。
規則只能使用實際可取得的請求資訊。如果應用程式直接連線至 IP,且沒有可關聯的網域資訊,網域規則未必能命中。排查時記錄實際目標網域或位址,比繼續疊加範圍寬泛的 DOMAIN-SUFFIX 更有幫助。
修改與驗證:每次只變更一項條件
先保留目前可用的設定,再進行小幅修改。請區分遠端設定與本機副本:遠端內容更新可能會覆蓋本機修改;更新既有訂閱通常只會處理連線項目,不能以更新成功作為自訂規則已生效的證明。測試前也應確認既有代理連線本身可正常使用。
-
保留原始檔案
進入 Config,確認目前使用的設定,並保留一份可還原的副本。若要修改遠端來源的內容,請先使用可編輯的本機副本,以免下次更新覆蓋測試規則。
-
編輯規則區段
在 Config 中開啟待測檔案的編輯內容,找到 [Rule]。將單一精確網域例外放在對應的後綴規則之前,確認 FINAL 仍位於最後,儲存後選用該設定。
-
確認分流設定
返回 Home → Global Routing → Config。確認目前的代理選擇,避免 Proxy、Direct 或 Scene 的其他行為影響這次規則測試。
-
重新建立請求
關閉目標頁面後重新開啟,必要時重新建立連線,減少重用既有長連線造成的干擾。每輪只調整一條規則的順序或策略,不要同時更換 DNS 與代理參數。
-
記錄並還原
記錄目標、命中的規則、採用的策略與連線結果。搭配目前可用的請求記錄核對;若結果不如預期,還原原始設定,再以相同目標重新測試。
測試記錄應區分「實際觀察」與「預期行為」。例如,暫時將自己管理的測試網域設為 REJECT,預期相關請求會被拒絕;若頁面仍顯示內容,請先排除快取、其他網域及既有連線的影響,不要因此斷定整套規則失效。本文的規則片段不代表已在你的網路中取得任何測試結果。
常見問題:根據命中結果找出原因
新增 DOMAIN 後仍走 DIRECT,可能是哪裡設定錯誤?
先在 Home → Global Routing 確認已選擇 Config,再到 Config 確認實際使用的檔案。接著往上檢查是否有更早命中的 DOMAIN-SUFFIX、IP 類規則或規則集;將精確例外放在涵蓋它的規則之前,儲存後重新發出請求。
FINAL 設為 PROXY,為什麼部分請求仍然直連?
FINAL 只會接收未命中前面規則的請求。先檢查目標是否已命中 DIRECT 項目,例如 DOMAIN-SUFFIX 或 GEOIP;不要將 FINAL 移到最前面。請修改實際命中的項目,或在其前面新增範圍較小的例外。
命中 PROXY 但無法開啟,還需要調整順序嗎?
命中結果已是 PROXY 時,請優先確認目前的代理、驗證資訊、目標連接埠與 DNS。可暫時使用 Home → Global Routing → Proxy 作為對照;測試結束後恢復 Config。策略執行失敗與規則未命中是兩種不同的排查方向。
一條 REJECT 導致整個應用程式異常,該如何還原?
在 Config 中刪除剛新增的項目,或還原備份後重新建立連線。接著依實際請求的網域縮小比對範圍,優先使用 DOMAIN 測試單一目標;不要直接封鎖共用後綴或範圍寬泛的網段。
最後請按固定順序核對:目前設定是否正確、Global Routing 是否設為 Config、第一條實際命中的規則是什麼,以及該策略能否執行。完成這四項後,再考慮擴大規則範圍。如此可保留明確的還原方式,也能避免用大量重複規則掩蓋設定選擇或連線參數問題。