第一次在朋友电脑上看到trojan这个协议名字,我心里咕嚙了一下,还以为他配置文件里混进了什么木马程序。后来查资料才明白,这名字取自特洛伊木马的典故——核心思路就是把代理流量伪装成一次再普通不过的HTTPS网页访问,从外表完全看不出破绲。这篇文章想把这套伪装原理讲清楚,顺带聊聊自己实际用下来的体验。
Trojan是什么
名字里的比喻,和真正的设计思路
Trojan是一种开源的代理协议,最早的设计目标很直接:与其绞尽脑汁发明一种全新的加密协议,不如干脆把流量伪装成这个世界上最常见、最不起眼的东西——标准的HTTPS网页访问。这个思路和很多加密工具的直觉是反过来的。如果造一种全新协议,哪怕加密强度再高,只要它有自己独特的握手方式或者数据包节奏,在网络世界里就是一种新出现的、稀少的信号,反而容易被归类为不常见的流量。Trojan干脆不追求看起来像加密数据,而是追求看起来就是HTTPS本身。
具体来说,Trojan通常直接跑在443端口上,搭配一个真实注册的域名和真实签发的TLS证书。也就是说,它的服务端本质上就是一台配置了真实证书的网页服务器,代理功能是「藏」在这台服务器背后的一层逻辑,而不是单独暴露出来的一个服务。
为什么「伪装成HTTPS」更难被识别
流量识别系统一般看什么
要理解Trojan的巧妙之处,得先知道流量识别系统一般靠什么来判断一个连接像不像代理。大致有三个角度:
- 协议指纹:握手过程有没有不同于常规软件的特殊结构
- 流量模式:数据包长度、发送节奏是否符合正常网页浏览的规律
- 主动探测:直接向可疑地址发起连接,看对方反应是否符合一个真实网站该有的样子
Trojan怎么应对这三点
Trojan的做法是,握手阶段完完整整走一遍标准TLS流程,SNI、证书链、加密套件协商全都和用浏览器访问一个真实网站没有任何区别。真正用来证明身份的口令,不是塞在握手过程里,而是等TLS隧道建立、双方已经开始加密通信之后,作为加密隧道内部的第一段数据发出去。也就是说,从外部观察者的角度看,能看到的始终只是一段普通的、加密的TLS会话,至于里面装的是网页请求还是代理数据,在不解密的前提下根本无从分辨。
更值得一提的是它的回落机制。如果有连接没能提供正确的身份口令,比如探测程序随手发一段试探数据过来,服务器不会报错,也不会直接断开连接,而是把这个连接原样转发给一个预先配置好的、真实存在的网站,可以是一个普通的静态站点或者博客。这样一来,主动探测得到的回应和真的访问一个网站每没二致,连一个能用来判断这台机器有点奇怪的异常反应都找不到。
和其它协议的区别
Shadowsocks:只管加密,不负责伪装
Shadowsocks是更早被广泛使用的方案,设计理念和Trojan不太一样。它专注于把流量加密好,但并不刻意模仿某一种具体的常见协议,加密之后的数据,在外部看来更像一串不具备已知结构的随机字节。早期版本因为握手方式和数据包长度存在一定规律,曾经比较容易被针对性识别;这些年经过AEAD加密、2022版本等一系列改进,识别难度已经提高不少。不过它的流量本身依然不模仿任何常见协议,如果识别系统对持续输出一大段无法归类的加密数据这种模式本身产生怀疑,也可能被留意到,所以传统上Shadowsocks更依赖额外的混淆插件来配合。
VMess:有自己的一套结构,伪装能力靠外层包装
VMess是V2Ray项目设计的私有协议,认证方式基于时间戳等自有逻辑,数据包结构自成一体。如果直接裸跑在TCP上不做任何额外包装,这套结构本身相对容易被归纳出规律,所以实际部署中,VMess通常需要再套一层WebSocket+TLS,才能获得接近Trojan那种看起来像正常网站的效果。换句话说,VMess的伪装能力更多来自外面额外裹上的这层TLS,而不是协议本身与生俱来的设计;Trojan则从第一天起骨子里就是标准TLS,伪装是内建的,不需要额外再装一层。
| 协议 | 核心思路 | 伪装程度 | 应对试探连接的方式 |
|---|---|---|---|
| Trojan | 直接使用标准TLS,身份口令藏在加密隧道内部 | 较高,原生就是HTTPS的外观 | 内置回落机制,验证失败自动转发到真实网站 |
| Shadowsocks | 专注加密本身,不模仿特定协议 | 中等,流量无明显协议特征,但也不像任何常见协议 | 主要依赖外挂混淆插件 |
| VMess | 私有协议结构,内置基于时间戳的认证 | 视包装而定,裸跑特征较明显,常需另加WebSocket+TLS | 伪装能力主要来自外层包装,协议本身内置能力有限 |
我的使用体验
原理讲完了,说点实际的。我自己配置过Trojan服务端,也长期用现成的客户端连接,体感上确实比早年用过的一些方案更稳,尤其是在网络环境比较复杂的场所,比如陆生的公共Wi-Fi下,连接被莫名其妙掉的情况明显更少。这大概率跟它的流量长得太「正常」有关系,不太容易被中间设备额外针对。
当然也不是完全没有麻烦。域名和证书需要自己维护,证书过期忘记续期的话连接会直接失败,排查起来一开始容易摸不着头脑;如果服务器的IP因为其他原因被记录下来,换一个新IP还要重新走一遍域名解析和证书申请的流程,不像有些方案换个端口就能应急。所以自己搭建更适合愿意折腾、想搜清楚底层原理的人。
我自己现在日常用的是TonBoVPN,它原生支持这类基于TLS伪装的协议,不用自己操心证书续期和域名解析,换节点的时候也没感觉到明显的卡顿或者重连延迟,对不想自己维护服务器的人会省心不少。
从「造一个新协议」到「干脆假装自己就是网页」,Trojan代表的其实是一种思路上的转弯,与其想办法让代理流量更难被分析,不如让它压根不像是需要被分析的东西。这种「藏在明处」的逻辑,后来也影响了不少新协议的设计方向。技术层面聊到这里,如果你也在纠结选哪种协议,不妨先想清楚自己是想动手折腾原理,还是只想要一个省心的连接方式,这两条路没有标准答案,适合自己节奏的就是好方案。
