tech/protocol · 集群 A · 主流协议原理 · 2/6
Trojan 协议原理:基于 TLS 的设计思路、密码认证与回落机制
Trojan 的思路是让代理服务在网络上看起来就是一个普通的 HTTPS 服务:先完成标准 TLS 握手,再在加密通道内用密码哈希认证,认证失败的连接交给真实网站处理。它的机密性完全依赖 TLS,因此证书有效性与客户端证书校验是关键;客户端兼容性普遍较好。
Trojan 的核心思路
Trojan 的核心思路是「不发明新的加密,直接站在 TLS 上」。它假设一个提供 HTTPS 服务的普通网站是网络上最常见、最不需要解释的流量,于是让代理服务尽可能在外部表现上接近这样的网站。
这个思路决定了 Trojan 的全部结构:外层是一条完全标准的 TLS 连接,内层是一段非常简短的认证与目标地址信息,之后就是原样转发的应用数据。它不像 VMess 那样自带加密算法,也不像 Shadowsocks 那样依赖预共享密钥做对称加密。
┌─────────────────────────────────────────────┐
│ TLS 记录层(由证书与 TLS 1.2/1.3 保护) │
│ ┌───────────────────────────────────────┐ │
│ │ 密码哈希(56 字节十六进制)+ CRLF │ │
│ │ 指令 | 地址类型 | 目标地址 | 端口 + CRLF │ │
│ │ 应用数据 …… │ │
│ └───────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
一次连接的完整过程
一次 Trojan 连接可以分为三个阶段:TLS 握手、认证与请求、数据转发。理解这三个阶段的先后顺序,就能看懂大部分 Trojan 相关的报错。
| 阶段 | 发生了什么 | 常见失败表现 |
|---|---|---|
| 1. TLS 握手 | 客户端连接服务端端口,校验证书与 SNI | 证书错误、握手超时 |
| 2. 认证与请求 | 客户端发送密码的 SHA224 十六进制字符串和目标地址 | 认证失败后被转入回落站点,表现为无法代理 |
| 3. 数据转发 | 服务端代为连接目标,双向转发数据 | 目标不可达、速度慢多与线路有关 |
第一阶段与普通浏览器访问 HTTPS 网站完全相同,这也是 Trojan 设计的出发点。第二阶段中,密码不会以明文出现,而是先计算 SHA224 哈希,再编码为 56 个十六进制字符发送;即使如此,它也是在 TLS 加密之后才传输的,网络上的第三方看不到。第三阶段就是普通的转发,此时体验好坏主要取决于线路和节点负载,相关原理可参考 线路与专线 专题。
回落机制:认证失败时会发生什么
回落(fallback)是 Trojan 设计中最有特点的部分:当服务端收到的首段数据不是合法的 Trojan 请求时,它不会直接断开,而是把这条连接转交给一个预先配置好的普通 Web 服务。
这样设计的目的,是让未持有密码的访问者(比如一个普通浏览器,或者一次探测性的连接)看到的是正常的网页响应,而不是一个异常断开的端口。从协议设计角度讲,这是在降低「这个端口提供的是非常规服务」的可判断性。
需要强调两点。第一,回落机制是服务端的部署设计,用户侧无需配置,也无法从客户端控制;第二,回落只能降低一类特征,并不能让服务「无法被识别」。协议识别是一个综合了多种手段的领域,相关原理在 协议识别的原理 中有概述,本站不讨论针对任何系统的具体规避方法。
证书与 SNI:用户需要关心的部分
Trojan 的机密性完全建立在 TLS 之上,因此证书是否有效、客户端是否校验证书,直接决定了这条连接的安全前提。标准部署中,服务端持有某个域名的有效证书,客户端连接时在 SNI 中携带这个域名,并验证服务端返回的证书是否匹配、是否由可信机构签发。
用户在机场订阅里通常会看到 sni 和 skip-cert-verify(或 allowInsecure)之类的字段。后者如果被设为开启,意味着客户端不再校验证书,TLS 仍会加密,但无法确认对端身份,理论上留下了中间人风险。合理的态度是:完全按服务商下发的订阅使用;如果发现证书校验被关闭,可以询问服务商原因,而不是自行改动。证书与握手的原理细节见 代理协议中的 TLS。
时间不同步有时也会导致证书校验失败,因为证书有有效期,设备时间相差过大时会被判定为「证书尚未生效」或「已过期」。这类故障的排查可参考 故障排查 专题。
UDP 与多路复用
Trojan 支持 UDP 转发,但 UDP 数据是被封装在同一条 TLS(TCP)连接内传输的。协议中定义了 UDP 关联指令,客户端把每个 UDP 包加上地址与长度信息后写入 TLS 流,服务端解包后再以 UDP 发出。
这种方式的好处是不需要额外开放 UDP 端口,坏处是 UDP 数据会受到 TCP 队头阻塞与重传的影响:一旦底层 TCP 丢包重传,后面的 UDP 包也必须等待。对于网页浏览影响不大,对于语音、游戏这类对实时性敏感的场景,体感可能不如原生基于 UDP 的协议。这也是 Hysteria2 这类基于 QUIC 的协议出现的背景之一。
部分实现(例如 Trojan-Go)还支持在 TLS 之上叠加 WebSocket 或多路复用,用于经过 CDN 或减少握手次数。这些属于实现扩展,是否可用取决于服务端部署与客户端支持,以订阅内容为准。
客户端兼容与选择建议
Trojan 是客户端支持最广泛的协议之一,原版 Clash 内核、mihomo、sing-box、Xray、Shadowrocket 等主流客户端基本都支持标准 Trojan。如果你使用的客户端较老、或者只支持有限的几种协议,Trojan 节点通常比 VLESS 节点更容易导入成功。
不过,客户端兼容只是选择的一个维度。可以用下面的思路判断:
你的客户端是否支持 VLESS?
├─ 不支持 → Trojan、Shadowsocks、VMess 节点是可用选项
└─ 支持 → Trojan 与 VLESS 都可以使用
└─ 两者在服务商正确配置时差异更多体现在部署方式,
日常体验主要看线路与节点负载(本站未实测)
本站收录的品牌中,有 12 个品牌资料标注协议为 VLESS,资料中没有品牌标注 Trojan;另有五个品牌协议待核实,本站不推测其是否使用 Trojan。实际下发的节点协议,以订阅内容为准。
小结
Trojan 用「站在 TLS 上」的方式换来了简单与兼容:没有自研加密,认证信息只有一段哈希,认证失败交给真实网站处理。用户真正需要关心的只有两件事:证书校验是否正常,客户端是否支持。
想了解不同品牌的协议资料,可以浏览 机场品牌库 或在 对比工具 中并排查看;对协议整体差异的梳理,可回到 代理协议 专题总览。
常见问题
Trojan 和 VLESS 有什么本质区别?
两者都把加密交给 TLS,Trojan 用密码的 SHA224 哈希认证,VLESS 用 UUID 认证;Trojan 协议定义更早、客户端支持更广,VLESS 则在传输层组合与扩展上更灵活。
Trojan 的回落机制是什么?
服务端在 TLS 握手后检查首段数据,如果不是合法的 Trojan 请求,就把连接转交给配置好的普通网站,使非用户访问看到的是正常网页。
Trojan 需要域名和证书吗?
标准部署需要。服务端要持有与域名匹配的有效证书,客户端会校验证书。用户使用机场时无需自己准备,但不应随意关闭证书校验。
Trojan 支持 UDP 吗?
支持。Trojan 定义了 UDP 转发指令,UDP 数据被封装后在同一条 TLS 连接中传输,因此仍受 TCP 传输特性影响。
信息来源与更新时间
- 信息来源
- 品牌清单资料(品牌公开信息整理)
- 测试范围
- 本站未进行测速与解锁实测,所有能力描述均为资料声明或未测试状态。
- 发布时间
- 待核实
- 核实日期
- 待核实
- 最近更新
- 待核实