oldme 博客

路漫漫其修远兮,吾将上下而求索

Docker 部署 Nginx+Trojan+V2ray

oldme create: 2024-06-06

很多人认为 Trojan 和 V2ray 是竞品关系,实则不然,Trojan 只是魔法上网协议的一种,V2ray 是一整个平台,包含了多种协议,比如大名鼎鼎的 Vmess, VLESS, Shadowsocks,当然也包含本文的主角协议:Trojan。

前言

本文非新手向翻墙攻略,在此之前,你要熟悉以下几种基础工具:Liunx, Nginx, Docker,并且准备好 SSL 证书。

之前笔者用的翻墙策略都是 V2ray + VLESS,但是随着 V2ray V5 的到来,VLESS 协议被弃用且可能被移除,官方推荐协议转到 TrojanTrojanVLESS 有几个显著的不同:

  1. 默认也是 443 端口,和 Nginx 冲突,会影响 Nginx 其他运行的网站;
  2. 自身携带 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 配置

Nginxdocker-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";
    }
}

这里的配置是一个参考,配置好之后重启 NginxTrojan 域名的流量便会被 Nginx 转发。在浏览器中打开你的域名,很快的出现 页面无法使用,就代表 Nginx + Trojan 已经正常运行。关于 Nginx + Trojan 的更多细节,可以参考此文

评论

欢迎您的回复 取消回复

您的邮箱不会显示出来,*必填

本文目录