trojan+v2ray真正共存复用443端口,史上唯一最牛的搭建技术你会吗?

技术背景及准备条件:

最近一直在探索trojan+v2ray共存的搭建技术,油管也有很多播出共存的视频,但万变不离其中,都是表面共存,实际运行机制还是先trojan,后nginx转发给v2ray的方式,这种搭建方案牺牲v2ray和nginx的数据传输安全,只有trojan有https安全隧道保护。搭建共存安全风险提高,而且浪费vps资源。所以,Littleyu抛弃旧有的共存思想,脱胎换骨分享一期目前油管视频史无前例,也是当前最科学,最安全,最专业的共存搭建方案。

旧有共存模式

搭建准备的东西:域名一个(有ssl证书),vps一台(centos7操作系统)。

技术原理:

众所周知,https协议使用的是计算机443端口,将443端口交由nginx使用,由nginx监听所有ip对443端口的访问,通过域名请求服务做出智能转发的功能,nginx起到前端域名管理识别,后端端口管理转发的功能,同时还提供web网站服务。

通过上图获知,利用二级域名的识别,nginx完成相对应的服务请求转发,比如v2rayN客户端连接的地址为:vmess.yugogogo.tk:443,服务器的nginx收到请求,并识别为v2ray流量,将请求转发给v2ray服务程序,v2ray接收请求并提供科学上网服务。后面的trojan及网站服务以此类推,不再赘述。

搭建流程:

域名申请SSL证书

1,首先登录FreeSSL官网,将自己的域名(比如我的站点域名:www.yugogogo.tk)填入此中。品牌选择“亚洲诚信”,然后点击“点击创建免费的ssl证书”按钮。

2,来到第二页面,这里填入个人电子邮箱,以下配置全部使用默认选项。我们这里选择DNS验证,如果希望使用文件验证,验证教程请参照(纯手动安装最新官方trojan,搭建网站专业伪装)的申请部署ssl证书一文。然后点击创建。

3,在本地电脑先下载安装KeyManager软件(用于生成离线CSR私匙和保存证书所用),安装好并启用,KeyManager会为我们域名生成私匙,然后回到浏览器中,将dns验证的配置信息放入托管域名解析商的服务器中,用于验证。

4,将TXT记录和记录值两项信息复制粘贴到域名解析服务器的解析处,

 

5,当解析好,返回到dns验证页面,点击验证。若验证通过,则自动显示颁发证书的信息,点击保存到KeyManager软件中。

部署SSL证书

1,回到KeyManager软件,点击获取证书域名右边的更多,然后点击证书详情,再点击查看查看PEM,如下图

2,将上图中的证书和密匙信息通过右边的复制按钮复制,然后登录vps终端,输入以下命令分别创建证书和密匙文件,将其复制的密匙内容粘贴到对应的文件中保存。

#创建证书文件并粘贴证书密匙信息
vi /etc/ssl/fullchain.pem
#粘贴后,输入英文格式的冒号加wq保存退出
#创建私匙文件并粘贴密匙信息
vi /etc/ssl/yugogogo.tk.pem
#粘贴后,输入英文格式的冒号加wq保存退出

v2ray  |  trojan安装

1,安装v2ray,并设置配置信息

