本文整理自官方文檔: 《Surge 官方中文指引:理解 Surge 原理 - 章節 4 轉發,代理和規則系統》
本文旨在介紹清楚概念,所以只描述常用只要功能,更多細節請參考官方文檔。
被 Surge 攔截的請求在處理完畢後將被轉發。
如果 Surge 的出站模式設置為 直接連接 ,那麽該請求將被 直接發往目標服務器 ;
如果出站模式設置為 全局代理 ,那麽將 轉發給指定的代理服務器 ;
當出站模式設置被設置為 規則判定 時,將 根據配置的規則決定轉發策略 。
規則系統中有兩個基本概念: 策略 和 規則
1、策略:描述了 Surge 進行轉發的方式,有三種類別:
2、規則:規則由四個部分組成:類型、條件、策略和參數。當條件滿足時,該規則匹配,使用該規則指定的策略。
內置策略由 Surge 提供,不隨配置而變化:
由於操作系統對用戶空間程序(user-space program)的 socket 並沒有提供拋棄的操作,Surge 靜默拋棄的實現方式是將該 socket 閑置壹段時間後再關閉。
同時,如果發往某主機名的請求短時間內大量觸發 REJECT/REJECT-TINYGIF 策略(當前版本的閾值為 30 秒內 10 次),為了避免產生大量資源浪費,Surge 將自動升級策略為 REJECT-DROP 策略。
代理策略由用戶自己定義,每個策略描述了壹個代理服務,當使用該策略時即為通過該代理服務轉發請求。
壹個簡單的代理策略定義行如下:
其中,ProxyA 為策略名,供規則和策略組所使用。第壹個參數為代理協議類型,目前 Surge 支持的代理協議類型有:
另外還有兩個特殊類型:
第二個參數為代理服務器主機名,第三個參數為代理服務器端口號,後續為 key=value 的參數表,根據協議類型不同需要提供不同的參數。
這是壹個特別的類型,嚴格來說並不是壹個代理,用於強制使用某壹個網卡進行請求。
external 類型策略可以讓 Surge 與其他代理客戶端(如:SSR、Brook)更方便的協同工作。
該功能 目前只能通過直接編輯配置 實現,策略定義行為:
其中 args 和 addresses 參數為選填,其他必填。args 和 addresses 字段可以反復使用進行追加。
當使用到該策略時 Surge 會進行以下工作:
(1)使用 exec 和 args 參數啟動該外部程序,之後向 SOCKS5 127.0.0.1:[local-port] 轉發請求。
(2)如果外部進程被終止,當再次使用該策略時會自動進行重啟。
(3)Surge 會在啟動增強模式時自動將 addresses 參數中的地址排除在 VIF 路由表外。(請在該字段填寫使用的代理服務器 IP 地址)
(4)當由 Surge 啟動的外部進程的請求被 Surge VIF 處理時,永遠使用 DIRECT 策略。(為了應對像 obfs-local 這樣的插件請求問題,外部進程的子進程也會被同樣處理)
(5)Surge 退出時會自動關閉所有外部進程,增強模式關閉時會自動清理加入的路由表。
上述 3 和 4 的功能是有重疊的,請盡量使用 addresses 聲明使用到的地址以排除 TUN 處理,這樣可以減少系統開銷,4 的功能是壹重額外保護。
RULE-SET 規則集可以將 多個子規則 放在 壹個單獨的文件中 ,便於分享和復用。但是規則集中的規則 不可以指定策略 ,整個規則集指向壹個同壹個策略。
另外 Surge 自帶了 SYSTEM 和 LAN 兩個規則集,規則集包含的具體子規則會隨 Surge 更新而有所調整。註意 LAN 規則集會觸發 DNS 解析。
可通過 AND,OR,NOT 運算對所有規則類型進行組合使用。如
可以攔截 Chrome 發出的 UDP 數據包。
(完)