一台 Trojan 服务器对外只开 443 端口,挂一张正经 CA 签发的证书。每天来敲这个端口的大致有三种,带着正确密码的代理客户端,路过的浏览器和爬虫,还有专门来摸这台机器底细的探测程序。Trojan 的设计围着一个目标转,后两种来客怎么看,对面都只是一台普通的 HTTPS 网站。
trojan-gfw 的 README 把 Trojan 叫作一个主意,还特意声明它没有固定的程序或协议形态。这个主意是把最常见的服务模仿到行为一模一样。项目的概述页顺带点评了别的路线,那些方案押的是强加密和随机混淆能骗过审查,Trojan 选了反方向,去模仿墙两边最常见的 HTTPS。Shadowsocks 的规范说自己的流量和随机字节流分不开,正是被点评的那一类。
第一种来客带着密码,头 58 个字节就交代了身份
TLS 握手走完以后,客户端发出的第一段数据按协议文档是这个结构。
hex(SHA224(password)) 56 字节
CRLF 2 字节,也就是 \r\n
Trojan Request CMD、ATYP、目标地址、目标端口
CRLF 2 字节
Payload 要转发的数据
打头的是密码的 SHA224 摘要,用十六进制字符写出来,长度恒为 56,后面跟一个回车换行。Request 借的是 SOCKS5 的格式。CMD 占 1 个字节,0x01 是普通的 TCP 连接,0x03 是 UDP。ATYP 也占 1 个字节,用来区分 IPv4、域名和 IPv6 三种地址,再往后是目标地址和 2 个字节的端口。要转发的数据跟在同一个包里一起发走,协议文档解释过原因,这样能躲开按包长识别的检测,也能少发几个包。
服务器核对那 56 个字符,对上了就替你去连目标地址,这条 TLS 连接里此后跑的就是你的数据。协议的内容只有这么多。它自己不加密,保密和防篡改全交给外面那层 TLS,头部里也没有时间戳,设备的钟偏几分钟不影响 Trojan 节点,这一点和 VMess、Shadowsocks 2022 不同。
服务器那头存的密码可以有很多个。trojan-gfw 的配置文档里 password 一项是个数组,Xray 的 Trojan 入站则是一串用户,每人一个密码,还能各自带上邮箱和等级。机场给每个用户发不同的密码,服务器看摘要就知道来的是谁。
UDP 也装在这条 TLS 连接里走。CMD 写成 0x03 以后,每个 UDP 包前面带上自己的目标地址、端口和长度,再加一个回车换行,一个接一个塞进同一条连接。Surge 手册说 Trojan 的 UDP 转发不用额外参数,mihomo 的节点要写 udp: true,机场那头放不放行是另一回事。
既然全靠 TLS,TLS 就不能省。Xray 文档的 Trojan 页面开头就是一条要求,传输安全这一项得选 TLS。mihomo 的 TLS 文档有半句话专门说它,trojan 协议强制启用,节点上用不着再写开关。
第二种来客是浏览器,它会拿到一张真网页
密码对不上、格式也不对的连接,协议文档统称为其他协议。服务器对它们的处理办法是在客户端和一个预设端点之间接一条隧道。预设端点默认是 127.0.0.1:80,也就是服务器本机的 HTTP 服务,trojan-gfw 的配置文件里用 remote_addr 和 remote_port 两项来指定。
有人用浏览器打开这台服务器的域名,TLS 握手正常完成,接着发来一个 HTTP 请求。请求里没有那 56 个字符,它被原样转给后面的网站,浏览器显示的是一张真实的网页。
Xray 把同样的机制叫回落,触发条件写得很细。首包不足 58 个字节,或者第 57 个字节不是 \r,或者身份认证失败,三者占一条就回落。58 这个数就是 56 个字符的摘要加上回车换行。
机场要为这套做法多备几样东西,一个域名,一张有效证书,服务器后面再挂一个能打开的站点。trojan-gfw 的配置文档在证书那一项用大写字母写着强烈建议由 CA 签发。订阅里那一行 sni,写的正是这个域名。
第三种来客是探测程序,待遇和浏览器一样
协议文档把对抗检测分成两头讲。主动探测这一头,凡是结构和密码不对的连接一律转去预设端点,探测的人发什么过来,回答它的都是那台 HTTP 服务器。被动检测这一头,流量有 TLS 保护,文档认为它看上去和普通 HTTPS 没有区别,还在括号里补了一句,使用有效证书是用户自己的责任。
后一条放到今天要打个折扣。Xray 文档在 Trojan 页面上提醒,公网环境里还要求启用 Mux,否则里层的数据本身也是 TLS 的时候,就成了 TLS 里面套 TLS,文档的原话是很容易被检测。你通过代理访问的网站绝大多数是 HTTPS,这种套叠几乎每条连接都有。
后来出现的几样东西都冲着这个问题来。Xray 在 2022 年 10 月 29 日发布的 v1.6.2 里加入 XTLS Vision,发布说明注明 Vision 在测试阶段仅对 VLESS 开放,Trojan 暂时用不上。AnyTLS 的 README 第一句就说自己是一个试图缓解 TLS in TLS 问题的代理协议。留在 Trojan 这边能做的是打开多路复用,mihomo 的 trojan 节点有 smux,sing-box 有 multiplex,两个开关默认都关着,开不开要看机场的服务端。
原始程序停在 2020 年,协议被各家内核接了过去
trojan-gfw 的仓库建于 2017 年 10 月 21 日,用 C++ 写成,许可证是 GPL-3.0。它最后一个发布版是 2020 年 6 月 10 日的 v1.16.0,主分支最后一次提交是同一年的 11 月 8 日。trojan-go 拿 Go 语言把它重写了一遍,仓库建于 2020 年 3 月 17 日,最后一版 v0.10.6 发布于 2021 年 9 月 14 日。
两个仓库安静下来以后,Trojan 反倒成了各家内核的标配。Xray、mihomo、sing-box 的文档里都有 Trojan 一页,机场的服务端和你手里的客户端,用的都是这些后来的实现。三种代理内核各写各的,靠同一份协议文档保持互通。
trojan-go 当年加过一批扩展,多路复用、走 CDN 用的 WebSocket、拿 Shadowsocks AEAD 再加密一层。它的 README 说基础部分兼容原版协议和配置格式,一旦用上扩展特性就不再兼容。mihomo 的 trojan 节点里那组 ss-opts 字段就是留给这层 AEAD 加密的,默认关闭。各家内核自己也往 Trojan 上加东西,mihomo 和 Stash 的 Trojan 节点都可以带 reality-opts。
客户端这边要看的只有几行
支持 Trojan 的客户端很全。三种内核之外,Surge、Stash、Loon 的文档里都列着它,挑客户端时不用为 Trojan 单独考虑,按平台去客户端总览里选就行。
一个 Trojan 节点在 mihomo 里大致是这样。
proxies:
- name: "东京 03"
type: trojan
server: tk03.example.net
port: 443
password: "订阅里下发的密码"
sni: tk03.example.net
client-fingerprint: chrome
skip-cert-verify: false
udp: true
password 由订阅下发,节点忽然连不上时先更新一次订阅,排除密码已经换过的可能。sni 留空的话,mihomo 会拿 server 里的地址顶上。client-fingerprint 让客户端在 TLS 握手时模仿某种浏览器的指纹,按 mihomo 文档,这一栏能填 chrome、firefox、safari、ios、android、edge、360、qq 和 random。有的机场让 Trojan 走 CDN,节点里会多出传输层的设置,mihomo 的 network 一栏支持 ws 和 grpc,不写就是 tcp,Surge 对应的参数是 ws=true。
最该看一眼的是 skip-cert-verify。它为 true 时客户端不核对证书,Trojan 靠有效证书换来的那份安全就少了一块。trojan-gfw 的配置文档把校验证书和校验主机名两项都标成强烈建议。
换到 Surge,同一个节点是一行。
东京 03 = trojan, tk03.example.net, 443, password=订阅里下发的密码, sni=tk03.example.net
本站记录里写明 Trojan 的有 2 家
本站收录的 28 家机场里,协议一栏有记录的是 8 家,写了 Trojan 的有极连云和灵动云两家。极连云的依据是资料截图里能看到中转 Trojan 的节点。灵动云的站点文案里 VLESS 和 Trojan 都提到过,我在 2026 年 7 月实测时拿到的是 VLESS 节点。这两家的核对日分别是 2026 年 8 月 9 日和 8 月 8 日。
其余 20 家的资料没写协议,订阅里带不带 Trojan 节点要导入以后才知道。几种协议在这 28 家里的分布,汇总在机场常见协议总览里。
常见问题
Trojan 节点里 skip-cert-verify 写着 true,有没有风险
有。这一项为 true 时客户端不再核对服务器证书,Trojan 靠有效证书建立的那层信任就落空了,中间人冒充服务器的门槛会低很多。trojan-gfw 的配置文档把校验证书和校验主机名都标成强烈建议。这一行由机场在订阅里下发,见到 true 可以去问客服为什么不用正规证书。
Trojan 能转发 UDP 吗
能。协议的请求头里 CMD 为 0x03 就代表 UDP,每个 UDP 包带着自己的目标地址和长度,装在同一条 TLS 连接里送出去。Surge 手册写明 Trojan 的 UDP 转发自动可用,mihomo 的节点要写上 udp true。节点实际放不放行 UDP 由机场服务端决定。
iPhone 上哪些客户端支持 Trojan
我查过文档的几家都支持。Surge 手册有 Trojan 一页,还支持 WebSocket 传输。Stash 和 Loon 的协议清单里也都有 Trojan,Stash 的 Trojan 节点还能带 REALITY 参数。Trojan 是各家支持得最齐的协议之一,选客户端时不用为它单独费心。
trojan-go 的节点和普通 Trojan 节点通用吗
只用基础功能时通用,用了扩展就不通用。trojan-go 的 README 写明它兼容原版 Trojan 协议和配置格式,但多路复用、WebSocket 这些扩展特性一旦启用就和原版不兼容。mihomo 为它的 Shadowsocks AEAD 二次加密专门留了 ss-opts 字段,默认关闭。
Trojan 的流量和正常访问 HTTPS 网站完全一样吗
外层一样,细节上有差别。连接用的是真 TLS 和真证书,单看握手分不出来。Xray 文档提醒过,代理里面跑的多半也是 TLS,形成 TLS 套 TLS,这种特征容易被检测,所以它要求公网环境下打开 Mux。
参考来源
- Trojan 官方协议文档
- Trojan 官方概述页
- Trojan 官方配置文档
- trojan-gfw/trojan 仓库 README
- GitHub API,trojan-gfw/trojan 的仓库信息、发布列表与提交记录
- p4gefau1t/trojan-go 仓库 README
- GitHub API,trojan-go 的仓库信息与发布列表
- Xray 文档,Trojan 出站
- Xray 文档,Trojan 入站
- Xray 文档,Fallback 回落
- Xray-core v1.6.2 发布说明(2022-10-29)
- mihomo 文档,Trojan 节点
- mihomo 文档,TLS 通用字段
- sing-box 文档,Trojan 出站
- Surge 手册,Trojan 策略
- Stash 文档,支持的代理协议
- Loon 文档,节点格式
- anytls-go 仓库 README
更新记录
- 首次发布