Contents

梯子原理与Clash.Meta配置:1.梯子原理简述

本文以 CC BY-NC-SA 4.0 协议发布

问:梯子是什么?

答:梯子,又称科学上网工具,这是你东大特有的赛博传送门。“梯子”一般实际指的是本地使用的代理软件,而“机场”一般指的是提供代理服务的服务商。

问:为什么推荐大家手写梯子配置文件?

答:从订阅链接下载订阅的时候,机场默认一般会下发给你一套开箱能用的配置,包括机场节点、DNS、分流规则等等。“开箱即用”固然方便,但是用多了,经常会遇到默认规则无法满足的情况,搞得人十分难受,比如:

  • 有网站/软件分流错误,不该走国内的走国内,该走国内的偏偏出去绕一圈,搞得网站上不去或者定位错误,换十几个节点也没用
  • 机场下发的 DNS 相关配置不好用,要么出现 DNS 泄露,要么配置不当导致访问国内网站很慢
  • 要用到一些涉及到网络底层机制的软件,比如虚拟机 / 加速器 / 虚拟组网 or 穿透工具 / P2P 下载工具等等,和梯子出现协同问题,导致无法代理,连接失败,网络冲突……

面对这些问题,真的只能红温,但是束手无策吗?

非也非也。只能说,既然生在东大,就真得了解一点网络相关的知识。特别是各位喜欢折腾的读者,要能够对自己的设备和网络状况充分掌控,对梯子的配置做到充分了解,在遇到各种问题的时候就可以做到知己知彼,百战不殆。

问:为什么代理软件不把 GUI 做的完善一点,让人可以在图形界面上就完成配置?

答:从 Clash.Meta 官方文档 就可以看出,梯子的各种配置项和自定义功能可谓是浩如烟海,让开源软件开发者专门针对所有可能的配置做 GUI,并根据内核功能变动不断地修改是不现实的。即使把所有配置都做成 GUI ,相信其复杂程度也不会比手写配置文件低。

事实上,绝大多数人能做到正常“使用”梯子就已经很了不起了。真正有兴趣做一些研究,并自己给梯子做配置的“高级用户”,自然也不在意这一点写配置文件的麻烦。

手写配置文件的另一个好处是,有助于在各个梯子客户端(手机/电脑)之间共享相同的自定义配置,这也是我们后面想要达到的目标之一。

问:在了解梯子配置文件之前,应该具备哪些基础知识?

在学写配置文件之前,需要先至少了解一些网络领域的基础知识和概念,以便于后面对各配置设定的理解。这里做一些形象化的简述,方便快速了解和入门:

1. 浏览器是如何上网的?

答:使用 HTTP / HTTPS 协议 与服务器通信

HTTP Full Form - GeeksforGeeks

HTTP 协议规定了浏览器和服务器通信的各种格式规范,其流量是明文传输的。HTTPS 在普通明文 HTTP 的基础上使用 TLS 协议进行协商加密,可以确保信息在传输过程中的私密性,而且可以避免中间人攻击。目前 HTTPS 已经得到了几乎所有网站的使用,浏览器左上角的小🔒图标就是 HTTPS 的标志。

2. 浏览器是如何知道服务器的“地址”的?

答:通过“IP 地址”,可以在因特网上唯一确定一个特定服务器的地址。IP 地址(IPv4)一般是 123.234.123.234 的格式,可以类比为一个服务器在互联网上的”身份证号“。

不过,IP 地址不好记的问题影响了互联网的大规模铺开应用,因此后来出现了一个新东西“域名”。“域名”可以理解为一个 IP 地址的方便记忆的”名字“,就跟人的名字类似。现在访问网站的时候,大多数情况下我们都使用域名进行访问,这对人类孱弱的记忆能力来说十分友好。

在使用域名访问网站的时候,浏览器会自动通过 DNS 域名解析服务 来完成域名→IP 地址的转换工作,然后仍然使用 IP 地址和服务器进行通信。

比如,当你用浏览器访问www.baidu.com,浏览器会先到 DNS 服务器去查询这个域名对应的 IP 地址是多少,例如是202.108.22.5。得到此 IP 地址之后,浏览器再对此地址的服务器发起TCP连接,使用 HTTP 协议进行通信。

有了域名之后,访问一个服务器的过程可以简化为下图:

How DNS Works?. What happens when you type… | by Moses Musinde ...

3. 腾讯会议、电子邮件之类的程序是怎么和服务器通信的?也都是用 HTTP 吗?

