Trojan 的思路很直接:把代理流量伪装成正常的 HTTPS 访问。它要求你必须有一个能签证书的域名,换来的好处是——在网络上它和访问一个普通网站没有任何区别。这篇讲清楚怎么用 Nginx 把 443 端口做成”一半真网站、一半代理”。
一、原理:为什么一定要配 Nginx
Trojan 服务端自己带 TLS,但一个裸的 TLS 服务在 443 上「什么都不返回」是很可疑的。标准做法是:
- Nginx 占 443,正常提供 HTTPS 网站
- Trojan 监听本地 4433(不对外)
- Nginx 用
stream模块按特征分流,或者用 Trojan 的fallback机制把非代理流量转给 Nginx
后者更简单:Trojan 占 443,密码不对的连接自动 fallback 到本地 80 端口的 Nginx——探测者看到的是一个真网站。本文用 fallback 方案。
二、域名与证书
# 1. 域名 A 记录指向服务器 IP,等生效
dig +short your-domain.com
# 2. 装 Nginx 和 certbot
apt update && apt -y install nginx certbot python3-certbot-nginx
# 3. 签证书(--nginx 会自动改配置加 443)
certbot --nginx -d your-domain.com --agree-tos -m you@example.com --redirect
# 4. 自动续期测试
certbot renew --dry-run
证书路径固定在 /etc/letsencrypt/live/your-domain.com/,后面配置要用 fullchain.pem 和 privkey.pem。
三、把 Nginx 挪到 80
Trojan 要独占 443,所以 Nginx 只能监听本地 80:
cat > /etc/nginx/sites-available/mysite <<'EOF'
server {
listen 127.0.0.1:80;
server_name your-domain.com;
root /var/www/html;
index index.html;
location / { try_files $uri $uri/ =404; }
}
EOF
ln -sf /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
echo "hello" > /var/www/html/index.html
四、装 Trojan 并配置
apt -y install trojan
# 若源里没有,用官方二进制:
# wget -O /tmp/trojan.tar.xz https://github.com/trojan-gfw/trojan/releases/latest/download/trojan-1.16.0-linux-amd64.tar.xz
cat > /etc/trojan/config.json <<'EOF'
{
"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",
"alpn": ["http/1.1"],
"session_ticket": true,
"reuse_session": true
},
"tcp": { "fast_open": true, "no_delay": true }
}
EOF
systemctl enable --now trojan
systemctl status trojan --no-pager
remote_addr/remote_port 就是 fallback 目标:密码不对的连接会被丢给本地 Nginx。这样外人访问 https://your-domain.com 看到的是一个正常页面。
五、客户端
trojan://密码@your-domain.com:443?sni=your-domain.com#my-node
- 密码里如果有
@ : # /必须 URL 编码 sni必须等于证书域名,写 IP 会握手失败- 客户端:v2rayN、Mihomo、Shadowrocket 都原生支持 trojan
六、排错
| 现象 | 原因 | 处理 |
|---|---|---|
| 访问域名 502 | Nginx 没监听 80 | ss -lntp | grep :80 |
| 客户端证书错误 | 用了 cert.pem 而不是 fullchain | 换 fullchain.pem |
| 连上就断 | 密码含特殊字符未编码 | 改用纯字母数字密码 |
| 90 天后失效 | 证书没续期 | systemctl status certbot.timer |
| 域名能开但代理不通 | alpn 写了 h2 | 改回 ["http/1.1"] |
七、这套方案的真实短板
- 要域名:每年几十块,还要记得续费,忘了证书就断了
- 证书是公开信息:CT 日志会记录你签了哪个域名,等于告诉别人”这台机器有服务”
- SNI 明文:TLS 握手里域名是明文的,所以域名别起得太扎眼
- 性能略低于 Reality:多一层 TLS 终结
如果你的场景必须要”看起来像个正常网站”,Trojan 依然是最省心的选择;如果只是想少折腾,直接上 VLESS + Reality。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END









暂无评论内容