Trojan协议原理与搭建:伪装成正常HTTPS网站
Trojan协议原理
Trojan协议的设计思路非常巧妙:既然HTTPS流量是最常见、最正常的网络流量,那么将代理数据伪装成HTTPS流量就是最好的隐蔽方式。Trojan正是基于这个思路开发的。
Trojan的工作流程:
- 客户端与服务器建立真实的TLS连接(使用合法证书)
- 在TLS加密通道内,客户端发送Trojan协议头(包含密码和目标地址)
- 服务器验证密码后,将后续数据转发到目标地址
- 对于非Trojan连接(如正常HTTPS访问),服务器转发给后端Web服务器
Trojan协议的核心优势在于:
- 使用真实TLS证书,流量特征与正常HTTPS完全一致
- 主动探测看到的是真实的HTTPS网站
- 配置相对简单,性能优秀
- 不依赖特殊传输层,兼容性好
服务端部署
Trojan服务端需要配合Nginx反代使用,以实现非代理流量转发到真实网站。以下是完整的部署步骤:
# 安装Trojan
sudo bash <(curl -L https://github.com/trojan-gfw/trojan/raw/master/extras/install.sh)
# 或者使用Xray-core内置Trojan支持
bash <(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)
使用Xray-core的Trojan配置更加灵活,推荐使用:
{
"inbounds": [{
"port": 443,
"protocol": "trojan",
"settings": {
"clients": [{
"password": "your-strong-password"
}]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [{
"certificateFile": "/etc/ssl/cert.pem",
"keyFile": "/etc/ssl/key.pem"
}]
}
}
}],
"outbounds": [{
"protocol": "freedom",
"settings": {}
}]
}
Nginx反代配置
Nginx作为前端反代,负责将非Trojan流量转发到后端Web服务,实现伪装效果:
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
# Trojan流量由Xray处理(通过SNI分流或端口转发)
# 非Trojan流量转发到后端
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
更好的方案是使用SNI路由分流,让Nginx根据TLS SNI字段将流量分发给Xray或Web服务:
# nginx stream模块配置
stream {
map $ssl_preread_server_name $backend {
proxy.your-domain.com xray;
your-domain.com web;
}
upstream xray {
server 127.0.0.1:10086;
}
upstream web {
server 127.0.0.1:8080;
}
server {
listen 443;
ssl_preread on;
proxy_pass $backend;
}
}
证书申请
Trojan必须使用合法的TLS证书。推荐使用acme.sh申请Let's Encrypt免费证书:
# 安装acme.sh
curl https://get.acme.sh | sh
# 使用DNS验证申请证书(推荐)
acme.sh --issue -d your-domain.com --dns dns_cloudflare
# 安装证书到指定目录
acme.sh --installcert -d your-domain.com --key-file /etc/ssl/key.pem --fullchain-file /etc/ssl/cert.pem --reloadcmd "systemctl restart xray nginx"
证书自动续期由acme.sh的cron任务自动处理,无需手动干预。Let's Encrypt证书有效期为90天,acme.sh会在到期前30天自动续期。
客户端使用
Trojan客户端配置非常简洁:
{
"outbounds": [{
"protocol": "trojan",
"settings": {
"servers": [{
"address": "your-domain.com",
"port": 443,
"password": "your-strong-password"
}]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"allowInsecure": false
}
}
}]
}
各平台客户端均支持Trojan协议,具体下载和配置方法请访问V2Ray客户端下载站。
Trojan方案的优点是配置简单、兼容性好;缺点是需要域名和证书,且不支持CDN中转。如果追求更强的抗检测能力,建议使用Reality方案。
V2Ray