Trojan 搭建教程:用 Nginx 把 443 做成一半真站一半代理

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

六、排错

现象原因处理
访问域名 502Nginx 没监听 80ss -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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容