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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注