Trojan
Trojan 是一种将代理流量完全伪装为 HTTPS 流量的代理协议,于 2017 年发布。其核心设计思路是:不去对抗检测,而是让代理流量从外观上与正常的 HTTPS 访问完全一致,使检测系统无从区分。这种设计使 Trojan 成为抗检测能力较强的传统协议之一。
设计思路
在 Trojan 出现之前,大多数代理协议采用的策略是"加密混淆"——将流量加密或变形,使其看起来像随机数据或其他协议。然而,随着检测技术的进步,即使是随机化的流量也可能被统计分析方法识别。
Trojan 换了一个思路:如果代理流量看起来就是标准的 TLS 1.3 连接,检测系统又如何区分它和正常的 HTTPS 浏览?
Trojan 的核心策略:
- 直接使用真实的 TLS 协议(而不是模拟),流量的 TLS 指纹与普通 HTTPS 客户端完全一致
- 监听在 443 端口,这是 HTTPS 的标准端口
- 服务端同时运行一个正常的 Web 服务(如 Nginx),当收到非 Trojan 流量时,表现为一个普通的 HTTPS 网站
工作原理
连接建立流程
客户端
|
| 1. 向服务器 443 端口发起标准 TLS 握手
| 2. TLS 握手完成后,发送 Trojan 请求头(含密码哈希和目标地址)
v
服务端
|
| 3. 接收 TLS 连接
| 4. 验证 Trojan 请求头中的密码哈希
| - 密码正确 → 解析目标地址,作为代理处理
| - 密码错误 → 将连接转发给后端 Web 服务器
v
目标服务器 / 回落 Web 服务
回落机制
回落(Fallback)是 Trojan 最重要的安全特性之一。当服务端接收到一个 TLS 连接,但其中的密码不正确(或根本没有 Trojan 请求头)时,服务端会将这个连接无缝转发给一个正常运行的 Web 服务器。
对于主动探测者来说:
- 他们向服务器 443 端口发起连接
- 由于不知道正确密码,流量被转发给后端 Web 服务器
- 他们得到一个看起来完全正常的 HTTPS 网站响应
- 无法判断这个服务器是否运行了代理服务
这使得 Trojan 服务器从外部看来与一个普通的 HTTPS 网站没有任何区别。
密码认证
Trojan 使用密码的 SHA224 哈希值进行认证。请求头结构简化如下:
[SHA224(密码)] + [CRLF] + [目标地址] + [CRLF] + [请求数据]
密码以哈希形式传输,避免了在网络中明文暴露密码(尽管整个连接已经在 TLS 保护之下)。
TLS 的重要性
Trojan 完全依赖 TLS 提供加密保护。这意味着:
- 必须使用有效的域名:TLS 证书需要绑定到一个域名
- 必须使用有效的证书:自签名证书会导致 TLS 握手特征异常,反而更容易被识别
- 推荐使用主流 CA 颁发的证书:Let's Encrypt、ZeroSSL 等免费 CA 颁发的证书在浏览器中受信任,TLS 指纹与真实用户相符
关于自签名证书
不要对外使用自签名证书。自签名证书会导致 TLS Client Hello 中出现与正常 HTTPS 访问不符的特征,可能被检测系统识别为异常流量。始终使用受信任的 CA 颁发的证书。
优缺点
| 优点 | 缺点 |
|---|---|
| 流量完全基于真实 TLS,极难被检测 | 需要一个指向服务器的域名 |
| 443 端口,流量与 HTTPS 高度一致 | 需要有效的 TLS 证书 |
| 回落机制有效对抗主动探测 | 原生不支持 CDN 中转 |
| 配置相对简单(无需复杂的传输层配置) | 不同 TLS 客户端实现的指纹可能存在细微差异 |
| 服务端同时提供真实 Web 服务 | 需要管理域名解析和证书续期 |
| 性能较好(直接使用 TLS,无额外加密层) | — |
Trojan 与 Trojan-Go / Trojan-GFW
Trojan 协议有多个实现版本:
| 实现 | 说明 | 维护状态 |
|---|---|---|
| trojan(原版) | 最初的 C++ 实现 | 停止维护 |
| Trojan-Go | Go 语言重写版,添加了多路复用、WebSocket 等特性 | 活跃维护 |
| Xray-core | 内置 Trojan 实现,支持 XTLS 等扩展 | 活跃维护 |
| sing-box | 内置 Trojan 实现 | 活跃维护 |
目前推荐使用 Xray-core 或 sing-box 中内置的 Trojan 实现,因为原版 trojan 和 Trojan-Go 已逐渐被整合进这些通用代理框架。
与其他协议的对比
| 对比维度 | Trojan | Shadowsocks 2022 | VLESS + Reality |
|---|---|---|---|
| 是否需要域名 | 是 | 否 | 否 |
| 是否需要证书 | 是 | 否 | 否 |
| 传输层 | TLS 1.3 | 自定义加密 | TLS 1.3 + Reality |
| 抗检测能力 | 较高 | 中 | 极高 |
| 回落机制 | 有 | 无 | 有(通过 Xray) |
| CDN 支持 | 有限(需 WebSocket 变体) | 否 | 否 |
| 配置复杂度 | 中 | 低 | 中 |
| 客户端支持广度 | 广 | 较广 | 较广 |
适用场景
推荐使用 Trojan 的场景:
- 已有可用域名和证书,希望部署一个简洁的代理节点
- 网络环境对 HTTPS 流量基本不干扰,但对混淆类流量敏感
- 需要与现有 Web 服务共用 443 端口
- 机场订阅中包含 Trojan 节点
考虑其他方案的场景:
- 没有可用域名(考虑 VLESS + Reality)
- 需要最强的抗检测能力(考虑 VLESS + Reality 或 AnyTLS)
- 需要在高丢包/高延迟线路上稳定使用(考虑 Hysteria 2 或 TUIC)
服务端部署参考
以下以 Xray-core 搭配 Caddy 为例,展示 Trojan 节点的基本部署方案。
前置条件
- 一个指向服务器 IP 的域名(已完成 DNS 解析)
- 服务器已开放 80 和 443 端口
- 已安装 Caddy 用于自动申请和续期 TLS 证书
安装 Xray-core
# 使用官方安装脚本(Debian/Ubuntu/CentOS)
bash <(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh) install
Caddy 配置(Caddyfile)
Caddy 负责处理 TLS 证书,并将来自外部的 HTTPS 请求反向代理到 Xray:
your.domain.com {
reverse_proxy /trojan-path 127.0.0.1:10443
root * /var/www/html
file_server
}
更常见的方案是让 Xray 直接监听 443 端口并处理 TLS,Caddy 只作为回落的 Web 服务器。
Xray 配置(config.json)
以下为 Xray 直接监听 443 端口,TLS 由 Xray 处理,非 Trojan 流量回落至 Nginx 的方案:
{
"inbounds": [
{
"port": 443,
"protocol": "trojan",
"settings": {
"clients": [
{
"password": "your-strong-password"
}
],
"fallbacks": [
{
"dest": 80,
"xver": 1
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [
{
"certificateFile": "/etc/ssl/certs/your.domain.com.crt",
"keyFile": "/etc/ssl/private/your.domain.com.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
申请 TLS 证书
推荐使用 acme.sh 申请 Let's Encrypt 证书:
# 安装 acme.sh
curl https://get.acme.sh | sh
# 申请证书(HTTP 验证方式,需确保 80 端口可访问)
~/.acme.sh/acme.sh --issue -d your.domain.com --webroot /var/www/html
# 安装证书到指定路径
~/.acme.sh/acme.sh --install-cert -d your.domain.com \
--cert-file /etc/ssl/certs/your.domain.com.crt \
--key-file /etc/ssl/private/your.domain.com.key \
--reloadcmd "systemctl restart xray"
acme.sh 会自动设置定时任务,在证书到期前自动续期。
回落 Web 服务(Nginx)
回落目标 Web 服务需要监听本地端口(而非 443),以接收来自 Xray 转发的非 Trojan 连接:
server {
listen 80;
server_name your.domain.com;
root /var/www/html;
index index.html;
}
关于回落内容
回落的 Web 服务最好展示一个看起来合理的网站内容(如博客、个人主页等),而不是一个空白页面或默认的 Nginx 欢迎页。空白或默认页面在主动探测场景下仍然可能引发怀疑。
启动服务
systemctl enable xray
systemctl start xray
systemctl status xray
客户端支持
Trojan 是客户端支持最广泛的协议之一,几乎所有主流代理软件都提供了完整支持:
| 平台 | 客户端 | 支持状态 |
|---|---|---|
| Windows / macOS / Linux | Mihomo、sing-box、Xray、v2rayN、V2Fly | 支持 |
| iOS | Shadowrocket、Stash、Quantumult X、Surge、Loon | 支持 |
| macOS | Stash、Surge | 支持 |
| Android | NekoBox、Husi、Exclave | 支持 |
| Linux | dae、sing-box、Mihomo | 支持 |
常见问题
Q:Trojan 的密码用什么格式?
Trojan 支持任意字符串作为密码,建议使用 16 位以上的随机字符串。密码在传输中以 SHA224 哈希形式出现,但考虑到整个连接在 TLS 保护下,主要目的是用于服务端区分不同用户。
Q:Trojan 可以搭配 CDN 使用吗?
原生的 Trojan(直接 TCP + TLS)不能直接通过 CDN 中转,因为 CDN 通常不透传底层 TCP 连接。如果需要 CDN 支持,可以使用 Trojan over WebSocket + TLS 的变体,但这种方案实际上与 VMess/VLESS over WebSocket + TLS 的效果类似,且增加了配置复杂度。
Q:Trojan 和 VLESS + TLS 有什么区别?
两者都依赖 TLS 提供加密,但身份认证机制不同(Trojan 使用密码哈希,VLESS 使用 UUID)。更重要的区别是,VLESS 支持 Reality 扩展(无需域名),而 Trojan 必须依赖真实的 TLS 证书。在新建节点时,VLESS + Reality 通常是更优的选择。
延伸阅读
- VLESS 协议 — 了解支持 Reality 的现代协议,适合无域名场景
- VMess 协议 — 了解另一个支持 WebSocket + TLS + CDN 的经典方案
- 代理协议总览 — 回到协议总览页面
- Trojan 原版仓库:github.com/trojan-gfw/trojan
- Trojan-Go:github.com/p4gefau1t/trojan-go
- Xray-core:github.com/XTLS/Xray-core