Shadowrocket 規則設定入門:DOMAIN、DOMAIN-SUFFIX、GEOIP、IP-CIDR 與 FINAL 的比對範圍

透過實際規則範例,了解六種規則類型的比對對象:完整網域、網域後綴、關鍵字、IP 地理位置、IP 位址範圍,以及為何 FINAL 必須放在最後。

本文重點

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 表示交由代理路徑處理,這一欄不需填入既有伺服器的位址或密碼。引用設定中的自訂策略名稱時,名稱必須與實際定義相符。

6 種類型
本文涵蓋三種網域規則、兩種 IP 規則與 FINAL
3 個欄位
常見條件規則:類型、比對內容、策略
2 個欄位
FINAL:關鍵字與預設策略

結論:先決定預設去向,再加入例外

先決定未符合任何規則的請求應使用 DIRECT 或 PROXY,將對應的 FINAL 放在清單末尾,再於上方加入範圍明確的例外;不要用大量關鍵字規則取代明確的預設策略。

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,DIRECTIPv4 目的位址確認實際目的位址是否落在指定前綴範圍內。
no-resolve比對時已可取得的目的 IP避免只為這條 IP 規則額外觸發網域解析。

no-resolve 不是「禁止所有 DNS 查詢」,也不是「一律直連」的開關。若請求只有網域、尚無可用 IP,帶有此選項的 IP 規則不會為了比對而主動解析網域,請求可能繼續往下檢查。IPv6 位址範圍需使用對應的 IP-CIDR6 規則,不能直接將 IPv6 前綴當成上述 IPv4 範例的比對對象。

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 能否建立連線,仍取決於使用者既有代理設定是否有效。

  1. login.example.com:符合第一條規則,選擇 DIRECT。
  2. static.example.com:符合第二條規則,選擇 PROXY,不再檢查 GEOIP。
  3. 192.168.1.20:若先前沒有網域規則符合,便會進入私有網段規則並選擇 DIRECT。
  4. 其他請求:先依序檢查其餘條件;若都不符合,則由 FINAL 選擇 PROXY。

5. 在 Config 中修改與驗證

以下步驟以 iPhone / iPad 上的 Home、Config 介面為例。操作前請先備份現有設定;不要將整份設定替換成只有 [Rule] 的片段。若現有設定已包含該區段,請在原區段中調整,不要重複新增同名區段。遠端設定再次更新時,可能會覆寫本機修改;請先確認正在編輯的是本機副本還是更新來源。

  1. 備份設定

    進入 Config,找到目前使用的設定,先保存原始內容並記下檔名,之後才能確認啟用與編輯的是同一個檔案。

  2. 編輯規則

    在 Config 開啟目標設定的編輯介面,找到 [Rule]。加入一條明確的網域規則,並確認 FINAL 仍位於清單最後。

  3. 啟用設定

    儲存後,在 Config 確認已選取修改過的設定,再返回 Home → Global Routing → Config,避免目前仍處於 Proxy、Direct 或其他場景狀態。

  4. 建立新連線

    中斷後重新連線,關閉測試頁面原有的連線,再前往目標網域。查看連線記錄中的目的位址、符合的規則與最終策略;不要只確認網頁是否能開啟。

  5. 逐項檢查

    分別測試完整網域、同網域子網域與未符合規則的網域。每次只修改一個條件或順序,並記錄差異;若出現異常,先還原備份,再縮小測試範圍。

既有的 TCP 長連線或重用連線可能繼續沿用建立時的路徑;儲存規則後,它們不一定會立即切換。瀏覽器顯示的頁面也可能來自快取。因此,只刷新一次頁面、看起來沒有變化,並不足以證明規則未生效,應搭配新連線的記錄判斷。

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 測試。
修改後短時間內仍走舊路徑舊連線重用與頁面快取重新建立連線後,查看新的規則比對記錄。

若要進一步擴充,可參閱規則參考;但請先保留一份精簡且容易理解的規則清單。每新增一條規則,都應明確記錄比對對象、預期策略與放置理由,這比一次加入大量來源不明、難以核對的規則更容易排除問題。

Shadowrocket 全平台下載