写论文需要查询学术网站,为了加速国外网站访问速度,申请了云计算厂商的 ECS,配置了相关代码。本文就流行的 Nginx 和 Trojan-go 组合配置做了简单介绍。
Go 实现的 Trojan 服务,支持多路复用/路由功能/CDN中转/Shadowsocks混淆插件,多平台,无依赖。
官方 https://github.com/p4gefau1t/trojan-go
完整配置教程 https://p4gefau1t.github.io/trojan-go
ECS 准备
推荐 ECS 选用 Ubuntu 20.04 LTS,Debian 10 也可以。我个人更喜欢 Ubuntu,软件比较新,配置时遇到的问题较少。有人觉得 Ubuntu 占用系统资源太大,不用担心,我测试过 512M 内存的 ECS,够用了。
升级并安装必要软件
apt update && apt -y install socat wget
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
申请和安装域名证书
假如域名为 domain.com,我们申请 Let’s Encrypt SSL 的 Wildcard 泛域名证书。域名的 nameserver 推荐使用 Cloudflare,解析速度极快,千万别用 NameSilo 的域名解析,很可能申请泛域名证书时超时报错。
安装 acme.sh
wget -qO- get.acme.sh | bash
source ~/.bashrc
设置 Cloudflare 的 Global API key
export CF_Key="xxxxxx"
export CF_Email="xxxxxx"
acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证,http 和 dns 验证。由于 Wildcard 证书验证只支持 dns 验证,不支持 http 验证,所以要使用 dns api 模式。推荐申请 ECC 证书。
acme.sh --issue --dns dns_cf -d domain.com -d '*.domain.com' -k ec-256
安装证书
mkdir /etc/trojan-go
acme.sh --installcert -d domain.com --fullchain-file /etc/trojan-go/fullchain.cer --key-file /etc/trojan-go/domain.com.key --ecc
安装网盘服务
Nginx 需要一个网站,我推荐 Cloudreve 网盘,可以作为个人网络存储空间,非常实用。
mkdir /usr/local/bin/cloudreve && cd /usr/local/bin/cloudreve
wget https://github.com/cloudreve/Cloudreve/releases/download/3.2.1/cloudreve_3.2.1_linux_amd64.tar.gz
tar -zxvf cloudreve_3.2.1_linux_amd64.tar.gz
chmod +x ./cloudreve
./cloudreve
Cloudreve 在首次启动时,会创建初始管理员账号,请注意保管管理员密码,此密码只会在首次启动时出现。如果您忘记初始管理员密码,需要删除同级目录下的 cloudreve.db,重新启动主程序以初始化新的管理员账户。Cloudreve 默认会监听5212端口。你可以在浏览器中访问 http://服务器IP:5212 进入 Cloudreve。
接下来按 Ctrl+C 退出 Cloudreve,设置守护进程。
nano /usr/lib/systemd/system/cloudreve.service
# 输入以下代码
[Unit]
Description=Cloudreve
Documentation=https://docs.cloudreve.org
After=network.target
After=mysqld.service
Wants=network.target
[Service]
WorkingDirectory=/usr/local/bin/cloudreve
ExecStart=/usr/local/bin/cloudreve/cloudreve
Restart=on-abnormal
RestartSec=5s
KillMode=mixed
StandardOutput=null
StandardError=syslog
[Install]
WantedBy=multi-user.target
设置开机启动
systemctl start cloudreve
systemctl enable cloudreve
设置 Cloudreve 配置文件
nano /usr/local/bin/cloudreve/conf.ini
# 添加以下代码
[System]
Mode = master
Debug = false
Listen = :5212
[UnixSocket]
Listen = /run/cloudreve.sock
安装 Nginx & Trojan-Go
Nginx 和 Trojan-go 有 Docker版本,使用很方便。
# 安装 Docker
wget -qO- get.docker.com | bash
# 查看 Docker 版本
docker version
# 设置 Docker 开机启动
systemctl start docker
systemctl enable docker
# 拉取镜像 其中 watchtower 会自动监测并更新镜像
docker pull nginx
docker pull teddysun/trojan-go
docker pull containrrr/watchtower
配置 Trojan-go
Trojan-go 以 h2 协商连接,非 Trojan-go 的 https 连接回落给 Nginx。
nano /etc/trojan-go/config.json
# 添加以下代码
{
"run_type": "server",
"local_addr": "0.0.0.0",
"local_port": 443,
"remote_addr": "127.0.0.1",
"remote_port": 82,
"password": [
" Your password"
],
"disable_http_check": false,
"udp_timeout": 60,
"ssl": {
"verify": true,
"verify_hostname": true,
"cert": "/etc/trojan-go/fullchain.cer",
"key": "/etc/trojan-go/domain.com.key",
"key_password": "",
"cipher": "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"curves": "",
"prefer_server_cipher": true,
"sni": "domain.com",
"alpn": [
"h2"
],
"session_ticket": true,
"reuse_session": true,
"fallback_addr": "",
"fallback_port": 3000
}
}
cipher 字段也可以留空,Trojan-go 会根据当前硬件平台以及远端的情况,自动选择最合适的加密算法以提升性能和安全性,默认情况下,Trojan-go 将优先使用更安全的 TLS1.3。如果需要填写,密码学套件名用分号(“:”)分隔,按优先顺序排列。在上面的配置中,Trojan-go 只接受 TLS1.2 和 TLS1.3 连接。
上面的配置没有 Websocket 传输支持,想用 CDN 流量中转的可以自行修改。
配置 Nginx
Nginx 配置文件是 /etc/nginx/conf.d/default.conf
mkdir /etc/nginx && mkdir /etc/nginx/conf.d
nano /etc/nginx/conf.d/default.conf
# 添加以下代码
server {
listen 80;
listen [::]:80;
server_name domain.com www.domain.com;
return 301 https://domain.com$request_uri;
}
server {
listen 127.0.0.1:82 http2;
server_name www.domain.com;
return 301 https://domain.com$request_uri;
}
server {
listen 127.0.0.1:82 http2;
server_name domain.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
location / {
proxy_pass http://unix:/run/cloudreve.sock;
client_max_body_size 20000m;
proxy_set_header X-Forwarded-For 127.0.0.1;
proxy_set_header Host 127.0.0.1:443;
proxy_redirect off;
proxy_buffer_size 64k;
proxy_buffers 32 32k;
proxy_busy_buffers_size 128k;
}
}
server {
listen 127.0.0.1:3000;
server_name _;
return 400;
}
启动服务
运行 Docker Nginx
docker run --network host --name nginx -v /etc/nginx/conf.d:/etc/nginx/conf.d -v /run/cloudreve.sock:/run/cloudreve.sock --restart=always -d nginx
运行 Docker Trojan-go
docker run --network host --name trojan-go -v /etc/trojan-go:/etc/trojan-go --restart=always -d teddysun/trojan-go
这里证书是存放在 /etc/trojan-go 文件夹里,所以不需单独挂载。如果最开始证书是安装在其它文件夹,需要单独挂载,比如证书安装在 /etc/ssl,那么运行 Docker Trojan-go 的命令会变成这样。
docker run --network host --name trojan-go -v /etc/trojan-go:/etc/trojan-go -v /etc/ssl/fullchain.cer:/etc/ssl/fullchain.cer -v /etc/ssl/domain.com.key:/etc/ssl/domain.com.key --restart=always -d teddysun/trojan-go
运行 Docker Watchtower 并自动监测更新软件
docker run --name watchtower -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped -d containrrr/watchtower --cleanup
现在可以在浏览器里打开 domain.com,会自动跳转到 https://domain.com,页面就是 Cloudreve 网盘,用刚才保存的用户名和密码登录,可以配置 Cloudreve 网盘。
结束语
配置完成,下载 Trojan-go 客户端可正常连接。在 ssllab.com 检测证书,显示为 A+,完美!