Docker 部署 Nginx+Trojan+V2ray
很多人认为 Trojan 和 V2ray 是竞品关系,实则不然,Trojan 只是魔法上网协议的一种,V2ray 是一整个平台,包含了多种协议,比如大名鼎鼎的 Vmess, VLESS, Shadowsocks,当然也包含本文的主角协议:Trojan。
前言
本文非新手向翻墙攻略,在此之前,你要熟悉以下几种基础工具:Liunx, Nginx, Docker
,并且准备好 SSL
证书。
之前笔者用的翻墙策略都是 V2ray + VLESS
,但是随着 V2ray V5
的到来,VLESS
协议被弃用且可能被移除,官方推荐协议转到 Trojan
。Trojan
和 VLESS
有几个显著的不同:
- 默认也是
443
端口,和Nginx
冲突,会影响Nginx
其他运行的网站; - 自身携带
TLS
,不需要依赖其他Web
服务器。
如果想在一台服务器同时运行普通网站和 Trojan
,那么其中一个服务就要舍弃 443
端口,无论谁舍弃都不可接受,如从一来,让 Nginx
顶在最前面同时转发网站流量 和 Trojan
流量就成了一个重要的问题。
安装 Trojan
安装 Trojan
有两个大方向:第一种是直接使用 Trojan
的镜像,第二种是使用 V2ray
镜像,配置 Trojan
协议。这里笔者选择后者,因为 V2ray
的社区更为活跃,各类支持也更为丰富。当然,你也可以使用前者,除了配置不同,其他一样。这里我直接贴出 V2ray
的 docker-compose.yaml
,抄就完事了:
version: "3"
services:
trojan:
image: "teddysun/v2ray"
container_name: "trojan"
restart: "always"
volumes:
- "/home/docker/trojan:/etc/v2ray"
- "/home/docker/nginx/ssl:/etc/ssl"
# 如果不需要 Nginx,直接暴露 443 到宿主机
# ports:
# - "443:443"
数据券的路径可以根据实际情况配置。如果你用的是配置中的路径,在 /home/docker/trojan
下创建 Trojan
的配置文件 config.json
:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"port": 9998,
"protocol": "trojan",
"settings": {
"clients": [
{
"password":"your_password",
"email": "tyyn1022@gmail.com"
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": [
"http/1.1"
],
"certificates": [
{
"certificateFile": "/etc/ssl/*.pem",
"keyFile": "/etc/ssl/*.key"
}
]
}
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
这里把这几个配置改成你自己的: port, password, SSL证书
。我这里的端口使用的是 9998
,后面使用 Nginx
转发流量到此端口上。如果你不需要 Nginx
话,把 port
改成 443
,在 docker-compose.yaml
里把 443
暴露出去,在浏览器中打开你的域名,很快的出现 页面无法使用,就代表 Trojan
已经正常运行。
Nginx 配置
Nginx
的 docker-compose.yaml
我就不贴了,直接把 Nginx
的转发配置贴出来,这里是关键:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
# 转发流量的核心配置
map $ssl_preread_server_name $backend_name {
oldme.net web;
api.oldme.net api;
admin.oldme.net admin;
dev.oldme.net trojan;
default web;
}
upstream web {
server 127.0.0.1:4431;
}
upstream api {
server 127.0.0.1:4432;
}
upstream admin {
server 127.0.0.1:4433;
}
upstream trojan {
// 同网段的 docker 容器可以直接使用容器名访问
server trojan:9998;
}
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
ssl_preread on;
}
}
http {
...
server {
listen 4433 ssl;
listen [::]:4433 ssl;
server_name oldme.net;
charset utf-8;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_certificate ssl/oldme.net.pem;
ssl_certificate_key ssl/oldme.net.key;
return 200 "hello";
}
}
这里的配置是一个参考,配置好之后重启 Nginx
,Trojan
域名的流量便会被 Nginx
转发。在浏览器中打开你的域名,很快的出现 页面无法使用,就代表 Nginx + Trojan
已经正常运行。关于 Nginx + Trojan 的更多细节,可以参考此文。
本文目录