Surge 代理策略与策略组

内容纲要

查看【Surge】专题可浏览更多内容

代理策略

「代理策略」配置在配置文件的 [Proxy] 下面:

[General]

[Proxy]
Local = socks5, 127.0.0.1, 1080

[Rule]
DOMAIN-SUFFIX,example.com,Local
FINAL,DIRECT

如上示例,意思为:

  1. 增加了一条代理服务器,名为 Local,协议为 SOCKS5、服务器地址为 127.0.0.1、端口为 1080;
  2. 在访问本地服务器域名 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

举例来说,身处分公司的你有业务需要连接到总公司的内网进行处理,但是:

  1. 进入总公司内网需要先连接到总公司的代理服务器;
  2. 分公司的网络处于封闭网络,在分公司连接到外部网络时,需要先连接到分公司的代理服务;

那么就可以使用代理链功能:总公司的代理服务器通过分公司的代理服务器连接出去。

策略组

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

表示:

  1. 这个配置中有三个 SOCKS5 代理服务器;
  2. 有一个名为 PROXY 的 Select 选择策略组,该策略组下可选那三个代理服务器中的某一个或是直连;
  3. FINAL 类型规则使用 PROXY 策略组的选择,也表示在规则中策略组也可以作为策略使用;
  4. 只有 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,当 Server1Server2 都挂掉时自动选择 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

urltimeoutinterval 外,还有一个参数:
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-proxiesinclude-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 设置为 true1 时,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 直接选择 AB 里的所有服务器了。


延伸