Trojan 作为一款优秀的代理工具,可以模拟处理 HTTPS 请求,从而达到躲避 GFW 筛查,提升扶墙成功率的目的。如果域名和网站都真实存在,是否可以既可以通过 HTTPS 协议访问网站,又可以通过 Trojan 代理上网呢?答案当然是肯定的,同一台主机可以既当 Web 服务器又当 Trojan 服务器的,并且两者可以共用域名证书配合工作。
本教程将详细讲解如何让 Trojan 和 Nginx 使用同一域名证书配合工作,同时提供服务。
1] 原理介绍
要让 Trojan 和 Nginx 可以协同工作,首先要理解 Trojan 服务器的工作原理,根据 Trojan 服务器的配置,可以大概梳理出 Trojan 代理上网的工作流程:
浏览器 <->[1080端口] Trojan 客户端 <->[443端口] Trojan 服务器 [80端口]<-> 目标网站
可以看到,Trojan 客户端侦听 1080 端口,接收 HTTP 请求,并与远程 Trojan 服务器建立 TLS 连接;Trojan 服务器侦听 443 端口,将用户浏览器的请求通过本地 80 端口转发至真正的目标网站,并将返回结果回传至 Trojan 客户端并最终返回给浏览器。
那么现在问题来了,如果 Nginx 作为 Web 服务器启动,网站运行时启动了 SSL,那么由谁来处理访问本地网站的 HTTPS 请求呢。根据 Trojan 的工作模式,答案就是 Trojan 客户端和服务器端口要匹配,如果服务器侦听了 443 端口,那么 Nginx 的 SSL 配置块需要侦听其他端口;如果 Trojan 服务器未侦听 443 端口,则客户端配置与之对应的端口,相当于 Nginx 和 Trojan 独立工作。
签于标准的 HTTPS 请求都默认侦听 443 端口,为了增加 Trojan 服务器的隐蔽性,本教程将采用 Trojan 服务器侦听443 端口,Nginx SSL 配置侦听其它端口方式,这样访问本地网站的请求都通过 Trojan 转发到本地 Nginx 服务器,大致流程如下:
浏览器 <->[1080端口] Trojan 客户端 <->[443端口] Trojan 服务器 [80端口]<->[8443]端口 Nginx 服务器
2] 实验环境
- 操作系统:CentOS 8.0
- 主机名:CentOS-8
- IP 地址:172.16.200.1
3] 安装 Trojan 及 Nginx
添加 Nginx 软件库文件”/etc/yum.repos.d/nginx.repo”,内容如下:
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
然后启动 Nginx 服务并打开防火墙服务:
# systemctl enable nginx # systemctl start nginx # firewall-cmd --add-service=http --zone=public --permanent # firewall-cmd --add-service=https --zone=public --permanent # firewall-cmd --reload
根据之前的教程,下载并安装 Trojan 服务器,同时生成证书文件 “trojan-cert.pem”和”trojan-key.pem”,Trojan 服务器配置为:
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 80,
"password": [
"Your_Password_Here",
"Password_Here_Too"
],
"log_level": 1,
"ssl": {
"cert": "/etc/trojan/trojan-cert.pem",
"key": "/etc/trojan/trojan-key.pem",
"key_password": "",
"cipher": "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHA
CHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256", "prefer_server_cipher": true,
"alpn": [
"http/1.1"
],
"reuse_session": true,
"session_ticket": false,
"session_timeout": 600,
"plain_http_response": "",
"curves": "",
"dhparam": ""
},
"tcp": {
"prefer_ipv4": false,
"no_delay": true,
"keep_alive": true,
"fast_open": false,
"fast_open_qlen": 20
},
"mysql": {
"enabled": false,
"server_addr": "127.0.0.1",
"server_port": 3306,
"database": "trojan",
"username": "trojan",
"password": ""
}
}
4] 配置 Trojan 同 Nginx 共用域名证书配合工作
此时,由 Trojan 服务器来处理默认 HTTPS 请求,修改 Nginx 的配置文件”/etc/nginx/conf.d/default.conf”,就可以让 Nginx 同 Trojan 共用域名证书并且协同工作,配置文件内容如下:
#server {
listen 8443 ssl;
server_name 172.16.200.1;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
ssl_certificate /etc/trojan/trojan-cert.pem;
ssl_certificate_key /etc/trojan/trojan-key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name 172.16.200.1;
return 302 https://172.16.200.1:8443$request_uri;
}
修改完成后,重新启动 Nginx 服务器,再通过浏览器访问”https://172.16.200.1″,页面就会自动跳转到 Nginx 对应的页面,如下图所示:

图.1 Nginx 使用 Trojan域名证书启动 TLS
查看证书信息,就会发现其使用了自己创建的证书:

图.2 Nginx 证书信息
至此,Trojan 服务器同 Nginx 全部配置完成,并可以共用域名证书协同工作了。