Trojan 是一种藏身于 TLS 之中的代理协议,而 TLS 正是保护 HTTPS 网站的那套加密。你的设备与服务器建立一条普通的 TLS 连接(通常在 443 端口),并在其中发送密码和你想访问的地址。如果密码不对,服务器就表现得像一个普通网站,所以在旁观者看来,Trojan 代理协议就像日常的 HTTPS 浏览。

本文介绍 Trojan 是什么、如何工作、它的传输方式和 REALITY、优缺点,以及如何看懂 trojan:// 链接。准备好动手设置了?见 iPhone 怎么用 Trojan。

Trojan 代理协议是什么?

虽然名字叫 Trojan,它和恶意软件毫无关系。这个名字来自特洛伊木马:代理流量藏在一个看似无害、司空见惯的东西里传输。

Trojan 并没有发明自己的加密,而是依靠 TLS 完成加密,只在上面加一个非常小的头部:密码的哈希值、一条命令和目标地址。这让协议非常简单,也意味着它的加密就是银行和浏览器所用的、经过充分研究的 TLS。

它的设计目标是混入正常流量。如今互联网上的大部分流量都是 443 端口上的 HTTPS。Trojan 服务器就守在这个端口上,拥有真实的域名和证书,任何不是有效 Trojan 客户端的访问者都会收到一个真实的网页。

发展简史

最初的实现 trojan-gfw 用 C++ 编写,大约在 2019 年出现,其规范发布在项目的协议页面上。随后出现了用 Go 重写的 trojan-go,增加了 WebSocket 传输和多路复用。如今 Xray、sing-box、Mihomo 等大多数多协议服务端和客户端都内置了 Trojan,这些项目还为它增加了更多传输方式和 REALITY 支持。

Trojan 的工作原理

  1. TLS 握手。 客户端连接服务器(通常在 443 端口),并以 trojan.example.com 这样的服务器名称(SNI)发起 TLS。服务器出示该名称的有效证书。
  2. Trojan 请求。 在加密连接中,客户端发送密码的 SHA-224 哈希值、一条命令(connect 或 UDP associate)以及目标地址,例如 example.org:443。
  3. 校验。 服务器把哈希值与各用户的密码进行比对。
  4. 转发或回落。 如果哈希值匹配,服务器就连接目标并双向转发数据。如果不匹配,服务器会把整条连接交给一个回落(fallback)Web 服务器,访问者看到的就是一个普通网站。
  5. UDP。 UDP 数据包经过封装,在同一条 TLS 连接中传输。
iPhone ──TLS (SNI trojan.example.com)──▶ Trojan server ──▶ example.org
                                          │
                     wrong password ──────┴──▶ ordinary website (fallback)

回落机制正是 Trojan 与 Shadowsocks 的不同之处。探测者连接服务器时会得到一个正常的网页,而不是被断开连接。

传输方式:纯 TLS、WebSocket 和 gRPC

纯 Trojan 直接运行在 TLS 之上。大多数服务器还提供某种传输方式,把 Trojan 数据流放在另一种协议中承载:

  • WebSocket 运行在一个常规 HTTPS 请求之内。由于 CDN 和反向代理都能处理 WebSocket,服务器可以躲在 CDN 后面,隐藏自己的真实 IP 地址。
  • gRPC 运行在 HTTP/2 之上,同样能通过很多 CDN 和反向代理。
  • HTTP/2 和 HTTP Upgrade 是一些服务器使用的类似选项。

传输方式会增加一些开销,也多了需要设对的参数,例如路径或服务名称。只有服务器为此做了配置时才使用。

Trojan 搭配 REALITY

传统的 Trojan 服务器需要自己的域名和证书。Xray 项目创造的 REALITY 免去了这一要求:服务器借用一个真实存在、毫不相干的网站的 TLS 握手。知道服务器公钥和短 ID 的客户端可以使用代理,其他所有人都会被转交给那个真实网站。

REALITY 通常与 VLESS 搭配,但 Trojan 服务器也可以使用。详见 VLESS + REALITY 是什么?

优点和缺点

优点

  • 看起来就像 443 端口上的普通 HTTPS。
  • 被探测时用真实网站回应,而不是毫无反应。
  • 使用标准 TLS,而不是自创的加密算法。
  • 实现简单,因此支持广泛。
  • 既承载 TCP,也承载 UDP。

