内容纲要

🗂 本文目录:Surge 指南 >


代理策略

这是一个新的部分,它在配置文件中的位置和示例是这样的:

[General]

[Proxy]
Local = socks5, 127.0.0.1, 1080

[Rule]
FINAL,DIRECT

[Proxy] 块主要用于放置代理服务器信息。

如上示例,增加了一条代理服务器,名为 Local,协议为 SOCKS5、服务器地址为 127.0.0.1、端口为 1080。

那么该如何使用它呢?

[General]

[Proxy]
Local = socks5, 127.0.0.1, 1080

[Rule]
DOMAIN-SUFFIX,server.local,Local
FINAL,DIRECT

来看一份完整配置,看过之前的文章那就很清楚了,在访问本地服务器域名 server.local 及其子域名时使用代理服务器 Local 代理访问。

代理服务器支持的协议还有其他多种,在此不一一列举了,如果你不熟悉文本配置的方法可以通过图形界面的方式添加,然后看看文本配置是怎么样的。

策略组

Surge 提供多种不同类型的策略组以满足各种场景的不同需求,在具体讲解各种策略组前,需要先了解连通性测试:

  1. ICMP Ping 测试:简单的 Ping 测试,用于反映当前物理网络状况。
    Mac 版本首页卡片和网络诊断中的路由延迟为该测试结果。
  2. DNS 查询测试:向所有 DNS 服务器并行查询 bing.com 域名的 A 记录,结果为收到响应的最短时间,用于反映当前物理网络状况,同时简单确认具有 Internet 访问。
    Mac 版本首页卡片和网络诊断中的 DNS 延迟,Mac 版本主菜单和 iOS 版本通知中心插件的连通性测试延迟为该测试结果。
  3. HTTP 测试:向目标 HTTP 服务器发出 HEAD 请求,计算收到响应头的时间,任意响应数据包均判定为有效。测试地址可自定义,建议选择在全球都有节点的 URL。
    Mac 版本首页卡片的 Internet 和代理延迟,策略组的判断基准,网络诊断的代理测试为该测试结果。

策略组使用方法 3 作为判断基准而非方法 1 是因为:

  1. 代理服务器可能有中转,Ping 测试只能表示到达中转服务器的延迟。
  2. 除了与代理服务器间的连通性,代理服务器的 DNS 和出口网络情况也应该进行考量。
  3. 某些代理协议因设计欠考虑,会引入额外的延迟开销,如 SOCKS5,也应当被考量。
[General]

[Proxy]

[Proxy Group]

[Rule]
FINAL,DIRECT

策略组的块名为 [Proxy Group],目前有 5 种策略组类型:

  • select:通过 UI 菜单手动选择一个策略;
  • url-test:自动选择延迟最低的策略;
  • fallback:自动选择可用的策略中,最靠前的策略;
  • ssid:根据当前的 Wi-Fi SSID 选择一个策略;
  • load-balance:随机使用一个子策略,可选进行可用性检查;

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 的手动选择策略组,该策略组下可选那三个代理服务器中的某一个或是直连;
  3. FINAL 类型规则使用 PROXY 策略组的结果;
  4. 只有 FINAL 一条规则所以相当于全局,所以全局是代理(且是代理中的哪个服务器),还是直连就取决于对 PROXY 策略组的选择。

url-test:URL 延迟自动测试

并发测试所有子策略,选择延迟最低的策略。

