本文適合已在 Shadowrocket(小火箭)設定好自己現有服務,並準備調整規則分流的使用者。請先確認 Global Routing 設為 Config,再區分網域規則與 IP 規則,最後透過命中記錄確認順序。文中的設定片段僅用於說明語法,不能取代完整設定,也不提供節點或訂閱。
先確認規則是否參與路由
規則決定某條連線採用哪種策略,不會建立可用的代理服務。即使已寫好 DOMAIN-SUFFIX,example.com,PROXY,仍須有可用的代理設定。本文以使用者已有自己的服務商與訂閱為前提,重點在檢查設定中的 [Rule] 區段。
在 Home → Global Routing 中,Proxy、Direct、Config、Scene 是不同的運作方式。Proxy 與 Direct 適合用於臨時比對測試;若要驗證目前設定中的規則,應選擇 Config。Scene 用來依情境切換路由行為,不能只因畫面顯示 Scene,就判定某份規則正在生效。
-
備份設定
進入 Config,確認目前使用的設定檔,並先儲存一份副本。記下原本選取的 Global Routing,避免測試後無法還原。
-
選擇規則模式
返回 Home → Global Routing → Config。接著確認 Config 中啟用的檔案,就是準備修改的那一份。
-
修改單一規則
在 Config 中開啟該檔案的編輯功能,找到
[Rule],每次只新增或調整一條規則。保留其他既有設定區段。 -
儲存後驗證
儲存設定、重新建立測試連線,並查看連線記錄中的目標、命中規則與採用的策略。如果仍沿用舊連線,請先關閉相關頁面再重新造訪。
網域規則:完整比對、後綴比對與子字串比對
常見規則依「類型、比對值、策略」書寫,欄位之間以英文逗號分隔。網域比對值只填主機名稱,不含 https://、路徑、查詢參數或連接埠。造訪 https://api.example.com:443/v1 時,網域規則處理的是 api.example.com,而不是整段網址。
| 關鍵字 | 範例 | 比對範圍 |
|---|---|---|
DOMAIN | DOMAIN,api.example.com,PROXY | 只比對 api.example.com,不包含其子網域。 |
DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,DIRECT | 比對 example.com 及其子網域,不比對 notexample.com。 |
DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,PROXY | 比對網域中包含 example 的目標,涵蓋範圍比後綴規則更廣。 |
DOMAIN-SUFFIX 通常不必在前面加點,也不必寫成 *.example.com。後綴比對已包含網域本身及其子網域。在一般後綴欄位中加入星號,無法建立預期的萬用字元運算式。
DOMAIN-KEYWORD 適用於確實需要子字串比對的情況,不能當作精確網域規則的簡寫。例如關鍵字 example 也可能比對到 example-news.test。若只要涵蓋某個網站及其子網域,優先使用 DOMAIN-SUFFIX;只處理單一主機時則使用 DOMAIN。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
在上方範例中,api.example.com 使用 PROXY;www.example.com 使用 DIRECT;只有 example-news.test 會繼續命中關鍵字規則。這些保留網域僅供說明語法,不保證對應網頁可供存取。
IP-CIDR 與 GEOIP:比對位址,而非網址
IP-CIDR 依 IPv4 位址範圍比對。192.168.0.0/16 表示涵蓋從 192.168.0.0 到 192.168.255.255 的位址範圍。單一 IPv4 位址可用 /32 表示。這裡的前綴長度描述網路範圍,不是連接埠號碼。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,203.0.113.8/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
片段中的 203.0.113.8 是文件範例位址,不是可用的服務位址。no-resolve 表示不要只為了比對這條 IP 規則而主動進行網域解析;這不代表整個 App 停止 DNS,也不代表所有經過此規則的要求都不需要解析。若目標位址已可取得,仍可進行位址比對。
| 寫法 | 判斷依據 | 注意事項 |
|---|---|---|
IP-CIDR,192.168.0.0/16,DIRECT | 目標 IPv4 位址是否落在該位址範圍內。 | 不要在位址範圍欄位中填入網頁路徑或連接埠。 |
GEOIP,CN,DIRECT | 目標 IP 在所用地理資料庫中的歸屬地。 | 不是依網頁內容、網域後綴或使用者所在地判斷。 |
FINAL,PROXY | 前面的規則都未命中。 | 沒有比對值欄位,直接填入策略。 |
GEOIP 的結果取決於 IP 地理資料庫。網域可能因 CDN、DNS 回應或網路環境變動而對應不同位址,因此同一網域的 GEOIP 結果也可能改變。若目標必須固定採用某種策略,通常應在 GEOIP 前明確設定網域規則,而非只依賴位址歸屬。
由上而下比對,FINAL 放在最後
對本文介紹的常見規則而言,同一條連線會依規則排列順序逐一檢查;命中後便採用對應策略,不會繼續尋找「看起來更精確」的下一條。規則類型本身沒有自動優先順序;若將精確的 DOMAIN 寫在範圍較廣的 DOMAIN-SUFFIX 後面,可能永遠不會生效。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
- 例外優先:
api.example.com是 example.com 下需要個別處理的主機,因此放在後綴規則之前。 - 接著設定範圍:其餘 example.com 及其子網域採用 DIRECT,不再進入後續的 IP 判斷。
- 最後設定兜底規則:
FINAL,PROXY接手尚未命中的連線。若將它移到第一行,後續的常見規則就沒有比對機會。
DIRECT 表示直接連線至目標,不等於「略過所有系統網路條件」;PROXY 表示交由代理路徑處理,也不代表「連線一定成功」。若策略欄位填寫自訂策略群組名稱,該名稱必須與設定中既有的定義完全一致。本文僅使用 DIRECT 與 PROXY,避免引入未定義的群組名稱。
規則未生效時,分別檢查比對與連線
「網頁無法開啟」不能直接證明規則寫錯。先確認要求是否命中預期規則,再檢查該策略能否建立連線。若命中記錄已顯示 PROXY,但要求仍然失敗,應檢查既有代理服務及其連線參數;繼續新增同類網域規則,通常無法解決傳輸問題。
- 確認 Home → Global Routing → Config,且編輯的檔案與 Config 目前啟用的檔案相同。
- 使用同一個完整網址發出新要求,並記錄實際主機名稱。網頁跳轉、圖片與介面可能使用不同網域,應逐一檢查。
- 檢查命中行是否被更前面的 DOMAIN-SUFFIX、DOMAIN-KEYWORD 或 FINAL 攔截。
- 若命中正確,暫時比較 Proxy 與 Direct 的存取結果;測試完成後還原為 Config。每次只變更一個條件。
以下錯誤識別碼來自 Apple 網路錯誤體系,僅在診斷資訊確實出現相應原文時使用。這些識別碼代表網路要求失敗的類別,不是 Shadowrocket 規則解析器的語法錯誤,也不能單憑錯誤碼判定問題所在環節。
錯誤:NSURLErrorDomain Code=-1001
原因與解決方法:要求未能在時限內完成。先確認命中規則與實際採用的策略,再以相同目標比較 Proxy、Direct,並檢查本機網路;不要直接把逾時視為 FINAL 寫錯。
錯誤:NSURLErrorDomain Code=-1003
原因與解決方法:系統找不到指定主機。先檢查要求中的網域拼寫與 DNS 解析結果,再確認 DOMAIN 欄位是否誤填網址路徑;新增 GEOIP 規則不能取代網域解析檢查。
常見文字錯誤還包括使用中文逗號、將 FINAL,PROXY 寫成三欄格式、把 https://example.com 填入 DOMAIN-SUFFIX,以及使用不存在的策略群組名稱。儲存前逐行核對欄位,不要一次取代整份設定。若設定由遠端來源維護,也應確認後續更新是否會覆蓋本機修改,並保留可還原的副本。
常見問題:修改一條規則後,如何確認結果
已設定 DOMAIN,為什麼子網域沒有生效?
DOMAIN 只比對完整主機名稱。若要同時涵蓋 example.com 和 api.example.com,請使用 DOMAIN-SUFFIX,example.com,DIRECT;若 api.example.com 需要採用例外策略,請將對應的 DOMAIN 規則放在前面。
只想處理 HTTPS,可以在網域後面加上 :443 嗎?
請勿在本文的網域規則欄位中加入 :443。DOMAIN 與 DOMAIN-SUFFIX 依主機名稱比對,不區分該主機使用 80 或 443 連接埠。請先用純網域規則驗證,再依實際需求查閱連接埠相關規則說明。
改用其他協定後,規則也要重寫嗎?
Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 描述的是代理連線方式,不是網域比對類型。若策略引用仍然有效,通常不必因協定變更而重寫 DOMAIN-SUFFIX;應另外確認對應服務的位址、連接埠與驗證參數。
更新現有訂閱後,就會自動取得正確規則嗎?
請勿混淆代理清單更新與 Config 規則更新。更新現有訂閱後,請返回 Config 檢查目前使用的檔案,再到 Home → Global Routing 確認已選擇 Config。是否包含規則、是否覆蓋本機內容,取決於匯入內容的類型與更新方式。
最終驗收應確認三項結果:要求的實際主機名稱正確、命中的規則行正確、採用的策略符合預期。接著再確認頁面與介面能否完成要求。如此即可分別處理「規則選擇錯誤」與「選取的路徑無法使用」,避免反覆切換碰運氣。