首页 > 其他分享 >Surge - 转发,策略和规则

Surge - 转发,策略和规则

时间:2022-10-18 14:24:29浏览次数:62  
标签:REJECT 策略 IP 转发 Surge 测试 规则

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 种:

  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 是因为:

  • 代理服务器可能有中转,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

相关文章

  • 规则引擎
    查看代码//定义规则usingNewtonsoft.Json;usingRulesEngine.Models;//模拟用户的输入内容varinputValue=newInputValue{Score=60};varrulesStr......
  • [答疑]计算价钱“规则很复杂”的责任分配
    Alan2020-6-210:01在并多的案例中,计算价钱由拼单子订单完成,拼单子订单有数量,就能计算价格,实际上计算价格影响的因子比较多,比如价格,2件以上再打9.5折,顾客类型(高级会员),在......
  • 规则引擎深度对比,LiteFlow vs Drools!
    前言Drools是一款老牌的java规则引擎框架,早在十几年前,我刚工作的时候,曾在一家第三方支付企业工作。在核心的支付路由层面我记得就是用Drools来做的。难能可贵的是,Drools......
  • 阿里云CLB代理https转发到harbor
    阿里云CLB代理https转发到harbor背景原来的harbor仓库和业务应用在同一台机器上,且没有域名。现在需要迁移到一台单独机器上并配置域名。迁移harbor#原来的harbor在启......
  • 【LeetCode】1773. 统计匹配检索规则的物品数量(C++)
    1773.统计匹配检索规则的物品数量(C++)​​1题目描述​​​​2示例描述​​​​2.1示例1​​​​2.2示例2​​​​3解题提示​​​​4解题思路​​​​5源码详解(C++)​......
  • Python缩进规则(包含快捷键)
    和其它程序设计语言(如 Java、C语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号(:)来区分代码块之间的层次。在Python中,对于类定义、函数定义、流程控制......
  • SpringMVC(五):重定向和请求转发
    我们都知道通过servlet跳转到具体的视图有两种方式,一种方式是重定向,一种方式请求转发。那么在SpringMVC中视图解析后跳转是哪种方式实现的呢?很明显在我们发起请求时地址栏......
  • win11扯蛋的防火墙:远程桌面默认只添加了UDP端口规则
    win11扯蛋的防火墙:远程桌面默认只添加了UDP端口规则。开启防火墙后,导致win10以下的mstsc客户端无法访问。解决办法就是在防火墙高级设置,添加远程桌面端口(默认3389)的TCP......
  • Kubernetes Traefik 路由规则及中间件 Traefik Middlewares 的配置 (k3s)
    系统环境:  Traefik版本:v2.2.0Kubernetes版本:K3s1.23.6一、什么是TraefikTraefik是一款开源的边缘路由器,现在本人主要要作用于kubernetes中对外的网关,即Ingress路......
  • proxifier 设置代理转发 对于IP地址的转发 也可以指定 这下C2裸IP的伪造可以做了
    proxifier支持应用名或者IP端口直接转发:如下是示例   例如在恶意代码分析实战的实验里,看到恶意软件使用svchost发送网络请求:  我的proxifier设置如下:  ......