[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 = url-test, Server1, Server2, Server3 url=http://www.gstatic.com/generate_204, interval=600, tolerance=100, timeout=5

[Rule]
GEOIP,CN,DIRECT
FINAL, PROXY,dns-failed

上述配置示例是 Surge iOS 4.6 和 Surge Mac 4 之前的旧版本配置。

先说旧版本中的选项含义:

  • url:测试 URL,Surge 将向该 URL 发送一个 HTTP HEAD 请求。测试只关心是否收到了返回数据,并不关心数据内容。仅支持 http:// 协议。
  • interval:间隔(秒):在间隔时间后丢弃先前的测试结果,当该策略组被再次使用时将触发一次新的测试。
  • tolerance:容忍度(毫秒),仅当新测试的获胜策略超过旧获胜策略加上容忍度后再进行切换。
  • timeout:超时(秒),超过超时时间后放弃该策略。

然后来看 Surge iOS 4.6 和 Surge Mac 4 之后的新版本配置,在旧版本 Surge 中,策略组的选项放置在策略组中,而新版本 Surge 放置于 [General] 中:

[General]
proxy-test-url = http://www.gstatic.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

[Proxy Group]
PROXY = url-test, Server1, Server2, Server3

[Rule]
GEOIP,CN,DIRECT
FINAL, PROXY,dns-failed

在新版本 Surge iOS 4.6 和 Surge Mac 4 中 Surge 重构了策略组功能,url-test/fallback/load-balance 策略组不再可以单独配置测速用 URL,只可以使用全局的测速 URL 或者策略配置的测速 URL(也就是 Server3test-url 参数,它可以覆盖掉 [General]proxy-test-url 设置)。该修改后策略的测速结果可直接用于所有策略组的决策中,不再需要为每个策略组都单独重测。

之后的示例都将以新版本 Surge 为主。

fallback:URL 可用性自动测试

与 url-test 组基本一致,区别是只关心子策略是否可用而不关心具体延迟,然后从可用策略中选择靠前的策略。可以通过调小 timeout 参数将缓慢线路也标记为不可用。该类型没有 tolerance 参数。

[General]
proxy-test-url = http://www.gstatic.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

load-balance:负载均衡

负载均衡组,随机从子策略中选取一个策略使用。

当配置了 url 参数时,会按照 fallback 组的行为进行可用性检查,然后仅从可用的子策略中随机选取。

[General]
proxy-test-url = http://www.gstatic.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,又名 per connection classifier)。

persistent:当 persistent=true 时,对于同一目标主机名,将尽量使用同一个策略。避免因出口 IP 不同而触发目标网站的风险控制。但当可用性改变时可能导致策略变化。

PROXY = load-balance, Server1, Server2, Server3,persistent=true

SSID

临时禁用 (SSID Suspend)

在谈论「SSID 策略组」之前还需要提到一个与之类似的的功能:临时禁用。它不属于策略组,但其功能与「SSID 策略组」类似。

⚠️ 注意:该功能仅支持 iOS 版 Surge。从 Surge iOS 4.7.0 开始,SSID Suspend 功能支持使用通配符。

[General]

[Rule]
RULE-SET,https://www.example.com/reject.list,REJECT
FINAL,DIRECT

[SSID Setting]
"Home" suspend=true

该功能可以在连接到某些网络时,临时禁用 Surge。

假设你家里的 WiFi 网络名称(SSID) 为 Home,且部署了 AdGuard Home,你想要在外使用 Surge 拦截广告而在家中使用 AdGuard Home 就可以使用 [SSID Setting],如上示例,在遇到 WiFi 网络名称(SSID) 为 Home 时 Surge 将会临时禁用。

这个功能比较的简洁,如果你只是想更改某个策略的行为而不是将整个 Surge 挂起,那么就需要用到 SSID 策略组。

SSID 策略组

[General]
dns-server = system

[Proxy Group]
Guard = ssid, default = REJECT, "Home" = DIRECT

[Rule]
RULE-SET,https://www.example.com/reject.list,Guard
FINAL,DIRECT

在上面这个例子中,我们引用了一个专门用于去广告的规则集,该 Ruleset 没有直接设置 REJECT 策略,而是使用了名为 Guard 的策略组,这是一个 SSID 策略组,它表示在默认情况下它是一个阻止策略,但在 SSID 为 Home 的网络下它将使用直连策略。

⚠️ 注意:如 AdGuard Home 这样的服务需要保证客户端的设置使用它的 DNS 服务器地址,所以 dns-server 要确保只设置了 system。否则在 Surge 的 DNS 并发请求特性下可能获得其他自定义 DNS 的结果从而导致依赖于 AdGuard Home 的去广告失效。

另外,虽然名字依然是 SSID 策略组,但是功能已经扩展,可根据当前网络的 SSID、BSSID、路由 IP 地址等因素选择子策略。iOS 版本还可以为数据网络指定策略。

禁用组策略变化通知

若要禁用组策略变化的通知,可以在该策略组加上 no-alert=true,如:

[Proxy Group]
PROXY = url-test, Server1, Server2, Server3, no-alert=true

隐藏策略组

使用参数 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」的代理服务器。

自定义内置策略

你可能会想要对内置策略进行改名个性化,那么可以在 [Proxy] 中如下操作:

[General]

[Proxy]
🌐Direct = direct
⛔️Reject = reject

[Rule]
DOMAIN-SUFFIX,doubleclick.net,⛔️Reject
FINAL,🌐Direct

参考