Shadowrocket 會依序檢查規則清單,第一條符合的規則決定流量去向;FINAL 則處理先前都未符合的請求。本文適合在 iPhone / iPad 上使用 Shadowrocket(小火箭)、已有自己的服務商與設定檔,並準備編輯 Config 的使用者。Mac、Windows、Android、Linux 使用者也可參考比對原理,實際編輯位置請以目前平台介面為準。讀完後即可辨識六種條件、撰寫含例外與預設規則的清單,並透過新連線確認結果。
1. 規則結構與 Global Routing 設定前提
規則不是連線參數,也不是依應用程式名稱自動判斷用途的清單。它會讀取目前請求可取得的網域、目的 IP 等資訊,並選擇一項策略。若要讓設定檔中的規則參與流量分流,請在 iPhone / iPad 的 Home → Global Routing 選擇 Config;只修改 Config 檔案,卻維持 Proxy 或 Direct,無法依本文預期驗證規則。
[Rule]
DOMAIN,example.com,DIRECT
DOMAIN-SUFFIX,example.org,PROXY
FINAL,DIRECT
大多數條件規則由「類型、比對內容、策略」三個欄位組成,欄位之間以英文逗號分隔。FINAL 沒有比對內容,因此只需兩個欄位。DIRECT 表示直接連線;PROXY 表示交由代理路徑處理,這一欄不需填入既有伺服器的位址或密碼。引用設定中的自訂策略名稱時,名稱必須與實際定義相符。
結論:先決定預設去向,再加入例外
先決定未符合任何規則的請求應使用 DIRECT 或 PROXY,將對應的 FINAL 放在清單末尾,再於上方加入範圍明確的例外;不要用大量關鍵字規則取代明確的預設策略。
- Config:依目前啟用設定中的規則選擇流量去向,是本文操作的前提。
- Proxy:全域代理模式,不適合用來驗證某條 DIRECT 規則是否生效。
- Direct:全域直連模式,不適合用來驗證某條 PROXY 規則是否符合。
- Scene:依已設定的場景條件切換;排查時還需確認場景最後使用的設定與策略。
2. DOMAIN、DOMAIN-SUFFIX 與 DOMAIN-KEYWORD
三種網域規則的差異在於比對範圍。DOMAIN 要求完整網域相符;DOMAIN-SUFFIX 會比對指定網域本身及其子網域;DOMAIN-KEYWORD 則檢查網域中是否包含指定字串。這些規則都不會比對 URL 路徑,因此無法透過加入 /video/ 區分同一網域下的不同網頁區段。
| 規則寫法 | 會符合 | 不會符合 |
|---|---|---|
DOMAIN,example.com,DIRECT |
example.com |
www.example.com |
DOMAIN-SUFFIX,example.com,PROXY |
example.com、cdn.example.com |
notexample.com、example.com.other.test |
DOMAIN-KEYWORD,example,PROXY |
example.com、notexample.net |
sample.test |
例如,若要讓整個 example.com 使用代理,但讓登入主機直連,應先寫完整網域例外,再加入後綴規則。DOMAIN-SUFFIX 不必寫成 *.example.com;星號不是表示子網域範圍的必要語法。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
在這段設定中,login.example.com 符合第一行後就會停止比對,不會再檢查第二行。img.example.com 不符合第一行,但符合第二行。若將兩行順序顛倒,後綴規則會先接管請求,完整網域例外便不再生效。所謂「精確規則優先」,是由編輯者安排順序,並非系統會自動替所有規則排序。
3. GEOIP 與 IP-CIDR:依目的位址比對
GEOIP 會依據所用地理資料庫中目的 IP 的記錄進行比對。GEOIP,CN,DIRECT 表示將資料庫歸類為 CN 的目的 IP 設為 DIRECT,不是依裝置位置或網域後綴判斷。若網域採用分散式部署,不同解析結果可能位於不同地區,規則結果也可能隨之改變。
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP-CIDR 依位址範圍比對。192.168.0.0/16 涵蓋 192.168.0.0 至 192.168.255.255;10.0.0.0/8 涵蓋 10.0.0.0 至 10.255.255.255。這兩行僅示範部分私有 IPv4 網段,並非完整的區域網路規則集。
| 條件 | 所需資訊 | 檢查重點 |
|---|---|---|
GEOIP,CN,DIRECT | 目的 IP 與地理資料庫記錄 | 資料庫記錄不等於即時實際位置的證明。 |
IP-CIDR,192.168.0.0/16,DIRECT | IPv4 目的位址 | 確認實際目的位址是否落在指定前綴範圍內。 |
no-resolve | 比對時已可取得的目的 IP | 避免只為這條 IP 規則額外觸發網域解析。 |
no-resolve 不是「禁止所有 DNS 查詢」,也不是「一律直連」的開關。若請求只有網域、尚無可用 IP,帶有此選項的 IP 規則不會為了比對而主動解析網域,請求可能繼續往下檢查。IPv6 位址範圍需使用對應的 IP-CIDR6 規則,不能直接將 IPv6 前綴當成上述 IPv4 範例的比對對象。
- 若要讓特定內網位址直連:先確認實際位址,再選用適當的 IP-CIDR 範圍。
- 若特定網域必須使用指定策略:優先撰寫網域規則,不要依賴它目前解析到哪個地區。
- IP 規則未符合:一併檢查目的位址、位址類型、解析時機,以及前面是否已有規則符合。
4. FINAL 的位置與完整規則範例
FINAL 是無條件的預設規則,必須放在規則清單末尾。若放在中間,後續條件即使正確,也無法處理已被 FINAL 接手的請求。FINAL 選擇 DIRECT 或 PROXY,代表預設路由策略不同,並沒有適用於所有設定的標準答案。
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,example-cdn,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
以下範例涵蓋本文介紹的六種規則類型,不包含伺服器與策略群組定義,也不是可直接連線的完整設定。範例網域僅用來說明語法;測試時請換成自己清楚了解用途與實際位址的網域。PROXY 能否建立連線,仍取決於使用者既有代理設定是否有效。
login.example.com:符合第一條規則,選擇 DIRECT。static.example.com:符合第二條規則,選擇 PROXY,不再檢查 GEOIP。192.168.1.20:若先前沒有網域規則符合,便會進入私有網段規則並選擇 DIRECT。- 其他請求:先依序檢查其餘條件;若都不符合,則由 FINAL 選擇 PROXY。
5. 在 Config 中修改與驗證
以下步驟以 iPhone / iPad 上的 Home、Config 介面為例。操作前請先備份現有設定;不要將整份設定替換成只有 [Rule] 的片段。若現有設定已包含該區段,請在原區段中調整,不要重複新增同名區段。遠端設定再次更新時,可能會覆寫本機修改;請先確認正在編輯的是本機副本還是更新來源。
-
備份設定
進入 Config,找到目前使用的設定,先保存原始內容並記下檔名,之後才能確認啟用與編輯的是同一個檔案。
-
編輯規則
在 Config 開啟目標設定的編輯介面,找到
[Rule]。加入一條明確的網域規則,並確認 FINAL 仍位於清單最後。 -
啟用設定
儲存後,在 Config 確認已選取修改過的設定,再返回 Home → Global Routing → Config,避免目前仍處於 Proxy、Direct 或其他場景狀態。
-
建立新連線
中斷後重新連線,關閉測試頁面原有的連線,再前往目標網域。查看連線記錄中的目的位址、符合的規則與最終策略;不要只確認網頁是否能開啟。
-
逐項檢查
分別測試完整網域、同網域子網域與未符合規則的網域。每次只修改一個條件或順序,並記錄差異;若出現異常,先還原備份,再縮小測試範圍。
既有的 TCP 長連線或重用連線可能繼續沿用建立時的路徑;儲存規則後,它們不一定會立即切換。瀏覽器顯示的頁面也可能來自快取。因此,只刷新一次頁面、看起來沒有變化,並不足以證明規則未生效,應搭配新連線的記錄判斷。
- 分開檢查訂閱與規則:在 Home 更新既有 Subscribe 內容,通常是重新整理伺服器資料,不代表目前 Config 中的規則也已更新。
- 分開檢查自動連線與流量分流:Settings → On Demand 管理自動連線條件,不代表已選擇 Config 分流模式。
- 分開檢查協定與規則比對:Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 代表不同的連線協定;網域規則不會自動將一種協定轉換成另一種。
6. 未符合規則與連線錯誤的排查順序
先判斷是「規則選錯路徑」還是「路徑選對但連線失敗」。目標網頁可能同時載入主站、圖片、登入與 API 等不同網域;只替主站設定 DOMAIN,不代表其他資源網域也會使用相同策略。若部分內容載入失敗,請從失敗連線的實際目的網域開始檢查,不要直接擴大為關鍵字比對。
錯誤:connection refused
原因與處理方式:這類底層連線錯誤表示連線遭到拒絕,可能是目標連接埠沒有監聽,或路徑上的設備主動拒絕連線。先確認失敗連線的實際位址、連接埠與所選策略;若已正確符合 PROXY,再檢查既有伺服器的連線參數,不要只修改 DOMAIN 規則。
錯誤:i/o timeout
原因與處理方式:這類底層逾時表示相關網路操作未能在期限內完成,不能只憑此判定規則語法錯誤。先從連線記錄確認使用的是 DIRECT 還是 PROXY,再分別檢查 DNS、目的位址是否可連線,以及所選代理路徑;記錄中的完整錯誤文字可能因協定與平台而異。
只有在實際連線記錄出現上述錯誤時,才應依此排查;它們不是「規則未符合」的專用提示。若記錄顯示 FINAL,表示前面的條件都沒有接手該請求;請檢查實際網域是否相符、請求是否直接使用 IP、IP 條件是否受解析時機影響,以及設定是否確實已啟用。
| 觀察到的現象 | 優先檢查項目 | 建議調整方式 |
|---|---|---|
| 所有請求都走代理 | Home → Global Routing 是否設為 Proxy | 切換為 Config,再以新連線驗證。 |
| 登入網域例外未生效 | DOMAIN-SUFFIX 是否排在例外規則之前 | 將精確的 DOMAIN 規則移至後綴規則上方。 |
| 所有請求都顯示 FINAL | 實際目的位址、啟用的設定檔、FINAL 位置 | 確認已選取正確檔案、移除前置的 FINAL,並檢查目的資訊。 |
| 網域規則符合,但 IP 規則未命中 | 解析結果、位址類型與 no-resolve | 確認實際目的 IP,勿將 IPv6 當作 IPv4 測試。 |
| 修改後短時間內仍走舊路徑 | 舊連線重用與頁面快取 | 重新建立連線後,查看新的規則比對記錄。 |
若要進一步擴充,可參閱規則參考;但請先保留一份精簡且容易理解的規則清單。每新增一條規則,都應明確記錄比對對象、預期策略與放置理由,這比一次加入大量來源不明、難以核對的規則更容易排除問題。