bash <(curl -L -s https://install.direct/go.sh) #v2ray一键安装脚本

安装完成,默认启动,把v2ray的端口号和UUID号复制出来,后面需要配置到nginx中

2,安装trojan,并设置配置信息

cd /usr/src/ #进入指定目录安装
yum install -y wget #安装下载依赖命令,已安装过可跳过
wget https://github.com/trojan-gfw/trojan/releases/download/v1.14.1/trojan-1.14.1-linux-amd64.tar.xz #下载trojan程序
chmod +x trojan-1.14.1-linux-amd64.tar.xz #释放执行权限
tar xf trojan-1.14.1-linux-amd64.tar.xz #解压压缩包
cd trojan
vi config.json #编辑配置文件,进入文件,输入dG删除默认配置,粘贴如下信息

"run_type": "server",
"local_addr": "127.0.0.1",
"local_port": 8541,
"remote_addr": "127.0.0.1",//转发回 nginx 默认页面
"remote_port": 80,
"password": [
"yugogogo"
],
"log_level": 3,
"ssl": {
"cert": "/etc/ssl/fullchain.pem",
"key": "/etc/ssl/yugogogo.tk.pem",
"key_password": "",
"cipher": "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",
"cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
"prefer_server_cipher": true,
"alpn": [
"http/1.1"
],
"alpn_port_override": {
"h2": 81
},
"reuse_session": true,
"session_ticket": false,
"session_timeout": 600,
"plain_http_response": "",
"curves": "",
"dhparam": ""
},
"tcp": {
"prefer_ipv4": false,
"no_delay": true,
"keep_alive": true,
"reuse_port": false,
"fast_open": false,
"fast_open_qlen": 20
},
"mysql": {
"enabled": false,
"server_addr": "127.0.0.1",
"server_port": 3306,
"database": "trojan",
"username": "trojan",
"password": "",
"cafile": ""
}
}
#按esc键wq保存并退出
#创建 Trojan 自启服务
vi /usr/lib/systemd/system/trojan.service
[Unit]
Description=trojan
After=network.target

[Service]
Type=simple
PIDFile=/usr/src/trojan/trojan/trojan.pid
ExecStart=/usr/src/trojan/trojan -c "/usr/src/trojan/config.json"
ExecReload=
ExecStop=/usr/src/trojan/trojan
PrivateTmp=true

[Install]
WantedBy=multi-user.target
#按esc键wq保存并退出

3,启动命令如下:

systemctl start trojan.service #启动Trojan 
systemctl enable trojan.service #设置 Trojan 服务开机自启 

Nginx安装及配置

1,下载安装nginx程序,以下是安装命令

 
#创建nginx安装源 
vi /etc/yum.repos.d/nginx.repo 
#粘贴以下内容,保存退出 
[nginx] 
name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 
#开始安装,(如果提示没有公匙无法安装,可以输入这个命令安装,yum install nginx --nogpgcheck )
yum install nginx 
systemctl start nginx.service # 启动Nginx服务 
systemctl enable nginx.service #开机自启 

2,设置nginx配置,打开nginx配置文件,在event代码后面先增加stream流信息代码。

 
#打开nginx的配置文件 
vi /etc/nginx/nginx.conf 
#粘贴以下内容,保存退出 
stream { 
# 这里就是 SNI 识别,将域名映射成一个配置名,请修改自己的一级域名 
  map $ssl_preread_server_name $backend_name { 
    web.yugogogo.tk web; 
    vmess.yugogogo.tk vmess; 
    trojan.yugogogo.tk trojan; 
   # 域名都不匹配情况下的默认值 
    default web; 
  } 
# web,配置转发详情 
  upstream web { 
    server 127.0.0.1:80; 
  } 
# trojan,配置转发详情 
  upstream trojan { 
    server 127.0.0.1:8541;
  } 
# vmess,配置转发详情 
  upstream vmess { 
    server 127.0.0.1:10242; 
  } 
# 监听 443 并开启 ssl_preread
  server { 
    listen 443 reuseport; 
    listen [::]:443 reuseport; 
    proxy_pass $backend_name; 
    ssl_preread on; 
  }
}

2,设置用于v2ray WS转发的代码块,需要在http模块里面增加server虚拟机模块,命令如下

server {
# 开启 HTTP2 支持
listen 10242 ssl http2;
server_name vmess.yugogogo.tk;

gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/yugogogo.tk.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# WS 协议转发
location /yugogogo {
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:41554;
}

# 非标请求转发伪装
location / {
    proxy_pass http://127.0.0.1:80;
  }
}

3,验证配置文件有效性并使其文件重新加载生效

nginx -t #验证nginx配置文件正确性
nginx -s reload #重新加载,使其生效
systemctl status nginx #检查nginx服务状态

v2ray  |  trojan连接测试

下载v2rayN客户端并配置连接

下载v2rayN客户端

到以上站点下载与本地电脑系统匹配的客户端,下载好,将其解压后,进入该目录,双击v2rayN-Core.exe,点击“服务器”,添加vmess服务器,将配置信息如下图配置所示

点击确定,激活该服务器即可启动。

下载Trojan-Qt5客户端并配置连接

下载Trojan-Qt5客户端

