自訂規則需同時符合三個條件:目前使用正確的 Config、Global Routing 設為 Config,以及例外規則排在廣泛規則與 FINAL 之前。本文適合已有自己的伺服器或訂閱、需要調整流量分流方式的使用者;依序完成備份、編輯、啟用與驗證,就能分辨「規則未命中」和「命中後連線失敗」。
01 先確認 Config 模式,再修改規則
Shadowrocket(小火箭)的規則不是獨立於運作模式的開關。在 Home 檢查 Global Routing:若要驗證設定檔中的分流規則,應使用 Config。Proxy 和 Direct 分別代表整體採用代理或直接連線的路由模式,不能用這兩種模式下的連線結果判斷自訂規則是否如預期生效。若目前使用 Scene,請先確認該場景實際採用的路由設定,再測試規則。
Home 用來檢查連線狀態與伺服器選擇,Config 用來管理設定檔,Settings 用來查看 App 設定。先在 Config 確認目前啟用的檔案,再進入該檔案的編輯頁面。請勿只修改同名副本,卻仍使用另一份設定檔。
- 先備份目前的設定檔,並記下原本的 Global Routing 和伺服器選擇。
- 在 Config 開啟要修改的設定檔,找到
[Rule]區段。 - 先新增一條容易辨識的測試規則,不要一次取代整份規則。
- 儲存並確認已套用修改後的設定檔,回到 Home 將 Global Routing 設為 Config。
- 保持連線開啟,再重新發起連線;舊連線不適合用來驗證剛修改的路由。
02 規則由上而下執行,例外必須排在前面
一條規則通常由匹配類型、匹配值和策略組成,欄位之間以英文逗號分隔。例如 DOMAIN-SUFFIX,example.com,PROXY 表示將符合條件的網域交由 PROXY 處理。規則會依設定檔中的順序逐一檢查,首次匹配成功後便採用該條策略,不會繼續尋找後面「更精確」的規則。
因此,「越精確越優先」是排列建議,不是自動排序機制。若要讓 status.example.com 直接連線,而同一網域下的其他請求使用代理,精確的 DOMAIN 規則應排在 DOMAIN-SUFFIX 之前。
[Rule]
DOMAIN,status.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
status.example.com命中第一條規則,採用 DIRECT。www.example.com不符合第一條規則,命中第二條,採用 PROXY。example.com本身也會命中第二條規則。- 未符合前兩條規則的請求,會由最後的 FINAL 處理。
如果將前兩條規則對調,status.example.com 會先命中 DOMAIN-SUFFIX,後面的 DOMAIN 規則便不會執行。範例中的網域僅用來說明語法,不應以這些網域是否能開啟網頁,判斷代理服務是否可用。
03 DOMAIN-SUFFIX、IP-CIDR 與 GEOIP 各自匹配什麼
網域規則和 IP 規則處理的對象不同。DOMAIN-SUFFIX 依網域後綴匹配,不是搜尋任意字串是否包含:example.com 和 img.example.com 符合條件,notexample.com 則不符合。若只要匹配完整主機名稱,應使用 DOMAIN。
| 關鍵字 | 匹配對象 | 語法範例 | 檢查重點 |
|---|---|---|---|
DOMAIN | 完整網域名稱 | DOMAIN,status.example.com,DIRECT | 不含協定、路徑或連接埠 |
DOMAIN-SUFFIX | 網域及其子網域 | DOMAIN-SUFFIX,example.com,PROXY | 較廣泛的後綴規則應排在具體例外之後 |
IP-CIDR | IPv4 位址範圍 | IP-CIDR,192.0.2.0/24,DIRECT,no-resolve | 確認位址範圍與解析條件 |
GEOIP | IP 地理位置資料 | GEOIP,CN,DIRECT | 不是依網域後綴判斷地區 |
FINAL | 之前都未命中的請求 | FINAL,PROXY | 放在所有例外規則之後 |
192.0.2.0/24 是文件範例網段,涵蓋 192.0.2.0 至 192.0.2.255,並非可直接使用的伺服器位址。no-resolve 表示不會為這條 IP 規則主動發起網域解析;若已有可供匹配的目標 IP,仍可進行判斷。不要將它解讀為關閉所有 DNS,也不要期待在只有網域、沒有可用 IP 的情況下強制命中。
GEOIP 會依據目標 IP 和歸屬資料進行判斷,無法保證使用特定語言的網站,或特定地區的網域後綴,一定採用相同策略。使用共用基礎設施的網站可能解析到不同位址。若要固定某個網域的路由,建議直接設定網域規則,而非依賴該網域當下解析到的地區。
04 PROXY、DIRECT、REJECT 與 FINAL 的用途
PROXY、DIRECT、REJECT 是規則套用的策略,FINAL 則是規則類型,兩者層級不同。FINAL,PROXY 的意思是「沒有前面的規則命中時,採用 PROXY」,並不表示 FINAL 本身具備代理功能。
- PROXY:交由代理策略處理。使用基本設定時,需確認 Home 中選取的伺服器;使用策略群組的設定也要確認群組內實際選取的項目。單獨設定 PROXY 不會建立伺服器。
- DIRECT:直接連線至目標,不經代理伺服器轉送;連線仍可能經過 App 的通道與規則處理,不能將 DIRECT 等同於關閉連線開關。
- REJECT:拒絕符合條件的請求。適用於明確需要封鎖的目標,不應拿來當作修復連線失敗的通用設定。
以代理作為預設路由的基本範例
- DOMAIN
- status.example.com,DIRECT
- DOMAIN-SUFFIX
- blocked.example.com,REJECT
- FINAL
- PROXY
先處理明確需要直接連線或拒絕的例外,其餘請求採用代理策略。
以直接連線作為預設路由的基本範例
- DOMAIN
- status.example.com,DIRECT
- DOMAIN-SUFFIX
- example.com,PROXY
- FINAL
- DIRECT
只有列出的匹配對象會使用代理;未列出的請求則直接連線。
以上是兩種不同的路由目標,請勿合併複製兩張卡片的內容。選擇 FINAL 的策略之前,先想清楚「未列入規則的請求應如何處理」。若將 FINAL 放在規則區段前面,後續的例外規則便無法正常參與匹配;保留一條明確的末尾預設規則,更容易檢查。
結論:先決定預設路由,再新增例外
先用 FINAL 指定未匹配請求的處理方式,再將需要改變路由的網域或 IP 規則放在 FINAL 之前;驗證時一次只調整一條例外,避免無法判斷是哪項修改影響結果。
05 完整範例:從精確網域到末尾預設規則
以下設定片段用於練習判讀規則順序,只展示 [Rule] 區段。內容不包含伺服器定義,也不應覆蓋現有設定檔中的其他區段。所有範例網域和位址僅供文件說明,實際使用時請填入已確認的匹配對象。
[Rule]
DOMAIN,status.example.com,DIRECT
DOMAIN-SUFFIX,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
FINAL,PROXY
- 先判斷是否為
status.example.com,符合時直接連線。 - 接著判斷是否為
blocked.example.com或其子網域,符合時拒絕連線。 - 再處理其他
example.com網域請求,並採用代理。 - 對於尚未命中且有可用目標 IP 的請求,檢查範例網段。
- 其餘請求採用最後的 PROXY 預設規則。
第二條必須排在第三條之前,因為 blocked.example.com 同時符合這兩條後綴規則。即使 IP-CIDR 的匹配範圍不同,也無法推翻前面已命中的網域策略。排列規則時,應依「先處理明確例外,再處理廣泛集合」的原則判讀,而非將所有相同類型的關鍵字集中排列。
06 驗證規則:分開記錄匹配結果與連線結果
網頁能否開啟,並非判斷規則是否命中的唯一依據。命中 PROXY 後,仍可能因伺服器無法連線而失敗;命中 DIRECT 後,也可能受到目前網路限制;命中 REJECT 時,無法存取可能正是預期結果。排查時應分別記錄「採用了什麼策略」以及「套用策略後發生什麼事」。
- 準備目標:選擇一個自己能確認的真實完整網域名稱,先記錄修改前的連線情況,不要用範例位址測試服務是否可用。
- 固定環境:保持使用相同網路、伺服器和 Config,並確認 Global Routing 設為 Config。
- 建立新請求:儲存規則後關閉舊頁面或中斷舊連線,再重新發起請求,避免重複使用連線影響觀察結果。
- 查看記錄:在 App 的請求記錄中確認實際網域、目標 IP、規則和策略等可見資訊;記錄項目名稱及顯示內容以目前 App 介面為準。
- 逐項調整:若匹配錯誤,調整規則順序;若匹配正確但連線失敗,再檢查 DNS、代理伺服器或直接連線路徑。
單一頁面可能會向多個網域發出請求:主文件、圖片、API 和媒體資源可能各自匹配不同規則。只為主網站網域新增一條規則,不代表所有相關資源都會採用相同策略。請從失敗請求的實際主機名稱開始檢查,不要只根據瀏覽器網址列中的網域擴大規則範圍。
07 自訂規則常見問題
明明設定了 DIRECT,為什麼還是使用 PROXY?
先在 Home 確認 Global Routing 是否設為 Config,再確認 Config 啟用的是修改後的檔案。接著從第一條規則往下檢查:若較前面的 DOMAIN-SUFFIX 已命中 PROXY,後面的 DIRECT 就不會執行。將精確例外移到廣泛規則之前,再用新請求測試。
FINAL,PROXY 會自動選擇可用的伺服器嗎?
不會。FINAL 只負責處理未匹配項目,PROXY 只指定代理策略。請先確認已有可連線的伺服器;若設定檔使用策略群組,也要檢查群組選擇及相關設定。只修改最後一行,無法修正錯誤的位址、認證資訊或伺服器狀態。
新增 IP-CIDR 後,為什麼網域請求沒有命中?
先確認請求是否已命中前面的網域規則,再檢查目標實際解析出的 IP 是否位於該網段。若加上 no-resolve,這條規則不會為了匹配而主動解析網域。先從請求記錄確認目標 IP,再判斷規則條件,不要只憑網站名稱推測位址。
訂閱更新後,自訂規則會一直保留嗎?
先確認更新的是哪一項:伺服器訂閱主要管理伺服器項目,遠端設定檔更新則可能取代設定內容。修改前先備份,更新後到 Config 確認規則和啟用狀態。若自訂內容消失,先比對備份與目前檔案,再恢復所需項目,不要反覆覆蓋整份設定檔。