Surge - 转发,策略和规则
规则系统中有两个基本概念:策略和规则。
请求在处理完毕后将被转发。如果 Surge 的出站模式设置为直接连接,那么该请求将被直接发往目标服务器;如果出站模式设置为全局代理,那么将转发给代理服务器;
当出站模式设置被设置为规则判定时,将根据配置的规则决定转发策略。
策略
策略:描述了 Surge 进行转发的方式,有三种类别:
- 内置策略:DIRECT、REJECT、REJECT-TINYGIF、REJECT-DROP
- 代理策略:每个策略对应一个代理服务
- 策略组:根据一定的规则从子策略中选择一个最终策略。
内置策略
内置策略由 Surge 提供,不随配置而变化:
- DIRECT:将该请求直接发往目标服务器
- REJECT:拒绝该请求,当连接类型为 HTTP 时,会返回一个错误页面。(该行为可被 show-error-page-for-reject 参数控制)
- REJECT-TINYGIF:拒绝该请求,当连接类型为 HTTP 时,返回一个 1px 的 GIF 图片响应。若为其他类型连接则直接断开。该策略主要用于 Web 广告屏蔽。
- REJECT-DROP:拒绝该请求,与 REJECT 不同的是,该策略将静默抛弃请求。因为部分程序有着十分暴力的重试逻辑,连接失败后会立刻进行重试,导致请求风暴。
由于操作系统对用户空间程序(user-space program)的 socket 并没有提供抛弃的操作,Surge 静默抛弃的实现方式是将该 socket 闲置一段时间后再关闭。
同时,如果发往某主机名的请求短时间内大量触发 REJECT/REJECT-TINYGIF 策略(当前版本的阈值为 30 秒内 10 次),为了避免产生大量资源浪费,Surge 将自动升级策略为 REJECT-DROP 策略。
代理策略
代理策略由用户自己定义,每个策略描述了一个代理服务,当使用该策略时即为通过该代理服务转发请求。
策略组
Surge 提供多种不同类型的策略组以满足各种场景的不同需求,在具体讲解各种策略组前,需要先了解连通性测试。
连通性测试
Surge 的多个功能会用到连通性测试,测试方式有 3 种:
- ICMP Ping 测试:简单的 Ping 测试,用于反映当前物理网络状况。Mac 版本首页卡片和网络诊断中的路由延迟为该测试结果。
- DNS 查询测试:向所有 DNS 服务器并行查询 bing.com 域名的 A 记录,结果为收到响应的最短时间,用于反映当前物理网络状况,同时简单确认具有 Internet 访问。Mac 版本首页卡片和网络诊断中的 DNS 延迟,Mac 版本主菜单和 iOS 版本通知中心插件的连通性测试延迟为该测试结果。
- HTTP 测试:向目标 HTTP 服务器发出 HEAD 请求,计算收到响应头的时间,任意响应数据包均判定为有效。测试地址可自定义,建议选择在全球都有节点的 URL。Mac 版本首页卡片的 Internet 和代理延迟,策略组的判断基准,网络诊断的代理测试为该测试结果。
策略组使用方法 3 作为判断基准而非方法 1 是因为:
- 代理服务器可能有中转,Ping 测试只能表示到达中转服务器的延迟。
- 除了与代理服务器间的连通性,代理服务器的 DNS 和出口网络情况也应该进行考量。
- 某些代理协议因设计欠考虑,会引入额外的延迟开销,如 SOCKS5,也应当被考量。
一个策略组可以包括多个子策略
子策略可以是一个代理策略,或者另一个策略组,或者是一个内置策略 (DIRECT 或 REJECT)。
有 5 种策略组类型: select, url-test, fallback, ssid 和 load-balance
select 策略组
通过 UI 菜单选择一个策略
url-test 策略组
并发测试所有子策略,选择延迟最低的策略。有以下几个参数:
- url:用于测试的 URL(该参数新版 Surge 已无需在策略组中添加)。
- timeout:可选, 秒 (默认值: 5s),测试的最长等待时间。如果某策略在该时间后依然没有完成,放弃该策略。
- interval:可选, 秒 (默认值: 600s) 每次测试的间隔时间。指定在多长时间后,上次的测试结果将被抛弃。所有类 url-test 组的测试时机为:
- 首次使用时进行测试。
- 后续使用该策略组时,如果上次测试的时间间隔已大于 interval 设置时间,则再次触发测试。
- 当目前选中策略产生不可恢复性错误时,直接触发测试。
- 网络切换后,将清理之前的测试结果,当策略组被使用时触发首次测试。
- tolerance:可选, 毫秒 (默认值: 100ms) 容忍度,如果某几个策略测试结果相差不大,那么会导致在这几个策略中频繁切换,如果策略的代理服务器的出口 IP 不同,可能会触发目标网站的风险控制。所以加入了容忍度设计,仅当新一次的测试结果中,最佳策略比原选中策略的延迟差大于容忍度时,才会切换至新的策略。
- evaluate-before-use:默认情况下,在首次使用策略组时将直接使用子策略中的第一个策略,同时触发延迟测试。如果配置了 evaluate-before-use=true,那么首次使用时将等待测试完毕后选择最佳策略。
fallback 策略组
与 url-test 组基本一致,区别是只关心子策略是否可用而不关心具体延迟,然后从可用策略中选择靠前的策略。可以通过调小 timeout 参数将缓慢线路也标记为不可用。该类型没有 tolerance 参数。
load-balance 策略组
负载均衡组,随机从子策略中选取一个策略使用。
使用 [General] url 参数时,按照 fallback 组的行为进行可用性检查,然后仅从可用的子策略中随机选取。
除 url、timeout、interval外,还有一个参数:
persistent:当 persistent=true 时,对于同一目标主机名,将尽量使用同一个策略。避免因出口 IP 不同而触发目标网站的风险控制。但当可用性改变时可能导致策略变化。
ssid 策略组
虽然名字依然是 SSID 策略组,但是功能已经扩展,可根据当前网络的 SSID、BSSID、路由 IP 地址等因素选择子策略。iOS 版本还可以为数据网络指定策略。
[Proxy Group]
Adblock = ssid, default = REJECT, "SSID Here" = DIRECT
[Rule]
RULE-SET,https://www.example.com/reject.list,Adblock
FINAL,DIRECT
如上示例,规则中添加了一条被拒绝规则集,该规则集没有直接指定内置 REJECT 策略,而是添加了一个 Adblock 的 SSID 策略组,表示在默认情况下它是一个 REJECT 策略,但在 SSID 为 “SSID Here” 的网络下使用直连策略。
策略组其它参数(隐藏、禁用通知、过滤器)
[Proxy Group]
# 参数 hidden=true 隐藏该策略组,在 UI 界面将不被展示
# 参数 no-alert=true 禁用策略组变化通知
# 参数 policy-regex-filter=台湾 节点过滤器,表示这条订阅中筛选出台湾节点
标签:REJECT,策略,IP,转发,Surge,测试,规则
From: https://www.cnblogs.com/homjun/p/16802093.html