梯子地图

原理

梯子Trojan是什么意思:为什么它看起来像普通HTTPS

短答

梯子里的 Trojan 是一种代理协议,它让客户端先和服务器做一次标准的 TLS 握手,之后的代理数据全部包在这层加密里,外面看到的就是一次普通的 HTTPS 访问。它要求服务器有域名和有效证书,密码不对的连接会被转给一个普通网站,所以探测的人也只能看到网页。所以 Trojan 节点连不上时,先查证书、sni 和系统日期这三样。

更新于

你大概是在两个地方碰到这个词的。一处是机场的套餐页,协议那一栏写着 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 节点连不上,按这个顺序查

  1. 先看系统日期。Trojan 协议本身不校验时间,但 TLS 证书有有效期,电脑日期偏得太远,证书会被判成过期或未生效,表现是全部 Trojan 节点同时握手失败。把系统时间改成自动同步,再测一次延迟。
  2. 再更新订阅。机场换了域名或证书,旧订阅里的 sni 还是原来的,更新订阅后看节点参数里的 sni 有没有变。
  3. 还不行,看客户端日志里的报错。出现 certificate、x509、handshake 这类字样,问题在证书这一层,截图发给机场客服时带上这几行。出现的是超时,按超时类问题排查。
  4. 最后才考虑跳过证书验证。这个开关在 mihomo 里叫 skip-cert-verify,在 V2Ray 系的分享链接和配置里多叫 allowInsecure,打开后能连上,说明问题就在证书,查完把它关回去。

什么时候这个答案不成立

  • 不是 trojan-gfw 原版的实现。Trojan-Go、Xray、sing-box 都实现了 Trojan,并各自加了扩展,比如 WebSocket 传输、REALITY 外层,这些扩展的行为以各自文档为准,本页只按 trojan-gfw 的协议文档写。
  • 机场的入口是中转。中转节点的地址和端口指向入口服务器,证书和 sni 怎么配由机场决定,上面“看起来像 HTTPS”说的是 Trojan 服务器那一端。
  • 客户端版本。上面的客户端例子按本站各篇教程记录时的版本,老版本或改名后的分支菜单可能不同。
  • 隐蔽性。“看起来像 HTTPS”说的是协议设计,节点会不会被识别和封锁,取决于很多协议之外的因素,本站没有测过。

接下来去哪

延伸问题

正文没展开、但和这个问题挨着的几条。点问题展开答案。

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 内核客户端。

参考

  1. trojan-gfw 协议文档
  2. trojan-gfw 仓库
  3. mihomo 文档,Trojan 节点配置
  4. Xray 文档,VLESS 出站
  5. Shadowsocks 文档,AEAD 加密

相关问答

下一步问题没解决,回问答目录找挨着的那一条;要动手装,去梯子客户端按系统走;和这一篇相关的还有v2rayN Windows挂梯子教程:16 步,代理端口填哪个。