你大概是在两个地方碰到这个词的。一处是机场的套餐页,协议那一栏写着 Trojan;另一处是客户端的节点列表,类型一列显示 Trojan,旁边是香港、日本这些地区名。你想知道它和别的协议有什么不同、你的客户端认不认它。这一页只讲 Trojan 这一个协议,先讲它怎么把自己装成 HTTPS,再讲这个设计给你带来哪些要注意的地方。
Trojan 为什么看起来像普通 HTTPS
trojan-gfw 的协议文档把一次连接拆成三个动作。第一步,客户端和服务器做一次正常的 TLS 握手,和浏览器打开任何一个 https 网站时一样。第二步,握手完成后,客户端在加密通道里发出第一个数据包,开头是密码经 SHA224 算出、再写成十六进制的 56 个字符,后面跟着要去的目标地址和端口。第三步,服务器核对这串字符,对上了就替你去连目标地址。
关键在核对不上的时候。文档写明,密码不对或者请求格式不对,服务器会把这条连接原样转给预先设好的另一个服务,通常是同一台机器上的一个普通网站。TLS 握手本身失败时,服务器直接断开,和一台 HTTPS 服务器的反应相同。所以有人主动去试探这台服务器,看到的只是一个网站。
这个设计决定了 Trojan 的两个前提,你在用的时候会碰到。
- 要有域名和证书。TLS 握手要一张证书,文档把“用有效证书”写成使用者自己的责任。机场的 Trojan 节点因此都对应一个域名,订阅里的 sni 字段就是这个域名。
- 加密交给 TLS。Trojan 自己不再另做一层加密,安全性靠外面这层 TLS 和证书校验撑着。
和 Shadowsocks、VLESS 用起来差在哪
三个协议你在订阅里都可能遇到,对你来说的差别集中在导入和出错的时候。
| 对照项 | Trojan | Shadowsocks | VLESS |
|---|---|---|---|
| 外面看到的样子 | 一次 HTTPS 访问 | 一串看不出规律的加密数据 | 取决于外面套的那层,常见是 TLS 或 REALITY |
| 自己加不加密 | 不加,交给 TLS | 加,用 AEAD 算法 | 默认不加,Xray 文档要求配合 TLS 等传输安全层,另有可选的 VLESS 加密 |
| 节点参数里要看的 | 地址、端口、密码、sni | 地址、端口、密码、加密方式 | 地址、端口、UUID、传输方式、外层安全设置 |
| 常见出错点 | 证书过期、sni 不对、系统日期偏差 | 加密方式和服务端不一致 | 外层参数缺项,客户端内核太老 |
三者都能通过订阅一次导入,大多数时候你不用手填。只有在出错时,这张表告诉你先看哪一列。
你的客户端认不认 Trojan
协议决定了你能用哪些客户端。本站整理客户端教程时记下的几个例子如下,版本以各篇教程标注的为准。
- v2rayN 6.33 的“服务器”菜单协议段里有 Trojan 一行,添加窗口填地址、端口和密码,传输层安全选 tls 再补 SNI;7.24.9 把这组菜单挪到了“配置项”下(本站 v2rayN Windows 教程记录)。
- v2rayNG 能从剪贴板导入 trojan:// 开头的单条链接(本站 v2rayNG 安卓教程记录,v1.8.14)。
- Clash for Windows 用的 Premium 内核支持 Shadowsocks、VMess、Trojan,VLESS 和 Hysteria2 节点它认不出来(本站 Clash for Windows 教程记录)。
- Surfboard 可导入的类型里有 trojan(本站 Surfboard 安卓教程记录)。
- 用 mihomo 内核的客户端,mihomo 文档里有 trojan 节点类型,专有字段里标必填的只有密码,传输方式可以选 ws 或 grpc。
本站收录的 28 家里,极连云的资料写协议只有 Trojan 一种,线路是中转。订阅里只有一种协议的机场,你先确认手里的客户端在上面这份清单里。
Trojan 节点连不上,按这个顺序查
- 先看系统日期。Trojan 协议本身不校验时间,但 TLS 证书有有效期,电脑日期偏得太远,证书会被判成过期或未生效,表现是全部 Trojan 节点同时握手失败。把系统时间改成自动同步,再测一次延迟。
- 再更新订阅。机场换了域名或证书,旧订阅里的 sni 还是原来的,更新订阅后看节点参数里的 sni 有没有变。
- 还不行,看客户端日志里的报错。出现 certificate、x509、handshake 这类字样,问题在证书这一层,截图发给机场客服时带上这几行。出现的是超时,按超时类问题排查。
- 最后才考虑跳过证书验证。这个开关在 mihomo 里叫 skip-cert-verify,在 V2Ray 系的分享链接和配置里多叫 allowInsecure,打开后能连上,说明问题就在证书,查完把它关回去。
什么时候这个答案不成立
- 不是 trojan-gfw 原版的实现。Trojan-Go、Xray、sing-box 都实现了 Trojan,并各自加了扩展,比如 WebSocket 传输、REALITY 外层,这些扩展的行为以各自文档为准,本页只按 trojan-gfw 的协议文档写。
- 机场的入口是中转。中转节点的地址和端口指向入口服务器,证书和 sni 怎么配由机场决定,上面“看起来像 HTTPS”说的是 Trojan 服务器那一端。
- 客户端版本。上面的客户端例子按本站各篇教程记录时的版本,老版本或改名后的分支菜单可能不同。
- 隐蔽性。“看起来像 HTTPS”说的是协议设计,节点会不会被识别和封锁,取决于很多协议之外的因素,本站没有测过。
接下来去哪
- 浏览器提示证书或 SSL 错误,想分清是时间问题还是端口问题,看 开梯子后网页提示 SSL 错误。
- 用 Trojan 节点打游戏、语音,想知道 UDP 那一项为什么重要,看 梯子 UDP 转发有什么用。
- 想照着截图在 Windows 上导入订阅,走 v2rayN 在 Windows 上的安装教程。
- 手里的客户端不认 Trojan,去 梯子客户端栏目 按系统换一个。
延伸问题
正文没展开、但和这个问题挨着的几条。点问题展开答案。
Trojan 节点要不要打开跳过证书验证
机场没有要求就别开。跳过证书验证后,客户端不再核对对面是不是那台真服务器,只要能握手就连。证书真的过期时打开它能临时连上,但你也失去了 TLS 原本提供的身份核对,本站的判断是只当排查手段用,查完关回去。
Trojan 节点支持 UDP 吗
协议支持。trojan-gfw 的协议文档里有 UDP ASSOCIATE 命令,UDP 包同样走 TLS 通道。客户端这一侧要打开对应开关,mihomo 配置里是 udp 字段,机场服务端有没有开要看订阅里的节点参数。
Trojan 和 Trojan-Go 是同一个东西吗
不完全是。mihomo 文档里 trojan 节点的 ss-opts 一项注明用来启用 Trojan-Go 的 Shadowsocks AEAD 加密,这是原版协议文档里没有的扩展。订阅里的 trojan 节点开了 ss-opts,就要用认这一项的 mihomo 内核客户端。
参考
相关问答
- 开梯子后网页提示SSL错误:端口填错和时间不准两个常见原因开梯子后浏览器报 ERR_SSL_PROTOCOL_ERROR,常见原因是在地址栏用 https 打开了客户端的代理端口,或者代理类型被选成了 HTTPS,这个端口只说 HTTP 和 SOCKS,握手自然失败。
- 梯子UDP转发有什么用:语音、游戏和视频通话为什么要它梯子UDP要开吗,要看你用什么,打语音电话、联机游戏、开视频会议就要开,只看网页和视频的不开也能用。
下一步问题没解决,回问答目录找挨着的那一条;要动手装,去梯子客户端按系统走;和这一篇相关的还有v2rayN Windows挂梯子教程:16 步,代理端口填哪个。