缺点

  • 需要域名和有效证书,除非使用 REALITY。
  • 客户端的 TLS 握手可能与浏览器不同。客户端提供浏览器指纹选项来模仿浏览器,但终究只是模仿。
  • 研究人员已经证明,TLS 套 TLS(例如通过 Trojan 浏览 HTTPS 网站时)可能在数据包大小和时序上留下特征。
  • 密码错误时不会报错,只会看到回落网站,出错更难发现。
  • 在 TCP 连接中承载 UDP,丢包时表现会变差,游戏和通话会有明显感受。

Trojan、Shadowsocks、VLESS 与 VMess 对比

Trojan Shadowsocks VLESS VMess
加密 TLS 自有加密方式 TLS 或 REALITY 自有加密,可选 TLS
看起来像 HTTPS 随机字节 HTTPS 随机字节,或配合 TLS 时像 HTTPS
需要证书 是,或使用 REALITY 否 是,或使用 REALITY 仅在使用 TLS 时
UDP 是 是 是 是
凭据 密码 密码或密钥 UUID UUID

想深入比较,请阅读 Shadowsocks 是什么?、VMess 和 VLESS 的区别和代理协议对比。

trojan:// 链接长什么样

服务商以 trojan:// 链接的形式分享 Trojan 服务器,常常也提供二维码:

trojan://password@host:port?parameters#name
  • password 是服务器密码,经过百分号编码。
  • host 和 port 是服务器地址和端口(省略时为 443)。
  • parameters 设置 TLS 和传输方式:sni 是服务器名称,type 是传输方式(tcp、ws、grpc),host 和 path 用于 WebSocket,serviceName 用于 gRPC,security=reality 加上 pbk 和 sid 用于 REALITY。
  • name 是 App 中显示的名称。

以下示例的密码均为 secret:

trojan://secret@trojan.example.com:443?sni=trojan.example.com#Basic
trojan://secret@trojan.example.com:443?security=tls&type=ws&host=cdn.example.com&path=%2Fws#WebSocket
trojan://secret@trojan.example.com:443?security=tls&type=grpc&serviceName=TrojanGun#gRPC
trojan://secret@trojan.example.com:443?security=reality&sni=www.example.com&pbk=Z84J2IelR9ch3k8VtlVhhs5ycBUlXA7wHBWcBrjqnAw&sid=0123abcd&fp=chrome#REALITY

Potatso 读取的每个参数都列在 Trojan 参考中。

在 iPhone 上使用 Trojan

iOS 没有内置 Trojan 支持,所以你需要一个客户端 App。Potatso 是一款免费的 iPhone 和 iPad 代理客户端,可以导入 trojan:// 和 trojan-go:// 链接、二维码和 Clash 订阅,支持 WebSocket、gRPC、HTTP/2、HTTP Upgrade 和 REALITY。按照分步教程操作:iPhone 怎么用 Trojan。

常见问题

Trojan 代理协议是病毒吗?
不是。Trojan 是一种代理协议,不是恶意软件。它以特洛伊木马命名,是因为它把代理流量藏在一条看似普通的 HTTPS 连接里,而不是因为它会危害你的设备。
Trojan 需要域名和证书吗?
传统的 Trojan 服务器需要域名和有效的 TLS 证书,因为连接是真正的 TLS。搭配 REALITY 的 Trojan 服务器则借用另一个网站的 TLS 握手,所以不需要自己的证书。
Trojan 用哪个端口?
通常是标准的 HTTPS 端口 443,这样连接看起来就像普通的网页流量。只要服务器这样设置,任何端口都可以;trojan:// 链接省略端口时使用 443。
Trojan 支持 UDP 吗?
支持。Trojan 把 UDP 放在与 TCP 相同的 TLS 连接中承载。在包括 Potatso 在内的 Clash 兼容客户端中,Trojan 服务器的 UDP 默认关闭,如果你的服务器转发 UDP,请把它打开。
Trojan 比 Shadowsocks 更好吗?
取决于网络环境。Trojan 看起来像 HTTPS,被探测时会像真正的网站一样回应;Shadowsocks 更简单,不需要证书,开销也更小。很多服务商两种都提供,你可以分别试试。

其他语言版本: English · 繁體中文 · 日本語 · Русский