Shadowrocket(小火箭)的規則如何決定連線去向?先確認 Home → Global Routing 設為 Config,再掌握「比對條件、策略、順序」三個要素。本文適合已有自己的服務商與訂閱、準備調整設定的使用者;讀完後即可分辨網域規則與 IP 規則、設定範圍明確的例外,並透過請求記錄確認變更是否生效。
規則在哪種模式下生效?先確認 Global Routing
規則寫對了就一定會套用嗎?不一定,請先檢查 Home → Global Routing。本文討論的是 Config 模式:連線會依目前選取的設定檔進行規則比對。若切換至 Proxy 或 Direct,就不能用本文的逐條比對結果解釋所有連線;Scene 則須依所選場景的實際設定確認。
| 模式 | 主要用途 | 測試前須確認事項 |
|---|---|---|
| Config | 依目前設定檔中的規則分流。 | Config 中選取的檔案是否就是剛才修改的檔案。 |
| Proxy | 透過代理方式處理連線。 | 目前選取的伺服器及連線參數是否有效。 |
| Direct | 透過直接連線方式處理連線。 | 目前網路能否直接連線至目標。 |
| Scene | 依場景設定決定連線行為。 | 目前使用哪個場景,以及場景中設定了哪些內容。 |
規則能補上伺服器資訊嗎?不行。規則只負責選擇連線策略,不會建立連線服務,也無法修正服務商提供的參數。本文以已有可用連線為前提,不提供、販售或推薦節點、訂閱或服務商資源。修改前請先保留原設定,避免混淆連線問題與分流問題。
一行規則怎麼看?先拆解比對條件與策略
逗號前後各代表什麼?一般規則通常由「規則關鍵字、比對值、策略」組成。第一行表示目標網域完全等於 example.com 時使用 DIRECT;第二行的 FINAL 沒有比對值,會直接指定最終備用策略。
[Rule]
DOMAIN,example.com,DIRECT
FINAL,PROXY
DIRECT 和 PROXY 是網域嗎?不是,在這裡它們代表策略。DIRECT 表示直接連線;PROXY 表示使用代理策略,實際的對外連線方式仍須確認目前選取的伺服器。若使用自己設定中的策略群組名稱,名稱必須與設定檔實際定義的名稱一致,不能只在規則末尾填入未定義的名稱。
這些規則片段可以直接取代現有設定檔嗎?不行,不能把規則片段當成完整設定檔使用。[Rule] 是規則區段的標記;編輯現有檔案時,應在原有規則區段內調整項目,並保留其他設定區段。本文的 example.com 和文件範例 IP 僅用來說明語法,不是可用的服務位址。
DOMAIN 和 DOMAIN-SUFFIX 有什麼差別?比較比對範圍
只想讓單一主機使用指定策略,該選哪個?使用 DOMAIN;若要一併處理主網域及其子網域,則使用 DOMAIN-SUFFIX。後綴比對會遵守網域標籤邊界,不是只要網域中包含這段字元就算符合。
| 規則 | 會比對的目標 | 不會比對的目標 |
|---|---|---|
DOMAIN,example.com,DIRECT | example.com | api.example.com |
DOMAIN-SUFFIX,example.com,DIRECT | example.com、api.example.com | notexample.com |
DOMAIN-KEYWORD,example,DIRECT | example.com、notexample.com | sample.test |
為什麼不直接用 DOMAIN-KEYWORD?它會依網域中的關鍵字進行比對,範圍比網域後綴更廣,容易連名稱相似、但不屬於同一網域體系的目標也一併處理。已知完整網域時,優先使用 DOMAIN 或 DOMAIN-SUFFIX;只有確實需要比對字元是否包含時,才考慮使用關鍵字規則。
GEOIP 和 IP-CIDR 比對什麼?區分地理位置資料與 IP 網段
GEOIP,CN,DIRECT 依據什麼判斷地區?它是依目標 IP 在 GeoIP 資料中的歸屬進行比對,不會參考網頁文字、網域後綴或裝置所在地。資料庫中的 IP 歸屬可能與服務實際部署位置的認知不同,因此應以請求使用的目標 IP 和 App 中的比對結果為準。
IP-CIDR,198.51.100.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
/24 是連接埠號碼嗎?不是,它代表 IPv4 前綴長度。198.51.100.0/24 涵蓋從 198.51.100.0 到 198.51.100.255 的位址;198.51.100.23/32 則只比對一個 IPv4 位址。本文使用的是文件範例網段,實際設定時應填入自己明確要比對的目標網段。
- 已知固定網段:使用
IP-CIDR表示位址範圍,不要把網域填入第二個欄位。 - 需要依地區分流:使用
GEOIP,並留意 IP 歸屬資料與目標位址變動可能造成的影響。 - 遇到 IPv6 目標:請確認是否需要使用
IP-CIDR6等對應規則;IPv4 網段規則不會涵蓋 IPv6 位址。 - 使用 no-resolve:此選項可避免為了這條 IP 規則主動觸發網域解析;不要將它理解為關閉 App 的所有 DNS 功能。
加上 no-resolve 後,為什麼有些網域請求沒有比對到?如果比對階段沒有可用的目標 IP,而這條規則又不會主動解析網域,系統就可能繼續檢查後續規則。若要穩定地依特定網域分流,優先使用網域規則;不要只為了讓 IP 規則比對成功,就任意更改所有 DNS 設定。
多條規則都符合時會採用哪一條?優先採用最先符合的規則
比對條件較精確的規則一定會自動優先嗎?不會。本文提到的一般規則應依由上而下的順序理解:先符合哪一條,就採用該條指定的策略。將單一主機的例外規則放在適用範圍較廣的規則之前,才能得到預期結果。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,198.51.100.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
api.example.com先符合第一條,因此使用PROXY,不會再由第二條改成DIRECT。www.example.com不符合第一條,但符合第二條,因此使用DIRECT。- 目標位址為
198.51.100.23,且沒有被前面的網域規則處理時,就可能符合範例網段規則。 - 如果前面的規則都沒有符合,就繼續檢查
GEOIP;仍未符合的連線則交由FINAL處理。
FINAL 可以寫在第一行嗎?雖然語法簡單,但放在前面會提早套用最終備用策略,讓後面的普通規則沒有機會比對。通常應將它放在規則區段末尾。它不是「連線失敗後再試另一條」的重試設定:符合規則後若連線失敗,不代表系統會自動改用下一行策略。
修改後如何確認生效?一次只測試一個目標
儲存後網頁能開啟,就能證明規則正確嗎?不能,直接連線和代理連線都可能成功。驗證時須一併確認目前使用的設定檔、Global Routing、請求目標與最終策略,而不是只看網頁能否載入。建議使用一個已知目標重複測試,減少多項變更互相干擾。
-
保留原設定
前往 Config,記下目前選取的檔案,並保留可供還原的副本。若檔案來自遠端設定,請先確認更新是否會覆蓋本機修改。
-
修改規則區段
在 Config 中開啟目標設定檔進行編輯,找到
[Rule]。先新增一條明確的DOMAIN規則,並將它放在適用範圍較廣的規則與FINAL之前。 -
確認模式
儲存後確認已選取該設定檔,再返回 Home → Global Routing → Config。確認目前使用的仍是自己已有的可用連線。
-
建立新請求
重新開啟測試頁面,並在 App 的請求記錄中尋找相同時間的目標。必要時可在不影響重要工作的情況下重新連線,避免沿用既有的長連線。
-
確認比對結果
檢查記錄中的目標網域或 IP、符合的規則及實際採用的策略;實際顯示欄位以 App 內為準。若結果不符,先檢查排在該規則上方的符合項目,再確認是否選錯檔案。
修改規則會影響所有已建立的連線嗎?不能這麼假設。瀏覽器連線重複使用、頁面快取和 App 長連線,都可能讓測試繼續使用舊連線。請以新建立的連線記錄作為觀察依據;測試結束後恢復必要設定,不要長時間維持為了排除問題而暫時選取的模式。
規則比對正確卻無法連線?分辨比對問題與連線錯誤
請求記錄顯示策略正確,還需要繼續修改規則嗎?先暫停修改,檢查對外連線。以下列出常見網路錯誤中的英文片段;完整前綴和顯示位置可能不同。這些訊息反映的是連線階段的問題,不能單獨證明網域規則寫錯。
錯誤:Connection refused
原因與處理方式:目標連線遭拒,常見原因包括位址或連接埠錯誤、服務未在監聽。先從請求記錄確認遭拒的是代理伺服器連線還是目標連線,再核對 Home 中的伺服器位址、Port,以及服務商提供的參數;不要直接把服務連接埠改成網頁常用的 443。
錯誤:Operation timed out
原因與處理方式:連線或相關操作未能在限定時間內完成。先透過 Home 中的 Connectivity Test 檢查已有的伺服器,再確認目前網路、DNS 和請求實際採用的策略;只有記錄顯示比對錯誤時,才調整對應規則。
如何避免越改越難排除問題?依照「伺服器可用性、目前模式、目標解析、規則比對」的順序檢查,每次只變更一個項目。不要同時更換 DNS、重排整個規則區段並切換伺服器,否則即使恢復連線,也很難判斷是哪項變更發揮作用。
常見問題:如何處理規則更新、DNS 與 FINAL?
更新訂閱後,手動撰寫的規則也會跟著變嗎?
請先區分 Home 中的伺服器訂閱與 Config 中的遠端設定。更新伺服器訂閱主要是處理連線項目;更新遠端設定則可能取代設定檔內容。修改前請在 Config 確認檔案來源,更新後重新檢查 [Rule] 和選取狀態,不要假設兩種更新的作用相同。
為什麼同一個網站會連線到好幾個網域?
網頁可能分別請求主站、登入 API 和資源網域。一條 DOMAIN 只會涵蓋指定主機;請先從請求記錄確認實際發生問題的目標,再新增必要規則。不要只因為頁面少顯示一張圖片,就直接設定適用範圍很廣的 DOMAIN-KEYWORD。
FINAL,PROXY 代表所有請求都走代理嗎?
不是。它只會處理到達該行、且尚未符合前面規則的連線。若前面已有 DOMAIN-SUFFIX,example.com,DIRECT,符合該網域的連線會先採用 DIRECT。若要判斷實際去向,請從規則區段頂端開始依序檢查。
IP-CIDR 沒有比對到,應該刪除網域規則嗎?
先確認前面是否已有網域規則符合,再確認目標實際使用 IPv4 還是 IPv6,以及 no-resolve 是否讓該行不主動進行解析。只有確認需要讓網段規則優先時才調整順序;不要為了單次測試刪除所有網域規則。