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 全部配置完成,并可以共用域名证书协同工作了。