不嗅探
转发层不介入 TLS 握手,也不持有任何解密密钥。 HTTPS 请求在它看来是一串无法解读的字节流,它只能看到这些字节从哪个目标地址发出、要送到哪里去。 想解析内容,需要的不是「意愿」而是「能力」——而它并不具备这种能力。
Clash 是一个转发层。它决定连接的目标该走哪条路径, 然后按规则把它交给对应出口——但不去解析应用层的内容,不改写请求与响应,也不在流量里加任何东西。 HTTPS 对它来说始终是不透明的负载。中转节点由你自行选定,官方不介入链路,也无从获取链路内容。
把请求从设备发出到抵达目标的过程摊开来看。中间那一段是 Clash 的位置, 它的职责范围到此为止——再往里的事情,它看不见,也管不着。
转发层的职责边界很清楚。它需要知道「这个连接要去哪儿」,才能决定怎么送; 但它不需要知道「这个连接里放了什么」,也不需要改动里面的任何东西。判断依据和目标内容,是两件不同的事。
用「网络层级」的方式对照,能更清楚地说明转发层处在哪个位置,以及它的可见范围到哪里为止。
| 层级 | 内容 | 转发层是否可见 |
|---|---|---|
| 连接目标 | 目标域名、IP 地址、端口号 | 必须可见,这是判断依据 |
| 传输层元信息 | 协议类型、连接状态、字节量 | 可见,用于统计与调度 |
| TLS 握手 | 加密套件、证书链、密钥交换过程 | 不介入,也不握持密钥 |
| 应用层载荷 | HTTP 请求体、响应内容、页面数据 | 不可见,视为不透明字节流 |
| 加密通信内容 | HTTPS、SSH、各类加密协议的明文 | 不可见,没有解密能力 |
| 身份与凭据 | 账号、密码、令牌、Cookie 内容 | 不可见,无从获取 |
这是转发层与「中间人」的本质区别:前者只负责路径,后者会介入内容。 Clash 属于前者,且仅属于前者。
这三件事不是「尽量不做」,而是结构上做不到。下面分别说明为什么。
转发层不介入 TLS 握手,也不持有任何解密密钥。 HTTPS 请求在它看来是一串无法解读的字节流,它只能看到这些字节从哪个目标地址发出、要送到哪里去。 想解析内容,需要的不是「意愿」而是「能力」——而它并不具备这种能力。
不改写请求头,不替换响应内容,不注入脚本,也不插入广告。 规则决定的只是「这个连接走哪条路」,与「这个连接里放了什么」完全无关。 转发层只搬运数据包,不做内容层面的任何加工。
中转节点由你自行选定,项目方不提供节点、不参与链路、也无从获取其中的内容。 你与出口之间的通信由你选择的协议保护,出口与目标站点之间的那一段, 取决于你使用的协议与目标站点的加密情况——Clash 既不介入,也不知晓。
把转发层的工作范围摊开来看,边界会更清楚。
需要区分「转发层」与「出口」。转发层不做内容层面的任何事, 但你选择的出口与目标站点之间的链路,取决于你使用的协议。 如果使用加密协议,那一段是加密的;如果是明文协议,则并非如此。这一点由你的选择决定,而不是由转发层决定。
传输路径不是固定的,也不是由项目方预设的。规则怎么写、出口怎么选, 最终决定了数据走哪条路——而这个决定权在使用者手上。
同一条规则可以指向 DIRECT、PROXY、REJECT 或某个策略组。
哪些目标就近发出、哪些交给代理、哪些直接拦下,全部写在配置文件里,肉眼可查。
项目不提供节点,不推荐线路,也不限制使用哪家服务。 策略组里有哪些出口、这些出口从哪来,完全取决于你自己引入的订阅或自建配置。
如果你对路径的隐私性有更高要求,可以在策略组中只选用加密协议的节点, 或在规则里把敏感目标直接指向受信任的出口,避免经过来源不明的中转。
客户端面板会展示当前经过的请求与命中的规则,但这些信息只保留在你的设备上。 是否导出、是否留存、是否清理,都由你自己决定。
规则与策略组都是纯文本,可以随时打开确认某个目标会走哪条路。 改动前导出备份,改动后重新载入,整个过程都在你的控制范围内。
「中间人」这个词经常被和「中转」混为一谈,但两者在做的事完全不同。 下面这张对照表把区别摊开来看。
| 对比维度 | 普通转发层 | 中间人 |
|---|---|---|
| 对内容的态度 | 只搬运,不解读 | 解密、读取、可改写 |
| 是否介入 TLS | 不介入,透传加密流量 | 介入握手,持有证书与密钥 |
| 是否改动载荷 | 不修改任何字节 | 可替换内容、注入脚本 |
| 路径决定权 | 使用者通过规则定义 | 由中间人自行安排 |
| 对使用者的透明度 | 路径与规则可见可查 | 过程对使用者不透明 |
「中间人」的核心特征是介入内容。它需要解密才能看到明文, 需要持有证书才能冒充目标站点,需要改写载荷才能插入内容。 转发层不具备其中任何一项能力,也不尝试获取——这是结构上的区别,不是承诺上的区别。
配置文件里的每一条规则,只回答「这个目标走哪条路」,不涉及任何内容层面的判断。 下面这份片段可以说明这一点。
DOMAIN-SUFFIX
匹配的是域名后缀,
IP-CIDR
匹配的是网段。它们都不读取请求体,也不解析响应。
规则的动作是 DIRECT、PROXY、 REJECT 或某个策略组名——全部都是路径层面的指令。 没有一条规则能表达「如果内容里出现某个词就怎样」,因为转发层根本没有这个能力。
规则的表达能力,恰好映射了转发层的能力边界。 它能写出来的,就是它能做到的;它做不到的,也写不出来。
抽象的原则落到具体场景,会更容易理解它带来的实际差异。
登录银行、企业后台、内网系统——这些连接的内容对转发层不可见。 它只看到「这个连接要去某个域名」,但不知道你提交了什么、返回了什么。
本地服务、测试接口、线上环境同时开着。规则把流量分到不同路径, 但不会因为「需要调试」就去读取接口的请求体或响应内容。
如果你只信任特定地区的节点,可以在策略组中只选用那些出口。 规则指向哪个组、组里有哪些节点,全部由你自己编排。
打开连接记录面板,能看到每个请求命中了哪条规则、走了哪个策略组。 这些信息在本地可查,用来确认路径是否符合预期。
连接记录完全在你自己的设备上。是否导出、保留多久、要不要清理, 都由你决定,不依赖任何外部服务。
项目不强制上报,客户端不向项目方传输访问记录或连接目标。 你选择引入的订阅或规则集来自何处,那部分由对应来源决定——这一点需要你自己确认。
下面几件事需要说明白。透明的意义在于准确,而不是让人产生过高的期待。
转发层不介入内容,但加密与否取决于你使用的协议与目标站点。 访问明文 HTTP 站点时,链路上的那一端仍然可能看到内容——这不是转发层能改变的。
项目不提供节点,也不为任何节点的行为背书。 出口是否可信、链路是否加密、运营方是否记录日志,都需要你自行判断。
为了判断路径,转发层需要知道目标地址。这一点无法回避—— 判断的前提就是知道「要去哪儿」。它不看内容,但知道目标。
「不窥探内容」与「完全不可见」是两件事。 转发层不解析应用层内容,也不改动任何数据;但它确实需要读取连接的目标地址来完成判断。 这种可见性是判断的前提,也是它与「中间人」最根本的区别——前者只看信封上的地址,后者会拆开信封。
看不到。Clash 只处理连接的目标地址与转发路径,不介入 TLS 握手,也没有握持任何解密密钥。HTTPS、SSH、各类加密协议的内容对它来说都是不透明的负载,它只负责把它们送到正确的出口。
不会。转发层不修改应用层载荷,既不改写请求体,也不注入响应内容。规则决定的只是「这个连接走哪条路」,而不是「这个连接里放了什么」。
节点由你自行选择。如果使用加密协议,节点与你之间的通信是加密的;至于目标站点与节点之间的那一段,取决于你使用的协议与目标站点的加密情况。Clash 不介入选择,也不参与链路。
不会。转发判断全部在本机完成,客户端不向项目方上报连接目标、访问记录或流量内容。连接记录只保留在你自己的设备上,是否导出、是否留存由你决定。
可以在客户端的连接记录面板查看每个请求命中的规则、使用的策略组与出口。规则是自己写的,策略组是自己配的,出口是自己选的——三段路径都在本地可见。
不会。拦截发生在连接建立阶段,请求根本没有发出。客户端只知道「这个目标被规则拦下了」,并不知道你原本打算访问的具体内容。
这一页讲的是转发层的透明性。相关的话题分散在下面几页里。
去「项目介绍」页。那里说明了项目坚持什么、拒绝什么, 以及为什么强调「全本地运行」和「不替用户做选择」。
去「分流规则」页。规则的表达能力与转发层的能力边界是对应的, 看懂规则,也就看懂了它能做什么、不能做什么。
去「开源许可」页。那里说明了使用、修改与分发的条款, 以及免责范围与版权归属。
去「社区生态」页。规则集、订阅模板、插件脚本、界面面板, 以及怎么判断一份资源是否还在维护,都整理好了。