Surge 代理策略与策略组
查看【Surge】专题可浏览更多内容
代理策略
「代理策略」配置在配置文件的 [Proxy]
下面:
[General]
[Proxy]
Local = socks5, 127.0.0.1, 1080
[Rule]
DOMAIN-SUFFIX,example.com,Local
FINAL,DIRECT
如上示例,意思为:
- 增加了一条代理服务器,名为
Local
,协议为 SOCKS5、服务器地址为 127.0.0.1、端口为 1080; - 在访问本地服务器域名
example.com
及其子域名时使用代理服务器Local
代理访问;
代理服务器支持的协议还有其他多种,在此不一一列举了,如果你不熟悉文本配置的方法可以通过图形界面的方式添加,然后看看文本配置是怎么样的。
内置策略
DIRECT
表示将该请求直接发往目标服务器REJECT
表示拒绝该请求,当连接类型为 HTTP 时,会返回一个错误页面。(该行为可被show-error-page-for-reject
参数控制)REJECT-TINYGIF
表示拒绝该请求,当连接类型为 HTTP 时,返回一个 1px 的 GIF 图片响应。若为其他类型连接则直接断开。该策略主要用于 Web 广告屏蔽。REJECT-DROP
表示拒绝该请求,与REJECT
不同的是,该策略将静默抛弃请求。因为部分程序有着十分暴力的重试逻辑,连接失败后会立刻进行重试,导致请求风暴。如果发往某主机名的请求短时间内大量触发 REJECT/REJECT-TINYGIF 策略(当前版本的阈值为 30 秒内 10 次),为了避免产生大量资源浪费,Surge 将自动升级策略为REJECT-DROP
策略。REJECT-NO-DROP
表示不使用默认的自动丢包逻辑,这样 Surge 每次都会返回 ICMP Port Unreachable,应用会立刻回退而不是等超时。CELLULAR
表示优先使用数据网络;CELLULAR-ONLY
表示仅使用数据网络;HYBRID
表示尝试并发使用 Wi-Fi 和数据网络建立连接,仅当混合网络开关未开启时有意义。NO-HYBRID
表示当 Wi-Fi可用时永不尝试数据网络,仅当混合网络或 i-Fi 助力选项开启时有意义。
自定义内置策略
除了代理策略,对于 Surge 的内置策略也可以个性化:
[General]
[Proxy]
🌐Direct = direct
⛔️Reject = reject
[Rule]
DOMAIN-SUFFIX,doubleclick.net,⛔️Reject
FINAL,🌐Direct
IPv4 & IPv6 偏好
如果在启用「IPv6」的情况下,对于 IPv4 或 IPv6 有偏好,可使用附带参数 ip-version
,可选参数有:
dual
:默认行为,在双栈网络上将并发使用 v4 和 v6 地址并选取最快速的结果。prefer-v4
:若 DNS 解析获得了 A 与 AAAA 记录,优先使用 A 记录,否则使用 AAAA 记录。prefer-v6
:若 DNS 解析获得了 A 与 AAAA 记录,优先使用 AAAA 记录,否则使用 A 记录。v4-only
:仅使用 A 记录,若未获得A记录则失败。v6-only
:仅使用 AAAA 记录,若未获得 AAAA 记录则失败。
[General]
[Proxy]
🌐Direct = direct, ip-version=prefer-v4
🌐DirectV6 = direct, ip-version=v6-only
⛔️Reject = reject
[Rule]
DOMAIN-SUFFIX,example.com,🌐DirectV6
FINAL,🌐Direct
如上示例的意思为:在访问 example.com
及其子域名时,仅使用 IPv6 地址,而默认情况下优先使用 IPv4 地址。
代理链
代理链(Proxy Chain)可以使用一个代理连接到另一个代理。
[Proxy]
ServerA = socks5, 192.168.1.1, 1080
ServerB = https, 1.2.3.4, 443, username=user, password=password, underlying-proxy=ServerA
如上示例,在使用 ServerB 时是通过 ServerA 到 ServerB:
Surge <--> ServerA <--> ServerB <--> Internet
举例来说,身处分公司的你有业务需要连接到总公司的内网进行处理,但是:
- 进入总公司内网需要先连接到总公司的代理服务器;
- 分公司的网络处于封闭网络,在分公司连接到外部网络时,需要先连接到分公司的代理服务;
那么就可以使用代理链功能:总公司的代理服务器通过分公司的代理服务器连接出去。
策略组
Surge 提供多种不同类型的策略组以满足各种场景的不同需求。
「代理策略」配置在配置文件的 [Proxy Group]
下面:
[General]
[Proxy]
[Proxy Group]
[Rule]
FINAL,DIRECT
目前有 5 种策略组类型:
- 手动选择:Select;
- URL 延迟自动测试:Auto Test;
- URL 可用性自动测试:Fallback;
- 子网:Subnet(原 SSID);
- 负载均衡:Load Balance;
策略组类型
手动选择策略组:Select
Select 策略组用于手动选择策略,可在界面上方便的切换使用策略。
[General]
[Proxy]
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080
[Proxy Group]
PROXY = select, Server1, Server2, Server3, DIRECT
[Rule]
FINAL,PROXY
表示:
- 这个配置中有三个 SOCKS5 代理服务器;
- 有一个名为
PROXY
的 Select 选择策略组,该策略组下可选那三个代理服务器中的某一个或是直连; FINAL
类型规则使用PROXY
策略组的选择,也表示在规则中策略组也可以作为策略使用;- 只有
FINAL
一条规则所以相当于全局,所以全局是代理(且是代理中的哪个服务器),还是直连就取决于对PROXY
策略组的选择。
URL 延迟自动测试策略组:Auto Test
Auto Test 策略组,通过测试到某一个 URL 的访问确定延迟,并自动选择延迟最低的策略。
[General]
proxy-test-url = http://cp.cloudflare.com/generate_204
test-timeout = 5
[Proxy]
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080, test-url=http://cp.cloudflare.com/generate_204
[Proxy Group]
PROXY = url-test, Server1, Server2, Server3
[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY,dns-failed
如上示例,可以通过自动测试选出延迟最低的策略。
默认情况下使用 [General]
下的 proxy-test-url
设置的 URL 进行设置,Surge 将向该 URL 发送一个 HTTP HEAD 请求。测试只关心是否收到了返回数据,并不关心数据内容。仅支持 http://
协议。
如想要对指定策略使用指定 URL 可以在该策略使用 test-url
参数设置(如上示例)。
此外还有一些其他参数:
[Proxy Group]
PROXY = url-test, Server1, Server2, Server3, interval=600, tolerance=100, timeout=5, evaluate-before-use=false
timeout
:超时(秒),测试的最长等待时间,超过该时间的策略将标记为失败不再继续等待。interval
:间隔(秒),每次测试的间隔时间。所有类 url-test 组的测试时机为:- 首次使用时进行测试。
- 后续使用该策略组时,如果上次测试的时间间隔已大于 interval 设置时间,则再次触发测试。
- 当目前选中策略产生不可恢复性错误时,直接触发测试。
- 网络切换后,将清理之前的测试结果,当策略组被使用时触发首次测试。
tolerance
:容忍度(毫秒),仅当新测试的获胜策略超过旧获胜策略加上容忍度后再进行切换。如果某几个策略测试结果相差不大,那么会导致在这几个策略中频繁切换,如果策略的代理服务器的出口 IP 不同,可能会触发目标网站的风险控制。所以加入了容忍度设计,仅当新一次的测试结果中,最佳策略比原选中策略的延迟差大于容忍度时,才会切换至新的策略。evaluate-before-use
:默认情况下,在首次使用策略组时将直接使用子策略中的第一个策略,同时触发延迟测试。如果配置了evaluate-before-use=true
,那么首次使用时将等待测试完毕后选择最佳策略。
URL 可用性自动测试策略组:Fallback
Fallback 策略组通过测试某一个 URL 来确定可用性,按照优先级选择可用的策略。
[General]
proxy-test-url = http://cp.cloudflare.com/generate_204
test-timeout = 5
[Proxy]
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080
[Proxy Group]
PROXY = fallback, Server1, Server2, Server3
[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY,dns-failed
如上示例,简单来说当 Server1
挂掉时自动选择 Server2
,当 Server1
及 Server2
都挂掉时自动选择 Server3
。
Fallback 策略组的参数基本与 Auto Test 策略组一致(所以往上翻参考 Auto Test 策略组即可),但注意没有 tolerance
参数。
负载均衡策略组:Load Balance
Load Balance 负载均衡策略组用于让每个连接随机使用一个字策略。
[General]
proxy-test-url = http://cp.cloudflare.com/generate_204
test-timeout = 5
[Proxy]
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080
[Proxy Group]
PROXY = load-balance, Server1, Server2, Server3
[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY,dns-failed
除 url
、timeout
、interval
外,还有一个参数:
persistent
:维持策略(persistent,又名 per connection classifier)。当 persistent=true
时,对于同一目标主机名,将尽量使用同一个策略。避免因出口 IP 不同而触发目标网站的风险控制。但当可用性改变时可能导致策略变化:
[Proxy Group]
PROXY = load-balance, Server1, Server2, Server3, persistent=true
子网策略组:Subnet
从 Surge iOS 4.12.0 及 Surge Mac 4.0.5 开始,SSID 策略组升级为 Subnet 策略组。
[General]
[Proxy Group]
Subnet = subnet, default = REJECT, "TYPE:WIFI" = DIRECT
[Rule]
RULE-SET,https://www.example.com/reject.list,Subnet
FINAL,DIRECT
以上示例表示,规则 RULE-SET,reject.list
在默认情况下使用 REJECT
策略,但在 Wi-Fi 使用 DIRECT
策略。个人建议使用图形界面操作该策略组以便更好理解。
子网表达式可使用以下几种表示:
- 匹配 Wi-Fi 的 SSID:
SSID:value
; - 匹配 Wi-Fi 的 BSSID:
BSSID:value
; - 匹配路由的 IP 地址:
ROUTER:value
; - 匹配所有 Wi-Fi 网络:
TYPE:WIFI
; - 匹配所有有线网络:
TYPE:WIRED
; - 匹配所有蜂窝网络(仅 iOS):
TYPE:CELLULAR
; - 匹配指定蜂窝网络(仅 iOS):
MCCMNC:100-200
;
如果没有使用前缀,为了兼容旧版本配置,会尝试匹配 SSID/BSSID/路由 IP。
禁用组策略变化通知
若要禁用组策略变化的通知,可以在该策略组加上 no-alert=true
,如:
[Proxy Group]
PROXY = url-test, Server1, Server2, Server3, no-alert=true
隐藏策略组
使用参数 hidden=true
可用于隐藏策略组,被隐藏的策略组将不显示在策略组选择列表中,但是依然可以继续工作。
Fallback = fallback, Server1, Server2, hidden=true
外部代理列表
使用由代理服务商提供的代理列表,列表文件为一个纯文本,每一行包含一个代理声明。
也就是说可以将如下列示例的代理声明存成一个文本文件:
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080
然后在策略组中使用:
[Proxy Group]
Proxy = select, policy-path=https://www.example.com/Proxy.list
除了 select 策略组,也可以使用 url-test 等策略组进行自动选择。
外部代理列表还有两个选项:
自动更新间隔
可以使用 update-interval
来设置更新间隔,单位是秒,默认是 24 小时。
[Proxy Group]
Proxy = select, policy-path=https://www.example.com/Proxy.list, update-interval=86400
策略正则过滤器
可以使用 policy-regex-filter
选项来过滤代理列表,这是一个可选项,使用正则表达式匹配
[Proxy Group]
Proxy = select, policy-path=https://www.example.com/Proxy.list, update-interval=86400, policy-regex-filter=US
如上述示例可以只保留「外部代理列表」中代理名称带有「US」的代理服务器。
包含本地或其他策略组的策略
该功能主要为针对策略组的两个参数:include-all-proxies
及 include-other-group
,可与 policy-regex-filter
一起使用。
先说 include-all-proxies
,它用于是否包含 [Proxy]
中的代理策略:
[General]
[Proxy]
Server1 = socks5, 192.168.1.2, 1080
Server2 = socks5, 192.168.1.3, 1080
Server3 = socks5, 192.168.1.4, 1080
[Proxy Group]
PROXY = select, include-all-proxies=true
[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY,dns-failed
如上示例,当 include-all-proxies
设置为 true
或 1
时,PROXY
策略将包含 [Proxy]
下的三个策略 (等同于 PROXY = select, Server1, Server2, Server3
),使用 include-all-proxies
后就可以不用手动一个个添加策略。
而 include-other-group
用于设置该策略组是否包含其他策略组的策略,假设有多个订阅服务器列表的策略组:
[Proxy Group]
PROXY = select, A, B
A = select, policy-path=https://www.example-a.com/Proxy.list
B = select, policy-path=https://www.example-b.com/Proxy.list
按如上传统的做法,在选择代理服务时,先在图形菜单上的 PROXY
策略组下选择 A 列表或 B 列表,再到 A 或 B 列表下选择具体哪一个服务器。
那么如果想要在 PROXY
策略组下选择直接选择 A 与 B 列表里的所有服务器,就可以使用 include-other-group
参数:
[Proxy Group]
# 使用 include-other-group 直接使用使用某个策略组内的服务器节点
PROXY = select, include-other-group="A,B"
# 使用 hidden=true 隐藏掉该策略组
A = select, policy-path=https://www.example-a.com/Proxy.list, hidden=true
B = select, policy-path=https://www.example-b.com/Proxy.list, hidden=true
如上就可以在 PROXY
直接选择 A
与 B
里的所有服务器了。
延伸