Shadowrocket REJECT 規則設定指南:封鎖原理、適用範圍與限制

了解 Shadowrocket 的 REJECT 策略如何套用於規則比對,以及 DOMAIN-SUFFIX 等寫法的封鎖效果與適用限制。

本文重點

本文適合已使用 Config 分流,並想封鎖特定連線目標的使用者。先確認 REJECT 的作用,再依序使用完整網域、網域後綴或目標 IP 編寫規則,最後查看連線記錄,確認規則是否命中及有無誤封。範例網域僅用於說明語法,實際目標請依自己的連線記錄判斷。

REJECT 的作用:封鎖符合條件的連線

REJECT 是一種策略,不是獨立的比對條件。規則前半段用來判斷目標是否符合條件,末尾的 REJECT 則指定命中後的處理方式。例如 DOMAIN,metrics.example.com,REJECT 表示比對完整網域,並拒絕該連線;它不會自動辨識所有統計服務,也不會自動產生網域清單。

App 發出連線 隧道接收流量 依序比對規則 命中拒絕策略 連線遭到封鎖

這個流程的前提是連線進入 Shadowrocket 的處理範圍,而且目前使用規則分流。REJECT 不是先把完整內容傳送到目標,再隱藏回傳頁面;它是在處理連線時阻止後續通訊。發出請求的 App 可能顯示連線失敗、重試或逾時,實際情況取決於 App 本身的處理方式,不能只憑畫面提示判斷是哪條規則生效。

規則通常由上而下比對,第一條命中的規則會決定採用哪種策略。因此,「已寫入 REJECT」不代表「連線實際採用 REJECT」:若前面已命中範圍較廣的放行規則,後面的封鎖規則就不會處理這次連線。排查時必須一併確認目標、規則順序及目前生效的設定。

先確認 Config,再新增範圍最小的規則

在 Home 的 Global Routing 中選擇 Config,再到 Config 確認目前使用的設定檔。Proxy 和 Direct 都不能取代這個步驟;若使用 Scene,也要確認目前場景實際採用的設定檔與路由方式,不能只因某個設定檔內有 REJECT,就認定它已生效。

  1. 先在 Config 保留目前設定檔的副本,並記下原有規則順序與 FINAL 策略,以便還原。
  2. 開啟目前使用的設定檔,透過編輯功能找到 [Rule] 區段。先新增一條完整網域規則,不要急著擴大到整組網域。
  3. 將這條規則放在可能先命中的廣泛規則之前,同時保留業務所需的精確例外。
  4. 儲存設定檔,並確認它仍是目前使用中的設定檔。關閉目標 App 的既有連線,再重新執行相同操作。
  5. 查看這次連線的目標與策略;只有新連線實際命中 REJECT,才能確認封鎖規則運作正常。

若設定檔會從遠端來源更新,請先確認本機修改是否會被後續更新覆蓋。訂閱與節點請向你的服務商取得;伺服器訂閱更新和 Config 規則修改是不同操作,重新整理伺服器清單不代表新規則已載入。

DOMAIN、DOMAIN-SUFFIX 與 IP-CIDR 的寫法

優先採用足以涵蓋目標、且範圍最小的條件。完整網域適用於單一主機;網域後綴適用於需要一併處理的網域及其子網域;IP 網段則適用於已確認地址範圍的目標。網域欄位不要填入 https://、路徑、查詢參數或連接埠。

依網域比對

完整網域
DOMAIN,metrics.example.com,REJECT
網域後綴
DOMAIN-SUFFIX,metrics.example.com,REJECT
比對差異
前者只比對指定主機;後者也會比對其下的子網域。

後綴依網域層級比對,不是比對任意包含該文字的內容。

依目標 IP 比對

單一 IPv4 位址
IP-CIDR,192.0.2.8/32,REJECT
IPv4 網段
IP-CIDR,192.0.2.0/24,REJECT
範例用途
此處使用文件範例位址,並非實際封鎖目標。

請依實際連線位址確認範圍,勿將共用位址誤認為單一服務。

DOMAIN-SUFFIX,metrics.example.com,REJECT 可比對 metrics.example.com 和 img.metrics.example.com,但不會比對 othermetrics.example.com。也不必寫成 *.metrics.example.com;萬用字元不是這條規則的後綴參數寫法。

3 個欄位
上述 DOMAIN 規則:類型、目標、策略
/32
IPv4 前綴長度:精確比對單一位址
/24
IPv4 位址範圍:共 256 個位址