答:并不一定。

我们都知道,互联网的协议是分层的。在应用层,除了HTTP以外,还有大量的其他应用层协议,如SMTP、FTP、SSH等,以及很多应用使用的私有通信协议。尽管HTTP(s)流量占据目前互联网流量的大头,但是其他这些协议也是重要的组成部分。

在传输层,除了TCP以外,在同一层的还有 UDP 协议。TCP与UDP的大致区别如下:

  • TCP 可以比喻为点对点打电话,需要事先建立连接,协议保证通信内容正确且有序地到达,不过引入了一些机制上的开销
  • UDP 则可以比喻为寄快递,可以随时随地向指定的目的地发送数据包无需提前建立连接,这带来了较高的吞吐量和较低的延迟,但是 UDP 不保证通信内容的有序到达,路上可能出现丢包。
HTTP TCP UDP Socket 关系的几个经典图- 蝈蝈俊- 博客园

传统上来说,TCP 通常用于对通信内容要求可靠性高的应用,前面提到的浏览器使用的 HTTP 协议就是基于 TCP 实现的;UDP 则通常用于可以容忍一定的传输错误和丢包,但对响应延迟敏感的应用,如视频会议、语音通话、游戏联机等等,往往就会使用UDP或者基于UDP的应用层协议进行通信。

4. 🧱是如何处理你的互联网连接的?

了解上面那些内容,是为了更好地理解整个🧱系统工作的机制,以及梯子是如何应对他们的原理。

