Trojan 的设计哲学只有一句话:让代理流量看起来和访问一个普通 HTTPS 网站完全一样。它不做任何花哨的伪装——直接使用标准 TLS 1.3 加密,服务端持有一张合法证书,客户端连接时的握手行为与访问任意 HTTPS 网站无异。
这使得 Trojan 成为最容易理解、最容易部署的 TLS 类代理协议。如果你是第一次自建代理,或者不想折腾 Reality 的靶域名和 Short ID,Trojan 是最省心的起点。
⚠️ 重要提醒
本指南仅用于技术研究与学习用途。部署节点前请确认你了解并遵守所在地区的相关法律法规。
一、Trojan 是什么?
1.1 一句话定义
Trojan 是一个基于 标准 TLS 的代理协议。客户端与服务端之间的所有流量都封装在 TLS 1.3 加密通道中,外部设备看到的只是一次普通的 HTTPS 访问。
1.2 工作原理
- 服务端在 443 端口监听,持有一张 Let's Encrypt 或其他 CA 签发的 TLS 证书。
- 客户端发起 TLS 握手,握手特征与普通浏览器访问 HTTPS 网站完全一致。
- TLS 握手完成后,客户端在加密通道内发送一个密码进行身份验证。
- 验证通过后,服务端开始转发代理流量。
💡 与普通 HTTPS 网站的区别
对于审查设备来说,Trojan 服务器和一个普通的 HTTPS 网站没有区别——都有合法证书、标准 TLS 握手、正常的 HTTP 响应。唯一的"破绽"是密码验证失败时的响应,但标准的 Trojan 实现会在验证失败时返回一个真实网站的内容(如 nginx 默认页),做到"伪装到底"。
1.3 Trojan vs VLESS-Reality vs Hysteria2
| 维度 | Trojan | VLESS-Reality | Hysteria2 |
|---|---|---|---|
| 需要域名 + 证书 | ✅ 需要 | ❌ 不需要 | ❌ 不需要 |
| 认证方式 | 密码(TLS 通道内) | UUID + Reality 密钥 | 共享密码 |
| 传输协议 | TCP | TCP | QUIC / UDP |
| 抗主动探测 | 中等 | ✅ 极强 | 中等 |
| 部署难度 | 低 | 中 | 低 |
| 高丢包表现 | 一般(TCP) | 一般(TCP) | ✅ 强(QUIC) |
| 适合场景 | 入门 / 机场后端 | 抗封锁主力 | 高丢包加速 |
实操开始
二、部署前准备
2.1 环境需求
- VPS:推荐 HK / SG / JP / US 机房。
- 系统:Debian 11/12、Ubuntu 22.04/24.04。
- 域名 + 证书:需要一个域名,并为该域名申请 TLS 证书。
- 端口:默认 443(TCP)。
2.2 申请证书
如果已有证书可跳过。否则用 certbot 快速获取:
# 安装 certbot
apt update && apt install -y certbot
# 申请证书(standalone 模式,需临时占用 80 端口)
certbot certonly --standalone -d your-domain.com
# 证书路径
# /etc/letsencrypt/live/your-domain.com/fullchain.pem
# /etc/letsencrypt/live/your-domain.com/privkey.pem
三、服务端部署
Trojan 有多个服务端实现,这里推荐使用 Trojan-Go(Go 语言实现,功能最全)或 Trojan(官方 C++ 实现,轻量)。以 Trojan-Go 为例:
3.1 安装 Trojan-Go
# 下载最新版(替换为实际版本号)
wget https://github.com/p4gefau1t/trojan-go/releases/latest/download/trojan-go-linux-amd64.zip -O /tmp/trojan-go.zip
# 解压到 /usr/local/bin/
unzip /tmp/trojan-go.zip -d /usr/local/bin/
chmod +x /usr/local/bin/trojan-go
3.2 生成密码
# 生成一个强密码
openssl rand -base64 32
# 示例输出:k3J9xP2mQ7rS5tU1vW8yZ0aB4cD6eF2gH
3.3 服务端配置文件
创建 /usr/local/etc/trojan/config.json:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": [
"你的密码"
],
"log_level": 1,
"ssl": {
"cert": "/etc/letsencrypt/live/your-domain.com/fullchain.pem",
"key": "/etc/letsencrypt/live/your-domain.com/privkey.pem",
"ssl_protocols": ["TLSv1.3", "TLSv1.2"]
},
"tcp": {
"no_delay": true,
"keep_alive": true,
"reuse_port": false,
"fast_open": false,
"fast_open_qlen": 20
}
}
💡 配置项说明
remote_addr / remote_port:验证失败时代理请求转发到的后端。设为
password:数组格式,支持多用户。每个元素是一个独立密码。
ssl_protocols:建议只保留 TLSv1.3,安全性更高。
127.0.0.1:80 会让失败请求落到本地 nginx 默认页,做到"伪装成普通网站"。password:数组格式,支持多用户。每个元素是一个独立密码。
ssl_protocols:建议只保留 TLSv1.3,安全性更高。
3.4 创建 systemd 服务
cat > /etc/systemd/system/trojan.service << 'EOF'
[Unit]
Description=Trojan Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/trojan-go -config /usr/local/etc/trojan/config.json
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable trojan
systemctl start trojan
systemctl status trojan
3.5 防火墙放行
# ufw
ufw allow 443/tcp
# 或 iptables
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
⚠️ 建议配合 nginx
Trojan 验证失败时需要返回一个真实网站内容。最简单的做法是在 80 端口跑一个 nginx 默认页。安装
apt install nginx 即可,无需额外配置。四、客户端配置
4.1 通用参数
| 字段 | 值 | 说明 |
|---|---|---|
| 协议 | trojan | 客户端协议标识 |
| 地址 | 你的域名 | 需与证书域名匹配 |
| 端口 | 443 | 默认 TCP 443 |
| 密码 | 服务端配置的密码 | 两端必须一致 |
| SNI | 你的域名 | 通常与地址一致 |
| 跳过证书校验 | 通常关闭 | 使用自有证书时建议校验 |
4.2 Clash Verge / Mihomo 配置
proxies:
- name: "trojan-node"
type: trojan
server: your-domain.com
port: 443
password: 你的密码
sni: your-domain.com
skip-cert-verify: false
4.3 V2RayN 配置步骤
- V2RayN → 服务器 → 添加 Trojan 服务器。
- 地址填域名(不是 IP),端口 443,密码填入。
- 传输协议选 tcp,安全类型选 tls。
- SNI 填你的域名。
- 保存 → 右键 → 延迟测试。
4.4 Shadowrocket(iOS)
- 点击右上角 +。
- 类型选择 Trojan。
- 填写地址(域名)、端口 443、密码。
- SNI 填你的域名。
- 保存 → 连接 → 测试延迟。
五、与 VLESS-Reality 对比选型
5.1 什么时候选 Trojan?
- 你是第一次自建:Trojan 配置最简单,没有 Reality 的密钥对、Short ID、靶域名等概念。
- 你已有域名和证书:Trojan 直接用证书,不需要额外折腾。
- 你用于机场后端:很多商业机场的后端就是 Trojan,生态成熟。
- 你不需要极致抗探测:Trojan 的 TLS 伪装已经足够应对大多数场景。
5.2 什么时候该升级到 Reality?
- 审查机构开始对 TLS 证书做 CT Log 监控(证书透明度日志泄露域名-IP 关系)。
- 你的域名被主动探测后 IP 被封。
- 你需要免证书部署(没有域名、不想续签证书)。
💡 实用建议
Trojan 和 VLESS-Reality 可以同时部署在同一台 VPS 上(不同端口)。用 Trojan 做"保底线路"(简单稳定),Reality 做"主力线路"(抗探测更强),是很多用户的务实方案。
六、常见问题排查
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 连接超时 | 443 端口被阻 | systemctl status trojan,防火墙检查 |
| TLS 握手失败 | 证书过期 / 域名不匹配 | certbot certificates 检查有效期 |
| 认证失败 | 密码不一致 | 比对服务端 config.json 里的 password |
| 能连但速度慢 | VPS 带宽不足 | speedtest 测速 |
| 手机可以电脑不行 | 客户端 SNI 配置错误 | 确认 SNI 与域名完全一致 |
6.1 查看服务端日志
# 查看 Trojan 服务日志
journalctl -u trojan -f
七、安全与运维
- 密码管理:Trojan 的密码是唯一认证凭据。泄露 = 被人用你的带宽。定期轮换(每 30-90 天)。
- 证书续签:Let's Encrypt 证书 90 天过期,务必设置自动续签(
certbot renew --post-hook 'systemctl restart trojan')。 - 多用户:Trojan 原生支持数组格式的多密码配置,每个密码对应一个用户。更复杂的多用户管理可用面板。