到以上站点下载与本地电脑系统匹配的客户端,下载好,将其解压后,进入该目录,双击trojan-qt5.exe

点击菜单的连接选项—->添加—->手动,

如上图所示,完成客户端配置信息,点击下方OK按钮,然后选中已添加好的节点,右键选择连接,即可实现科学上网代理服务。

服务端配置回顾:

为方便爱折腾的朋友能够更好的验证配置,这里罗列出各服务配置信息。

v2ray配置信息

{
  "api": {
    "tag": "api"
  },
  "dns": {
    "servers": [
      "https://1.1.1.1/dns-query",
      "https://8.8.8.8/dns-query",
      "localhost"
    ]
  },
  "inbounds": [
    {
      "allocate": {
        "strategy": "always"
      },
      "port": 41554,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "alterId": 64,
            "id": "16490e31-7d34-41aa-8bb6-517f2ba66ac8",
            "level": 1
          }
        ]
      },
      "sniffing": {
        "enabled": false
      },
      "streamSettings": {
        "network": "ws",
        "security": "none", 
        "wsSettings": {
          "path": "/yugogogo" // 可以自定义,避免嗅探
        }
      }
    }
  ],
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "error"
  },
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "AsIs"
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "none"
        }
      },
      "tag": "blocked"
    }
  ],
  "policy": {},
  "reverse": {},
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "ip": [
          "0.0.0.0/8",
          "10.0.0.0/8",
          "100.64.0.0/10",
          "127.0.0.0/8",
          "169.254.0.0/16",
          "172.16.0.0/12",
          "192.0.0.0/24",
          "192.0.2.0/24",
          "192.168.0.0/16",
          "198.18.0.0/15",
          "198.51.100.0/24",
          "203.0.113.0/24",
          "::1/128",
          "fc00::/7",
          "fe80::/10"
        ],
        "outboundTag": "blocked",
        "type": "field"
      }
    ]
  },
  "stats": {},
  "transport": {}
}

trojan配置信息

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 90,
    "remote_addr": "127.0.0.1",
    "remote_port": 80,
    "password": [    
        "yugogogo"
    ],
    "log_level": 1,
    "ssl": {
        "cert": "/etc/ssl/fullchain.pem",
        "key": "/etc/ssl/yugogogo.tk.pem",
        "key_password": "",
        "cipher": "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",
        "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384",
        "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,
        "reuse_port": false,
        "fast_open": false,
        "fast_open_qlen": 20
    },
    "mysql": {
        "enabled": false,
        "server_addr": "127.0.0.1",
        "server_port": 3306,
        "database": "trojan",
        "username": "trojan",
        "password": ""
    }
}

nginx配置信息

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {
    # 这里就是 SNI 识别,将域名映射成一个配置名
    map $ssl_preread_server_name $backend_name {
        web.yugogogo.tk web;
        vmess.yugogogo.tk vmess;
        trojan.yugogogo.tk trojan;
    # 域名都不匹配情况下的默认值
        default web;
    }

    # web,配置转发详情
    upstream web {
        server 127.0.0.1:80;
    }

    # trojan,配置转发详情
    upstream trojan {
        server 127.0.0.1:90;
    }

    # vmess,配置转发详情
    upstream vmess {
        server 127.0.0.1:10242;
    }

    # 监听 443 并开启 ssl_preread
    server {
        listen 443 reuseport;
        listen [::]:443 reuseport;
        proxy_pass  $backend_name;
        ssl_preread on;
    }
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
   
server {
    # 开启 HTTP2 支持
    listen 10242 ssl http2;
    server_name  vmess.yugogogo.tk;

    gzip on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/javascript application/x-javascript text/javascript;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_certificate      /etc/ssl/fullchain.pem;
    ssl_certificate_key  /etc/ssl/yugogogo.tk.pem;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    # WS 协议转发
    location /yugogogo {
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:41554;
    }

    # 非标请求转发伪装
    location / {
       proxy_pass http://127.0.0.1:80;
    }
}

    include /etc/nginx/conf.d/*.conf;
}

如你对以上技术原理教程的视频感兴趣,可以直接到我频道中观看。
如你对以上搭建技术视频感兴趣,可以直接到我频道中观看。
以上搭建参考引用

Little yu

View Comments