三毛机场测评

Trojan 协议是什么?原理、优缺点与客户端支持

拾沙 · 首发于  · 更新于

30 秒结论:Trojan 是一种把代理流量伪装成普通 HTTPS 访问的协议。客户端先和服务器完成一次真实的 TLS 握手,再用密码校验身份;密码不对或者格式不符的连接,会被转交给服务器上的真实网站应答,所以探测者看到的只是一个普通网站。它的优点是原理简单、兼容性好、几乎所有主流客户端都支持;缺点是需要域名和有效证书,TLS 指纹处理不好时仍有被识别的可能。

在机场的套餐介绍和订阅里,Trojan 是出现频率最高的协议之一。它的设计思路很直接:既然 HTTPS 是互联网上最常见的流量,那就让代理流量看起来和 HTTPS 一模一样。这篇文章讲清 Trojan 怎么做到这一点、它有哪些优缺点,以及作为机场用户需要知道什么。

Trojan 的工作原理

第一步:一次真实的 TLS 握手

Trojan 客户端连接服务器时,首先完成一次真实的 TLS 握手,和浏览器访问一个 HTTPS 网站的过程完全相同。按照官方协议文档,握手失败时,服务器会像普通 HTTPS 服务器一样直接关闭连接;握手成功后,后续所有数据都受 TLS 保护。

这意味着,在网络中间的观察者看来,这就是一次普通的 HTTPS 访问。服务器上使用的也是有效的证书,所以这次连接和访问一个真实网站没有区别。

第二步:用密码校验身份

握手完成后,客户端发送的第一段数据里包含密码的哈希值(官方文档写明是 SHA224 哈希的十六进制形式),以及要访问的目标地址和端口,格式类似 SOCKS5 请求。服务器校验密码正确、格式合法之后,就会建立一条通往目标地址的通道。

为了减少可被分析的特征,第一段数据里还会直接附带要发送的内容,而不是先发一个单独的认证包。

第三步:可疑连接交给真实网站

这是 Trojan 最巧妙的地方。如果服务器收到的数据格式不对、或者密码错误,它不会报错,而是把这条连接转交给预先设定的一个端点,通常是同一台服务器上的真实网站。

这样一来,如果有人主动去探测这台服务器,看到的就是一个正常运行的网站。官方文档把这称为对「主动探测」的防御:所有不符合格式的连接,都会被当成访问网站的普通请求来处理。

Trojan 的优点

原理简单,实现成熟。 Trojan 本质上是「TLS + 密码 + 转发」,结构清晰,各种客户端的实现都很成熟,出问题的概率低。

兼容性最好。 几乎所有主流客户端都支持 Trojan,不管你用的是 Windows、macOS、安卓还是 iOS,基本都能直接导入。这也是很多机场把 Trojan 作为默认协议的原因。

伪装可信。 因为用的是真实的 TLS 和有效证书,流量特征和普通 HTTPS 非常接近,再加上可疑连接交给真实网站的机制,比早期协议更难被识别。

性能开销低。 加密完全交给 TLS,协议本身几乎不增加额外负担,在同样的线路上速度表现稳定。

Trojan 的缺点

需要域名和证书。 服务端必须有域名和有效证书,这增加了搭建和维护的成本。对机场用户来说影响不大,但它意味着机场换域名、证书过期时,节点可能会短暂不可用。

TLS 指纹问题。 不同客户端发起 TLS 握手时,带有各自的特征,也就是所谓的 TLS 指纹。如果代理客户端的指纹和常见浏览器差别很大,理论上可以被区分出来。部分客户端提供了模拟浏览器指纹的选项来缓解这个问题。

基于 TCP。 Trojan 跑在 TCP 上,在丢包率高的网络里,速度可能不如基于 UDP 的 Hysteria2。

Trojan 和其他协议的区别

和 Shadowsocks 相比:Shadowsocks 的加密流量看起来是一串随机数据,没有明显的协议外形;Trojan 则直接伪装成 HTTPS,借用了最常见流量的外形。

和 VLESS 相比:两者都依赖外层的 TLS 来加密和伪装,思路相近。VLESS 搭配 Reality 时可以不需要自己的域名和证书,并且能消除服务端的 TLS 特征,这是它近年在一些机场流行起来的原因。

和 Hysteria2 相比:Hysteria2 基于 QUIC(UDP),伪装成 HTTP/3;Trojan 基于 TCP,伪装成传统 HTTPS。网络对 UDP 友好时 Hysteria2 可能更快,UDP 受限时 Trojan 更稳。

订阅里的 Trojan 节点长什么样

如果你打开过机场的订阅内容,或者见过单个节点的分享链接,Trojan 节点通常写成 trojan://密码@服务器地址:端口?参数#节点名称 的形式。其中几个参数值得认识一下:

sni:TLS 握手时声明要访问的域名,需要和服务器证书对应。机场填好的值不要随意改动,改错了会导致握手失败。

allowInsecure(或 skip-cert-verify):是否跳过证书校验。正常的 Trojan 节点使用有效证书,这一项应该是关闭的。如果某个节点要求开启它才能连上,说明证书有问题,安全性也会打折扣。

传输方式:部分节点会在 Trojan 外面再套一层 WebSocket 或 gRPC,以便经过 CDN 转发。这类节点需要客户端支持对应的传输方式。

Trojan 节点连不上时怎么排查

第一,检查设备时间。TLS 证书校验依赖系统时间,设备时间偏差太大会导致握手失败,把时间设为自动同步即可。

第二,确认没有误开「跳过证书校验」以外的奇怪选项,比如手动改过 sni 或端口。最简单的办法是删掉节点,重新更新订阅。

第三,换一个节点或换一个网络环境试试,判断是单个节点的问题还是整体的问题。如果所有 Trojan 节点同时失效,通常是机场域名或证书出了状况,留意机场公告即可。

机场用户需要知道什么

如果你的机场提供 Trojan 节点,基本可以放心使用任何主流客户端。导入失败时,通常不是协议本身的问题,而是订阅地址失效或者客户端版本太旧,排查方法见 代理软件 栏目。

另外,很多机场会给不同协议的节点设置不同的倍率,选节点时别忘了看一眼,具体算法见 机场倍率。

常见问题

Trojan 和 Trojan-Go 有什么区别?

Trojan-Go 是社区用 Go 语言实现的 Trojan 兼容版本,在原协议基础上增加了 WebSocket 传输、多路复用等功能。机场订阅里的 Trojan 节点,大多数客户端都按标准 Trojan 处理,用户一般不需要区分。

Trojan 节点需要自己的域名吗?

搭建 Trojan 服务端需要域名和有效的 TLS 证书,这是它伪装成 HTTPS 网站的前提。对机场用户来说,这些由机场负责,你只需要导入订阅。

哪些客户端支持 Trojan?

基本上所有主流客户端都支持,包括 Clash 系(mihomo 内核)、v2rayN、v2rayNG、sing-box、Shadowrocket 等。Trojan 是兼容性最好的协议之一。

Trojan 安全吗?

Trojan 的流量由 TLS 加密,安全性和普通 HTTPS 网站相当。机场能看到你访问了哪些网站和用了多少流量,但看不到 HTTPS 网站里的具体内容。

Trojan 会被识别吗?

设计上它很难和普通 HTTPS 访问区分,但并非绝对。TLS 客户端指纹、连接的时间和流量特征都可能被用来分析。所以近年也有机场改用 VLESS + Reality 或 Hysteria2 等协议。

参考资料

本文的结论以下列官方文档、规范或资料为准: