Trojan 是什么?装成网站的协议,为什么还是被认出来
不翻车编辑部 · 更新于

先说结论:Trojan 的办法是把代理服务器装成一个真的 HTTPS 网站,密码对就转发,密码不对就把连接交给门口的网站(回落)。2026 年 10 月 19 日我们用 Xray v26.10.17 在测试服务器上实测:配了回落的端口,敲门只看到一个菜谱网页;没配回落的,什么都不回、直接断开。它的短板在里面:你访问的网站本身也是 HTTPS,Trojan 的通道里又套着一次握手,外层包长 6 次一模一样,XTLS 团队 2023 年写的演示程序 Trojan-killer 光看长度,30 次 Trojan 连接认出 21 次,普通 HTTPS 一次没认错。Xray 官方现在要求公网 Trojan 开多路复用,启动时还会提示换成 VLESS + Vision。订阅里的 trojan 节点还能用,自己新建节点就别选它了。
这篇有视频版:YouTube 上看《trojan节点总被封?装成网站的它,30次被认出21次》。
下面的原理来自 trojan-gfw 的 README 和协议文档、Xray 文档和源码、XTLS/Trojan-killer、3x-ui 源码,以及一篇 2024 年的论文,核对日期 2026 年 10 月 19 日。实验的完整记录在文末。
Trojan 是什么
Trojan 2017 年 10 月在 GitHub 上开源(trojan-gfw/trojan,第一个版本 v0.1.0 发布于 2017 年 10 月 22 日),名字来自特洛伊木马。订阅里节点链接开头写着 trojan:// 的,用的就是它。
README 里有一句很大胆的话:Trojan 不是一个固定的程序或协议,而是一种思路,模仿最常见的服务,像到行为一模一样,就能翻过防火墙,而且永远不被认出来(without being identified ever)。

官方文档的概述说,很多人以为强加密加随机混淆就能骗过防火墙;Trojan 反着来,模仿墙外最常见的协议 HTTPS。这和早期 Shadowsocks 把流量加密成“看不出规律的乱码”正好是两条路。
几个词先说清楚:
- TLS:网站和浏览器之间的加密规矩,地址栏那把小锁就是它。
- 握手:建加密通道之前,双方先见面、交换钥匙。
- 证书:网站出示的“身份证”,由权威机构盖章,证明它是这个域名的主人。
- 域名:网站的门牌号,比如 google.com。
它怎么分辨自己人:回落
Trojan 服务器开一个货真价实的 HTTPS 端口,挂真证书。客户端先正常完成 TLS 握手,通道建好后发出的第一个包是这样的:

开头是密码算出来的 56 个字符,接着一个换行,然后是要去的地址(格式和 SOCKS5 类似),再一个换行,后面紧跟要转发的数据。
服务器核对这 56 个字符:对上了就转发;对不上,不报错,把这条已经解密的连接原封不动交给一个预设的网站(默认是本机 80 端口),让网站去回答。官方文档的原话是:结构或密码不对的连接都会转到预设端点,所以可疑的探测连上来时,Trojan 服务器的表现和那个网站完全一样。

打个比方:Trojan 像一家正常营业的小饭馆,熟客报上暗号,领进后厨小门;陌生人进来,服务员照常递上菜单。
实测一:两个端口,各敲三次门
我们用 Xray v26.10.17 开了两个 Trojan 端口:20680 配了回落(后面是 Python 自带的网页服务,放一个“小红的菜谱”页面),20682 不配回落。然后另一台电脑用 TLS 连上去,发三种首包:

| TLS 连上后发什么 | 20680(有回落) | 20682(没回落) |
|---|---|---|
像浏览器一样 GET / |
200 OK,菜谱网页 |
0 字节,连接关闭 |
| 按 Trojan 格式发,密码错 | 网站的 400 报错页 | 0 字节,连接关闭 |
| 一串乱码 | 网站的 400 报错页 | 0 字节,连接关闭 |
| 按 Trojan 格式发,密码对 | 帮我们取回了 example.com | — |
浏览器打开 20680,看到的就是这个页面:

正经网站不会对谁都不理不睬,所以没配回落的 Trojan,等于在告诉敲门的人“我有问题”。我们的诱饵用的是 Python 自带的网页服务,响应头里写着 SimpleHTTP;实际部署一般回落到 Nginx 这类常见网站。
它和 VLESS、VMess、Shadowsocks 的关系
大致两条路:
- 乱码路线:Shadowsocks、VMess,把流量加密成看不出规律的样子。
- 套 TLS 路线:Trojan 自己不另外加密,靠外层 TLS 保护。2020 年 V2Ray 加入的 VLESS(v4.27.0 预览版,8 月 6 日发布)思路和它很像,后来 Xray 在 VLESS 上发展出了 Vision 和 REALITY(见 VLESS + Vision + REALITY 那篇)。
Trojan 自己的两个程序都已经很久没有更新:
- 原版 trojan:最后一个版本 v1.16.0,2020 年 6 月 10 日;默认分支最后一次提交是 2020 年 11 月。
- Trojan-Go:最后一个版本 v0.10.6,2021 年 9 月 14 日,之后默认分支没有新提交。

两个仓库都没有标“归档”,但现在大家用的 Trojan,基本是 Xray、sing-box、mihomo 这些内核里自带的实现。
第一关:长相(TLS 指纹)
客户端发出的第一个握手包(客户端问候)列着它会用的加密方式和扩展,每种程序列法不同,这叫 TLS 指纹。Xray 文档写着,fingerprint 默认值是 chrome,通过 uTLS 库模拟 Chrome 的握手。
我们抓下来的 Trojan 外层握手,加密套件 15 个、扩展 16 个,JA4 指纹里代表加密套件的那一段(8daaf6152771)和 NaiveProxy 那期抓到的 Chrome 155 相同:

JA4 开头的 d/i 是连的域名还是 IP,h1/h2 是协商的 HTTP 版本,和客户端本身无关。所以长相这一关,现在的客户端基本能过。问题出在里面。
实测二:TLS 套 TLS,外层包长一模一样
你翻墙去看的网站本身也是 HTTPS,于是 Trojan 的加密通道里面,又装着你和网站之间的一次 TLS 握手,这就是“TLS 套 TLS”(AnyTLS 那篇讲过)。像快递箱里又套着一个快递箱:外面封得再严,里面那个箱子有多大,还是会透出来。
我们经 Trojan(不开多路复用)把 https://www.bing.com/ 连着打开 6 次,在服务器上用 tshark 读外层 TLS 记录的长度。握手之后客户端发出的前 8 个记录:

6 次每个数字都一样。611 是这样来的:里面 curl 的客户端问候记录 517 字节(直连抓包核对过,512 + 5 字节记录头),加上 Trojan 的请求头 77 字节(56 字节密码哈希、两个换行、命令、地址、端口),再加外层 TLS 1.3 的加密开销 17 字节,正好 611。外面的人不用解密,光看长度就能猜到里面正在握手。
对照一下:NaiveProxy 同样请求 6 次,外层前几个包每次长度都不一样,因为它在开头几次收发里加了随机填充。
实测三:把 Trojan-killer 跑一遍
Trojan-killer 是 XTLS 团队 2023 年 5 月放出来的演示程序,README 第一行写着要“狠狠打脸”那些认为 TLS in TLS 检测不存在或成本很高的人。

它的代码只有 2100 字节,规则很简单:外层握手结束后,客户端先上传 650–750 字节,服务器接着回 170–180 或 3000–7500 字节,就判定“这是 Trojan”。不解密,只看长度。
我们照它的说明,把它当成一个 HTTP 代理串在 Trojan 客户端和服务器中间(唯一改动是监听端口),访问 10 个常见网站,每个 3 轮:

| 组 | 走法 | 外层连接 | 被认成 Trojan |
|---|---|---|---|
| A | Trojan,不开多路复用,里面是 HTTPS | 30 | 21 |
| B | 不走 Trojan,直接访问 HTTPS(对照) | 30 | 0 |
| C | Trojan + 多路复用(8 路) | 1 | 0 |
| D | Trojan,里面是不加密的 HTTP | 30 | 0 |
A 组没认出的 9 次,集中在 google、cloudflare、netflix 三个网站,三轮都没中:它们回来的字节数不在这个程序设的范围里。
要说清楚的是:这是三年多以前写的演示,数字范围按当时常见的握手长度卡死了;里面换成客户端问候更长的程序(比如带后量子密钥交换的新版 Chrome,约 1900 字节),这条规则就对不上。防火墙实际用什么规则,没有公开数据。21/30 只说明“光看长度就能认”这件事成立。
论文怎么说
2024 年 USENIX Security 会议上,Xue 等研究者发表了一篇专门识别 TLS 套 TLS 的论文,在美国一家运营商的网络里测了多种代理配置。表 3 里:

- trojan over tls:73.7%
- 没做填充的 VLESS + TLS:74.8%,两个差不多
- Trojan 开多路复用(8 路):17.9%
多路复用就是把很多条连接合进一条里跑,里面那些握手混在一起,长度规律被打乱。我们的 C 组也是这样:30 次请求共用一条外层连接,Trojan-killer 一次都没认出来。
Xray 官方的态度
Xray 文档的 Trojan 页现在写着:Trojan 必须配合 TLS 使用;公网环境中还要求启用 Mux,否则内层载荷本身也是 TLS 时就会形成 TLS 套 TLS,很容易被检测,后面直接链到 Trojan-killer(这段 2026 年 7 月加进文档)。

2026 年 1 月 18 日,Xray 给 allowInsecure、Shadowsocks、VMess、Trojan、不带流控的 VLESS 一起加了弃用警告(v26.1.18 起)。我们用 v26.10.17 启动 Trojan,日志是这样的:

不过打印这行的函数叫 PrintNonRemovalDeprecatedFeatureWarning,源码注释写的是“近期不会删除的弃用功能”。我们不开多路复用的 Trojan 客户端配置,xray run -test 也照样通过、能正常连。所以现有的 Trojan 节点暂时还能用。

和 VLESS + REALITY 比
- 证书:Trojan 要自己的域名、证书,门口还要放一个网站;REALITY 借用别人网站的证书,不用买域名。
- 套娃:Vision 把里面握手阶段的短包填长,握手结束后里层已加密的数据原样转发,不再加密第二遍,专门对付 TLS 套 TLS。
- Trojan-killer 的 README 里也写着,他们多次收到的反馈是“Trojan 被封、XTLS Vision 存活”,并说 REALITY 的“白名单域名”会被豁免于这类检测(这是他们的观察)。
3x-ui(v3.10.2)能建 Trojan 入站。源码里 REALITY 可选的协议是 vless 和 trojan,但 Vision 流控只给 VLESS 用:
![3x-ui 源码 protocol-capabilities.ts:REALITY_ELIGIBLE_PROTOCOLS = [‘vless’, ‘trojan’],VISION_FLOW = ‘xtls-rprx-vision’](/_astro/trojan-3xui-reality-2026-10.BpD3fxUa_1sM5R9.webp)
客户端和“跳过证书验证”
Trojan 出来得早,支持它的软件很多:Windows 的 v2rayN(Xray、sing-box 内核)、Clash 系的 mihomo 内核、sing-box 都能用。
要小心订阅里的一个选项:跳过证书验证,mihomo 里叫 skip-cert-verify,Xray 系客户端里叫“允许不安全”(allowInsecure)。

Trojan 的伪装全靠那张真证书。跳过验证,等于不核对对方的身份证,别人冒充你的服务器,你也发现不了。Xray 已经把 allowInsecure 标成弃用,文档建议改用 pinnedPeerCertSha256 固定证书。
订阅里的 trojan 节点怎么办
- 还能用,但比带 Vision 或 REALITY 的节点更容易被认出来。
- 客户端里有多路复用(Mux)开关的,可以试着打开。前提是服务器那头也支持(Xray 的 Mux 和 mihomo 的 smux 不是一套),开了连不上就关回去。代价是好几条连接挤在一条线上,这条线卡住,大家一起卡。
- 自己搭的,新建节点直接用 VLESS + Vision + REALITY,3x-ui 里点几下就有(3x-ui 完整搭建教程);REALITY 的目标网站可以先用REALITY 目标网站检测查一下。已经在用 Trojan 的不着急马上拆,下次重装时换掉。
常见问题
Trojan 比 VMess 更安全吗? 两个都能挡住路上的人偷看内容,差别在于容不容易被认出来。节点那头能看到什么,和协议没有关系,见VPN 厂商能看到什么。
Trojan 会让网速变快吗? 不会。它加的东西很少,快不快主要看服务器和线路。
为什么有的 Trojan 节点不用域名也能连? 多半是用了自签证书,或者开了跳过证书验证,伪装和安全都打了折扣。
Trojan 会被删掉吗? Xray 的警告写着“可能会被移除”,但源码注释说近期不会删。具体以 Xray 发布说明为准。
Trojan-Go 还能用吗? 程序还能跑,但 2021 年 9 月以后没有新版本。Xray、sing-box、mihomo 里都有 Trojan 实现,没必要再装它。
实验记录
- 时间:2026 年 10 月 19 日(UTC 08:07–08:09)
- 服务器:测试服务器(1 核 2 GB,Ubuntu 22.04),临时进程,实验后已删除
- 服务端:Xray-core v26.10.17;20680 端口 Trojan + TLS + 回落(
fallbacks指向本机 Python 网页服务),20682 端口 Trojan + TLS 不回落;实验用临时自签证书,客户端用pinnedPeerCertSha256固定 - 客户端:同一台服务器上的 Xray v26.10.17(默认
chrome指纹),一个不开 Mux,一个开 Mux(concurrency 8);里面的请求用 curl 7.81.0(OpenSSL 3.0.2) - Trojan-killer:XTLS/Trojan-killer 原版代码,只把监听端口从 12345 改成 20683,经 Xray 的
dialerProxy串在客户端和服务器之间 - 抓包:tcpdump 抓 20680 端口,tshark 4.6.8 读 TLS 记录长度和 JA4
- 局限:单台服务器、单个时段;客户端和服务端在同一台机器上,只看长度和回应,不测速度;识别率只引用论文,没有在真实审查网络里测;Trojan-killer 是 2023 年的简单演示规则
资料来源
- trojan-gfw/trojan(README、发布页)
- Trojan 官方文档:概述、协议
- p4gefau1t/trojan-go 发布页
- XTLS/Trojan-killer
- Xray 文档:Trojan 入站、TLS
- Xray-core 提交 5836f36f(弃用警告)、feature_errors.go
- MHSanaei/3x-ui(README、protocol-capabilities.ts)
- mihomo Trojan 文档
- Xue 等,Fingerprinting Obfuscated Proxy Traffic with Encapsulated TLS Handshakes,USENIX Security 2024
- v2fly/v2ray-core v4.27.0 发布页(VLESS 预览)