澄清一下,🧱并不是一个物理存在的单独的实体(比如一个机房),而是分布在各省市区广域网网关上的分布式防火墙设备,其会对经过的各种互联网连接与内容进行检查,对不合适的连接进行阻断。举几个例子:

  • 对于明文的通信内容(比如不加密的 HTTP),可以对通信内容、通信协议等进行匹配。如果有匹配到不合适的关键字,就直接阻断连接
  • 对于加密的通信内容(比如绝大多数网站的 HTTPS 连接),可以通过一些办法来嗅探连接的目标。比如检查与服务器建立连接时 ClientHello 数据包里明文的 SNI 字段(一般是域名),如果匹配到不合适的网站就自动断开连接(又称 SNI 阻断
  • DNS 一般使用 UDP 协议通信,而且不加密。当发现不合适的 DNS 查询时,就可以直接抢答返回错误的 DNS 结果,使 DNS 解析过程没法正常完成,因而也没法连接到服务器(又称 DNS 污染
  • 对于某些重点网站和服务,有 IP 地址黑名单,向目标 IP 范围内发起的请求会被直接拦截(又称 IP 黑洞
  • 对于加密,且没有明显明文特征的数据流(比如一般的 TCP 协议通信),可以采用统计学分析方法(例如深度包检测技术)分析其内部可能使用的通信协议。早期的一些较简单的梯子协议有非常明显的,不同于传统互联网通信流量的统计学特征,因而可以被轻易识别并阻断
  • 随着技术进步,未来可以预见🧱还将结合深度学习等前沿技术,努力尽可能地对未知流量进行特征提取和识别

5. 梯子是如何解决以上这些问题的?那些“协议”又是什么意思?

答:梯子和🧱,两者是矛与盾的关系,互相成就,学习相长。针对🧱识别和阻断连接的一些特点,梯子可以做出针对性的处理。

梯子的原理说来也不复杂,简单说就是在外面搭建出口服务器(梯子节点),在本地安装梯子客户端。在梯子客户端和外面的服务器之间,搭建了一个加密、混淆的隧道,使你可以通过隧道和“不合适”的网站进行通信,这样🧱也就无从对访问流量进行检测了。

而不同的“协议”,区别就是这个隧道是如何对进出流量进行加密、混淆的。

举例而言,早期的协议一般对流量进行加密后直接进行传输,或者进行简单的混淆,在处理的过程中可能会引入一些比较容易被识别的统计学特征(如过高的熵、长时间大流量通信、TLS in TLS 特征等),使隧道本身容易被发现和阻断。后来发展的协议一般会在混淆方面下功夫,比如 vless vision 避免了 TLS in TLS 特征被检测的问题,hysteria 将流量伪装成 HTTP/3 协议的 QUIC 通信,naiveproxy 使用 chrome 的网络堆栈来缓解对 TLS 指纹的识别等等…..

6. 梯子的“系统代理”和“TUN 模式“是怎么工作的?

如上面所说,在梯子的实质就是在客户端和服务器之间建立了加密的隧道。建立好隧道之后,就要想办法让程序能”走“这个隧道,而不是直接向互联网发起连接。

系统代理 是一种让程序”走“隧道的办法,其原理就是在本地运行一个代理服务器,并在电脑的 Internet 设置中注册。你的浏览器默认会使用系统设置中的代理服务器发起连接,于是流量便通过代理服务器传送到梯子客户端,梯子筛选出需要”走”隧道的流量,对其加密处理后”走“隧道出门。

TUN 模式 是另一种让程序”走“隧道的办法,其原理是在本地创建一张虚拟网卡,并修改路由表使本地程序的流量都通过这张虚拟网卡发出。接着,梯子客户端就可以对到达的流量进行筛选,挑选出需要”走”隧道的流量并进行处理和转发。

image-20240908224246790

TUN 模式也就是所谓的“透明代理”,整个代理过程对程序来说不可见,不像系统代理模式那样需要浏览器主动向代理服务器发起连接,因此可以有效处理到系统上各种程序的流量。

7. “分流”又是什么意思?

上面一段中,怎么对流量进行筛选,判断哪些流量需要”走“隧道出门,哪些不需要,这就是 分流规则 所做的事情。

分流规则可以说是整个梯子配置中最重要的部分。错误的分流设置会导致有些在国内本来应该直连的网站错误地“走”了隧道,去国外绕了一大圈,导致访问速度严重降低;或者有些应该“走”隧道的网站没有被有效识别到,浏览器直接向其发起连接,于是导致连接被干扰/阻断等。

分流规则配置的正确与否是影响日常使用梯子体验好坏最大的一个因素,这也是需要手写梯子配置文件的最主要的原因。

实际的“分流”工作,会根据多种规则检查特定的流量需不需要“走”隧道,有基于域名、基于域名前后缀、基于 IP 范围、基于通信协议或端口等等各种判定办法。互联网上还有不少已经整理好的“规则集”,是由志愿者整理好的大量常用的分流规则集合,在编写自己的配置文件时可以直接使用,相当省心。

8. 梯子的“全局模式”和“规则模式”又有什么区别?“全局”是指捕获电脑全部流量吗?

这是一个常见的理解上的误区,原因是“全局模式”这个命名非常不好,很容易引起误解。

事实上,梯子所谓的”规则模式“和”全局模式“的区别在于如何对待配置文件中的分流规则:

  • 一般情况下我们都用“规则模式”,梯子将根据设定好的分流规则对流量进行筛选处理;

  • “全局模式”则代表忽略分流规则,使所有到达梯子的流量都走隧道通过梯子转发到远端节点。

“全局模式”下,进入梯子的所有流量都会无脑发送到国外进行代理,这会导致所有对国内网站的访问变得巨慢,同时也会使梯子节点非常容易被🧱发现和封锁,因此“全局模式”一般是不会使用的。当且仅当你需要访问某些冷门网站、而它的域名又分流错误时,才可以临时使用一下这个功能。

至于你想要的“捕获电脑全部流量”,只要打开梯子的 TUN模式 ,就可以起到这个效果了。

8. 总结

学了这么多,总结一下整体的流程。一个对网站域名(比如 www.google.com)的访问请求,会经过如下步骤:

  1. DNS 查询:浏览器向 DNS 服务器发起 DNS 查询请求,查找此域名对应的 IP 地址。梯子客户端一般会用一些机制截获这些 DNS 请求,代替浏览器进行 DNS 查询,想方设法返回真实的 IP 地址,避免 DNS 污染的干扰
  2. 截获请求:拿到 IP 地址后,浏览器向此 IP 地址对应的服务器发起 HTTPS 请求。梯子客户端通过系统代理 / TUN 截获此请求
  3. 分流判定:根据分流规则判定此请求需不需要“走”隧道(www.google.com,查表,发现是需要代理的请求)
  4. 进行代理:如果判定需要走隧道,梯子客户端就根据目前选定的节点使用的协议,对请求进行加密、混淆处理,然后通过隧道传输到出口节点发出。服务器返回结果时,同样由出口节点加密、混淆后通过隧道转发回给梯子客户端,梯子客户端再交付给浏览器。

整个过程中,梯子就像是一个“中间人”,建立起浏览器和服务器之间的桥梁,保证其通信畅通无阻。

下面第二弹,将以Clash.Meta配置文件为例,介绍其各部分配置的含义以及如何编写,让大家彻底做到学以致用!


系列全文目录: