上一篇文章记录了trojan的安装过程,但是使用过程发现443端口被trojan服务占用后,就不好部署一些自己的服务网站了。比如我想实现一个在线json解析的页面,并给这个页面申请个子域名json.mfun.ink,由于443端口已经被占用,我们无法直接使用nginx给json.mfun.ink在443端口上配置ssl。那该如何解决呢?我们可以通过nginx的流(stream)代理转发443端口的流量。把trojan的流量转发给trojan服务,把其他https域名的流量转发相应的https服务。
首先,443端口要给nginx用,我们需要修改trojan-go服务的端口,修改配置文件/etc/trojan/conf/server.json的local_port字段随便改成一个未被使用的端口,比如这里改成8089。这里的配置文件路径以及下文中的都是上篇文章trojan-go 安装配置中介绍的一键脚本默认安装的路径,如果不是使用的这个脚本可以根据自己安装部署时的配置文件路径进行更改。
接下来修改nginx配置文件/etc/nginx/conf/nginx.conf,在配置文件下方添加stream流转发配置:
stream {
map $ssl_preread_server_name $name {
json.xxx.com json;
default trojan;
}
upstream json {
server json.xxx.com:8088;
}
upstream trojan {
server xxx.com:8089;
}
server {
listen 443;
proxy_connect_timeout 5s;
proxy_timeout 20s;
proxy_pass $name;
ssl_preread on;
}
}
这样就把来自 https://json.xxx.com 的流量转发到了 json.xxx.com:8088 上,把其他域名的443端口的流量转发给了trojan服务。这个配置就是指trojan在8089端口启动了服务,那我们的 json.xxx.com 在8088端口上也要开启服务,这是标准的http web页面直接在nginx http下添加配置即可。
server {
listen 8808 ssl;
server_name json.xxx.com;
ssl_certificate /data/json.xxx.com/fullchain.cer;
ssl_certificate_key /data/json.xxx.com/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
location / {
root /usr/www/json;
index index.html index.htm;
}
}
以上修改完trojan和nginx的配置后都可以使用脚本/etc/trojan_mgr.sh来重启相应服务
./etc/trojan_mgr.sh
====================================================================
检测到您当前安装的是Nginx + Trojan-go + Tls
====================================================================
1. 停止trojan-go 2. 重启trojan-go
====================================================================
3. 修改trojan-go密码 4. 停止nginx
====================================================================
5. 重启nginx 6.启用websocket协议
====================================================================
7.禁用websocket协议 8. 查询证书有效期剩余天数
====================================================================
9. 更新证书有效期 10. 启用多路复用
====================================================================
11. 禁用多路复用 12. 修改trojan端口
====================================================================
0. 啥也不做,退出
====================================================================
请输入数字:2
如果是使用上一篇文章中的一键安装脚本部署安装的nginx会因为缺少了stream、stream_ssl_preread_module两个module启动失败,这时候我们需要重新编译安装nginx,加上这两个module。
wget -nc --no-check-certificate http://nginx.org/download/nginx-1.18.0.tar.gz -P /usr/local/src
wget -nc --no-check-certificate https://www.openssl.org/source/openssl-1.1.1g.tar.gz -P /usr/local/src
cd /usr/local/src
tar -zxvf nginx-1.18.0.tar.gz
tar -zxvf openssl-1.1.1g.tar.gz
cd nginx-1.18.0
./configure --prefix=/etc/nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-pcre \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_secure_link_module \
--with-http_v2_module \
--with-cc-opt='-O3' \
--with-ld-opt="-ljemalloc" \
--with-openssl=../openssl-1.1.1g \
--with-stream \
--with-stream_ssl_preread_module
make && make install
安装完成后重启nginx就可以了。
通过这种方式我们可以配置多个https子域名对应不同的https服务,而且都统一走443端口,也可以开启更多的trojan服务进程对应不同的域名,最为重要的是因为统一走的443端口,不会影响trojan的https伪装。