https://manual.nssurge.com/book/understanding-surge/cn/
核心能力有四项:
接管:可以将设备发出的网络连接进行接管。Surge 支持代理服务和虚拟网卡两种方式接管。
处理:可以对被接管的网络请求和响应进行修改。包括 URL 重定向、本地文件映射、使用 JavaScript 自定义修改等多种方式。
转发:可以将被接管的网络请求转发给其他代理服务器。可以是全局转发,也可以按照非常灵活的规则系统确定出口策略。
截获:可以截获并保存网络请求和响应的具体数据,同时可对 HTTPS 加密流量进行 MITM 解密。
以上四项能力构成了 Surge 的核心工作流。但 Surge 的功能还不仅限于以上四点。比如你可以自定义 DNS 服务器、对全局配置 DNS-over-HTTPS 等。
三种方式:
配置代理:如果系统配置了代理服务器,那么程序在执行网络请求的时候,就不会直接连接目标服务器,而是产生一个发向代理服务器的连接。利用这个特性,可以在本地启动一个代理服务,并配置系统代理为 127.0.0.1 (即本机)的一个端口,这样就可以接管网络请求。
这种方式要求程序自身支持代理机制.大部分命令行程序需要通过环境变量 https_proxy 和 http_proxy 去配置代理,还有一部分需要通过修改配置文件进行配置。
虚拟网卡(Virtual Network Interface,简写为 VIF):主流操作系统几乎都存在 TUN 和 TAP 两种虚拟网卡接口,原本是为了提供对 VPN 的支持。通过在系统中建立虚拟网卡并配置全局路由表,可以接管所有的网络请求。
Socket Filter:这是 macOS 的一项内核特性,可以通过注入一个 Kernel Extension(kext)对所有 socket 调用进行 hook,以此接管请求。
这三种方式各有优劣:
方法 1 性能最优,对系统侵入性最小,无奈有部分程序不支持。
方法 2 性能略低,因为截取到的流量是 IP 层的数据包,需要有一个 TCP 协议栈进行重组装,造成了额外的性能开销。
方式 3 最暴力,对系统侵入性高,Kernel Extension 有可能造成整个系统的不稳定,Apple 已确认在未来的 macOS 中将取消对 Socket Filter 的支持。
当使用代理服务器时,除了发送原始的数据,还需要一些额外的工作:
告知代理服务器,目标服务器的主机名和端口号。
发送鉴权信息,供代理服务器进行身份验证。(可选)
对数据传输进行加密。(可选)
如何进行这三项工作的规范,就是代理协议,有 RFC 规范的代理协议只有 HTTP 代理协议和 SOCKS 代理协议两种。SOCKS 代理协议有 SOCKS4、SOCKS4a、SOCKS5 三个版本。(macOS 使用的是 SOCKS5)
除了有 RFC 规范的代理协议,还有很多自定义的代理协议,如 shadowsocks、Snell 等。但是由于系统和程序没有内嵌对这些协议的支持,需要将他们通过一个客户端程序转换为标准的 HTTP 或 SOCKS5 代理服务供程序和系统使用。Surge 也可以充当这样的转换器,以 HTTP 代理协议和 SOCKS5 代理协议向系统和程序提供代理服务。
HTTPS 和 SOCKS-TLS 代理并没有 RFC 规范,只是在原协议套上了 TLS 层进行加密。
HTTP 代理是会话制,单个 HTTP 代理连接上可以不断地转发不同的 HTTP 请求,这些 HTTP 请求甚至可以不是同一个目标主机。
其他的代理协议都属于 TCP 数据流代理,仅仅是对 TCP 数据流进行了中转,也就是说代理并不关心和理解具体传递的是什么内容,只要是一个基于 TCP 协议的数据流,就可以被代理服务器所转发。
当我们和目标服务器间使用的是 HTTPS 协议进行连接时,并不可以使用传统的 HTTP 代理协议,我们并不希望代理能够获知转发的内容,所以传递的内容的明文对代理并不可见。为此 HTTP 代理协议增加了 CONNECT 方法,可以将一个 HTTP 代理转变为一个 TCP 数据流代理,用于处理 HTTPS 请求。所以现在 HTTP 代理也可以被用来对任意 TCP 协议进行转发。
Surge 的 VIF 在收到一个 DNS 查询时,并不会进行真正的 DNS 查询,而是直接返回一个 Fake IP 地址(通常为 198.18.x.x,该地址段并不会在公网上被使用)。后续收到发往 Fake IP 的 TCP 或 UDP 数据包时,将该虚假 IP 翻译回原始域名进行后续处理。
Surge 会根据这两个选项加入额外的路由表,tun-excluded-routes 比较好理解,有些用户可能会问为什么会有 tun-included-routes 选项,不应该默认就包含了所有路由吗?
这里需要补充一些网络知识,对于主流操作系统,路由表条目的优先级是按照条目的子网覆盖域决定的,覆盖越小的路由表条目优先级越高,而非按照先后或者上下的顺序。
Surge 版本中主要有四种类型:
HTTP 连接:由 Surge HTTP 代理服务接管的连接。在 Dashboard 中会显示请求的完整 URL 和 HTTP 方法名(GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS 等)
HTTPS 连接:由 Surge HTTP 代理服务接管的,且使用 CONNECT 方法转变为 TCP 数据流的连接。在 Dashboard 中会显示请求的目标主机名和端口号,方法显示为 HTTPS。
TCP 连接:由 Surge VIF、Surge SOCKS5 代理服务接管的 TCP 连接。在 Dashboard 中会显示请求的目标主机名和端口号,方法显示为 TCP 和 SOCKS。
UDP 会话:由 Surge VIF 接管的 UDP 数据包,发往同一个地址和端口号的数据包构成了一个 UDP 会话。
https://manual.nssurge.com/book/understanding-surge/cn/