Shadowrocket(小火箭)的規則分流須先在 Global Routing 選擇 Config。本文適合已備妥服務商連線資料、準備編輯設定檔的使用者:先辨識規則欄位,再區分網域與 IP 比對方式,最後依序確認命中結果。範例網域與位址僅供說明語法,並非可用的連線資料;修改前請先保留現有設定。
1. 規則生效條件與比對順序
先說結論:規則依設定檔中的排列順序由上而下檢查。符合規則時便採用該規則的策略,不會因為後面有「更精確」的規則而重新選擇。例外規則應放在前面,涵蓋範圍較廣的規則放在後面,並以 FINAL 處理其餘請求。先確認目前使用的設定檔,編輯規則才有明確的作用對象。
在 Home → Global Routing 中選擇 Config,才能依目前的設定檔進行分流。Proxy 與 Direct 是全域路由模式,不能用來驗證本文範例中的規則順序;Scene 則依場景設定運作,檢查時也要確認該場景使用的路由。測試單一規則檔時,請先選擇 Config,避免把路由模式造成的結果誤判為語法問題。
這個流程說明的是規則如何決定處理方式,不代表所有請求都必須先進行一次 DNS 查詢。網域規則使用已知的目標網域,IP 規則則使用目標位址;是否能取得網域、是否需要解析,以及設定檔中的 DNS 設定,都會影響可供比對的資訊。命中 PROXY 只代表選用了代理策略,不表示後續連線必定成功。
2. 規則行格式:關鍵字、條件與策略
常見規則行以英文逗號分隔。DOMAIN、DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP 與 IP-CIDR 都需要比對條件和策略;FINAL 不需要比對條件,只需指定策略。規則應放在設定檔的 [Rule] 區段,不要寫入 [General] 或 [Host]。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT
以上設定先將 login.example.com 設為例外,其餘 example.com 範圍則交由 PROXY 處理。關鍵字規則的涵蓋範圍較廣,此處僅用來示範格式;實際設定不必把所有類型都一併加入。PROXY 與 DIRECT 是策略,不是通訊協定名稱。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 等通訊協定的連線參數,應在現有連線設定中核對,不可填在規則行的策略欄位。
- DIRECT:目標請求採直連策略處理,仍會受到目前網路、目標服務與 DNS 狀況影響。
- PROXY:將請求交由代理策略處理;測試時請確認該策略所對應的現有連線可正常使用。
- REJECT:拒絕符合條件的請求;若設定檔中有這類規則,也應一併檢查其排列順序。
- 自訂策略:若引用策略群組名稱,名稱必須與設定檔中實際定義的名稱一致,不能把說明文字當成已存在的策略。
條件欄只填寫規則需要的內容。網域規則填入網域,不要加上 https://、路徑、查詢參數或 :443。例如 https://example.com/account 的網域條件是 example.com;這六類規則都無法依 URL 路徑區分同一網站的不同頁面。
3. DOMAIN、DOMAIN-SUFFIX 與 DOMAIN-KEYWORD
DOMAIN 精確比對一個完整網域;DOMAIN-SUFFIX 比對指定網域及其子網域;DOMAIN-KEYWORD 則檢查網域是否含有指定字串。三者的比對範圍各不相同,不能只用「都包含 example」來理解。尤其 DOMAIN-SUFFIX 會依網域邊界判斷,DOMAIN-KEYWORD 則不會比對後綴邊界。
| 規則條件 | 會比對 | 不會比對 |
|---|---|---|
DOMAIN,example.com | example.com | www.example.com |
DOMAIN-SUFFIX,example.com | example.com、api.example.com | notexample.com、example.com.other.test |
DOMAIN-KEYWORD,example | example.com、myexample.test | sample.test |
只指定網站中的單一主機時,使用 DOMAIN;若要涵蓋主網域及多層子網域,則使用 DOMAIN-SUFFIX。DOMAIN-KEYWORD 適用於確實需要依字串涵蓋網域的情況,但也可能比對到無關網域,因此不建議只為了少寫幾行就拿它取代後綴規則。DOMAIN-SUFFIX 的條件不必寫成 *.example.com,直接填入 example.com 即可。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
在這個範例中,api.example.com 先符合 DOMAIN,因此採用 DIRECT;www.example.com 符合第二行,因此採用 PROXY。若將前兩行對調,後綴規則會先比對到 api.example.com,精確規則便無法作為例外生效。網頁也可能載入獨立的圖片、登入或 API 網域,這些請求都要分別檢查,不能只以網址列中的主網域代表整個頁面的流量。
4. GEOIP 與 IP-CIDR:依目標 IP 比對
GEOIP 會依目標 IP 在應用程式所用地理資訊資料庫中的歸屬進行比對,例如 GEOIP,CN,DIRECT。其中 CN 是國家代碼,不代表網域後綴或內容所屬地區。資料庫中的歸屬結果也不能證明即時實際位置;不能只因頁面顯示中文,就預期它會符合 CN。
IP-CIDR 用來判斷目標 IPv4 位址是否位於指定網段。192.168.0.0/16 代表從 192.168.0.0 到 192.168.255.255 的範圍;/32 則代表單一 IPv4 位址。以下位址僅供說明語法,不是伺服器位址建議。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,203.0.113.7/32,PROXY,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
- 已有 IP:若請求目標已是 IP,可直接判斷所屬網段或資料庫歸屬,不必將它當成網域進行比對。
- 網域目標:IP 類規則可能需要先解析才能判斷,因此 DNS 結果會影響比對。若網域已符合前面的網域規則,後續 IP 規則便不會改變結果。
- no-resolve:表示不為這條 IP 規則主動解析網域;這不代表關閉所有 DNS,也不會忽略已可使用的目標 IP。
- 位址類型:IP-CIDR 用於 IPv4,IPv6 網段則使用 IP-CIDR6。只設定 IPv4 網段不會自動涵蓋目標的 IPv6 位址。
範例最後一行採用 FINAL,PROXY,與前面的 FINAL,DIRECT 用途不同:未符合其他規則的請求會交由代理處理。應依自己的分流需求選擇預設策略。實際驗證時,請一併記錄請求網域、目標位址與最終策略,避免把 DNS 回傳不同位址的情況誤認為 CIDR 寫法有誤。
5. FINAL 預設處理與設定檔驗證步驟
FINAL 用來比對尚未符合前面規則的請求,應放在規則末尾。它不是會自動套用的「最低優先級預設規則」,而是依序比對的一行規則:若放在前面,後續規則就沒有機會處理請求。若只想讓指定網域走代理,可使用網域規則搭配 FINAL,DIRECT;若其餘請求也要走代理,則使用 FINAL,PROXY。
-
備份原設定
進入 Config,先確認目前啟用的檔案,並保留修改前的副本。記下原有的 [Rule] 順序,避免只留下測試規則而遺漏原本的例外。
-
加入測試規則
開啟這份設定檔的編輯入口,在 [Rule] 中加入所需規則。將 DOMAIN 例外放在 DOMAIN-SUFFIX 前面,最後保留一條符合分流需求的 FINAL,並儲存設定。
-
確認路由設定
返回 Home → Global Routing → Config,並在 Config 中確認選取的檔案。確認 Home 中的代理策略使用的是自己已有且可連線的伺服器。
-
送出新請求
重新建立連線後再造訪測試目標,避免沿用修改前建立的長連線。在應用程式的請求記錄中核對目標與實際採用的策略;已快取的網頁不能證明新規則已生效。
-
檢查預設策略
再造訪一個不在網域清單中的目標,確認它是否採用 FINAL 指定的策略。若結果不同,請依序檢查前置規則、目標 IP 與目前設定檔,不要立刻加入涵蓋範圍更廣的關鍵字規則。
依第三節的三行範例推算,api.example.com 應採用 DIRECT、www.example.com 應採用 PROXY,其餘未符合規則的目標則採用 DIRECT。這些是依規則推導的結果,並非實際連線測試範例網域的報告。換成自己要設定的實際網域後,再透過請求記錄驗證;單次延遲測試只能檢查連線能力,無法證明特定網頁符合哪一條規則。
6. 區分規則未生效與連線錯誤
先分清兩類問題:請求採用錯誤策略,應檢查路由模式、設定檔選擇、規則條件或排列順序;請求已採用預期策略但連線失敗,則應檢查目標服務與現有伺服器的連線參數。規則只決定如何處理請求,無法修正伺服器連接埠錯誤或無法連線等問題。
錯誤:Connection refused
原因與處理方式:這是底層連線可能回傳的拒絕錯誤,通常與目標連接埠未在監聽或明確拒絕連線有關。先確認請求實際採用的策略;若為 PROXY,請依自己的服務商資料核對伺服器位址與 Port。例如資料明確標示 443,就應填寫 443,不要根據常見連接埠自行猜測。
錯誤:Operation timed out
原因與處理方式:這是底層操作可能回傳的逾時錯誤,表示操作未能在等待時間內完成,不代表規則語法有誤。先在 Home 測試現有連線,再檢查請求目標與策略,並分別確認目前網路、目標是否可連線,以及伺服器是否可用;應用程式記錄中的完整錯誤文字可能因來源不同而異。
已設定 DOMAIN-SUFFIX,為什麼還是走直連?
先前往 Home → Global Routing 選擇 Config,再確認 Config 中啟用的是剛儲存的檔案。接著從 [Rule] 開頭檢查是否有先符合的 DIRECT 或 FINAL;條件只填網域,不要包含通訊協定、路徑或連接埠。
想讓單一子網域直連,又不影響其他子網域,該怎麼設定?
將 DOMAIN,api.example.com,DIRECT 放在 DOMAIN-SUFFIX,example.com,PROXY 前面。儲存後送出新請求,分別確認 api.example.com 與另一個子網域採用的策略,不要只測試其中一個。
網頁可以開啟,為什麼部分圖片還是載入失敗?
查看失敗請求的實際網域,不要只看頁面網址。圖片可能來自不同網域,也可能已符合 PROXY 規則但連線失敗。確認請求記錄後再決定是否加入 DOMAIN 或 DOMAIN-SUFFIX,避免用涵蓋範圍過廣的 DOMAIN-KEYWORD 影響無關目標。
更新訂閱後,自訂規則也會一起變動嗎?
先分清 Home 中連線資料的訂閱,與 Config 中規則檔的更新。更新現有連線訂閱不代表會編輯目前的 [Rule];若目前設定檔本身來自遠端更新,更新後應再次確認檔案內容,並將自訂修改保留在可自行管理的副本中。
排查時一次只修改一項條件,並保留修改前後的規則行與請求結果。依照「目前設定檔、Global Routing、命中順序、網域或 IP、連線參數」的順序檢查,就能分開釐清分流判斷與網路連線問題。若需要完整了解設定入口,請繼續閱讀站內使用教學;通訊協定參數的核對位置請參閱通訊協定參考。