IP 規則與網域規則不能互相取代。同一網域可能解析到多個位址,同一個位址也可能承載多個網域;用戶端也可能改用其他位址或 IPv6。只拒絕某個 IPv4 位址,不能據此認定相關網域的所有連線都已封鎖。GEOIP 依位址歸屬比對,範圍較廣,不適合取代針對特定網域的精確封鎖。

規則順序:先設例外,再封鎖,FINAL 保留在末尾

以下示範一組刻意保留例外的規則:允許指定主機直接連線,再拒絕同一後綴下的其他主機。範例中的 PROXY 必須是設定檔內可用的策略或策略組名稱;若目前設定檔使用其他名稱,請保留原有 FINAL 行,不要直接照抄範例作為兜底策略。

[Rule]
DOMAIN,health.metrics.example.com,DIRECT
DOMAIN-SUFFIX,metrics.example.com,REJECT
FINAL,PROXY
連線目標第一條命中的規則結果
health.metrics.example.com第一條 DOMAIN採用 DIRECT
img.metrics.example.com第二條 DOMAIN-SUFFIX採用 REJECT
www.example.com末尾的 FINAL採用範例中的 PROXY

若把後綴封鎖規則放在第一行,健康檢查主機也會先命中 REJECT,後面的 DOMAIN 例外便無法放行。相反地,若在封鎖規則前加入 DOMAIN-SUFFIX,example.com,DIRECT,這些目標就會先被放行。FINAL 負責處理其餘連線,若放在封鎖規則之前,後續規則就沒有比對機會。

判斷方式:需要例外時,先縮小規則範圍

先將必要主機的精確規則移到廣泛封鎖規則之前,再重新驗證。不要為處理單一誤封而刪除所有 REJECT 規則,也不要用範圍更廣的 DIRECT 規則掩蓋順序問題。

封鎖的適用範圍與限制

REJECT 適合封鎖目標明確、可依網域或位址區分的連線,例如使用者已確認不需要存取的獨立資源主機。它比對的是連線目標,不是頁面中的每個視覺元素,更不會辨識所有內容的語意。

DNS 解析失敗與命中 REJECT 也要分開判斷。前者可能發生在取得目標位址之前;後者則應有對應的規則策略記錄。看到網域無法開啟,不能直接歸因於 REJECT。另外,網域資訊是否能用於比對,取決於實際請求與解析流程;若只有位址資訊,請搭配連線記錄檢查 IP 相關規則,不要假設一定有網域條件可供比對。

規則未生效、誤封與還原方式

驗證時一次只調整一個變數:使用同一個 App、執行相同操作,並維持相同網路環境,比較修改前後的新連線。以下依「是否使用正確設定檔、規則是否命中、結果是否受快取影響」的順序排查。

規則已儲存,為什麼目標還是能開啟?

先確認 Home → Global Routing 是否選擇 Config,再檢查 Config 中實際使用的設定檔。接著查看目標的新連線是否先命中前面的 DIRECT、PROXY 或其他廣泛規則;不要只檢查檔案中有沒有 REJECT 這一行。

顯示命中 REJECT,為什麼頁面仍有原本的內容?

關閉目標 App 後重新開啟,確認畫面內容是來自快取,還是由新請求取得。檢查頁面是否改從其他網域載入資源,並記錄這些連線;快取內容仍顯示在畫面上,不代表命中的請求已獲放行。

新增後綴規則後,登入或圖片也失效了,該怎麼辦?

先停用剛新增的單條規則並重新測試,確認問題是否與它有關。接著從失敗記錄找出必要主機,改用範圍更小的 DOMAIN 封鎖,或在後綴規則前加入精確的放行例外;不要直接放行整個父網域。

更新設定檔後,先前的封鎖為什麼不見了?

對照已儲存的副本,檢查目前設定檔的 [Rule] 區段,確認本機修改是否遭遠端內容覆蓋。重新加入已驗證且範圍最小的規則,並保留原有 FINAL;不要把伺服器訂閱更新當成規則還原操作。

需要還原時,優先移除最後新增的封鎖規則,儲存後重新建立目標連線;如果已修改多處而無法確認先後順序,請還原先前保留的設定檔副本。記下測試目標、命中規則與還原結果,比反覆切換所有設定更容易找出原因。

在 App Store 確認正版