xray-vless下WS、TCP、gRPC先后多组匹配共存方案

Multiple sets of matching coexistence schemes for ws+tls and tcp+xtls (and gRPC+tls) under xray-vless.

造梦人   (来自:YouTube  养猫画画的随随

 

 

前言

写blog的时间安排:编整正文内容5小时,选插画2天.

本文不适用小白阅读,一些细小的、连带的问题均略过处理。

 

 

开始准备

  • 部署环境

v2核心:xray

v2面板:x-ui

web服务器:nginx

虚拟环境:宝塔

  • 情境再现

想要实现单端口(伪)多用户多协议分别匹配共存

人话:多个用户多个协议相互独立配置,完事全部走一个前置端口分流(还可以再复用一次端口做伪站)

  • 预设配置

  1. tcp+xtls
  2. ws+tls
  3. grpc+tls

(共同部分)+nginx+SNI+web          【现已分离了伪站,详见额外的】

(可选部分,不支持tcp)+cdn

 

 

 

开始配置

(环境部署过程略)

  • 难点

websocket与gRPC类似,通过path来区分,目测可共存。主要处理websocket与tcp的兼容问题即可。

  • 尝试ws+grpc

  • 转发ws

单纯的ws直接走nginx的server配置location path即可。多组配置就是ws_path里传个参数,将v2后端真实端口pass过去。即

    #转发ws
   location ~ ^/tls/(\d+)$ 
    {
        proxy_redirect off;
        proxy_pass https://127.0.0.1:$1; 
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header Early-Data $ssl_early_data;

    }

这里的proxy_pass给http还是https,看个人选择(走cdn就没有必要再多一层tls).

  • 转发grpc

gRPC与之相似,Path稍有不同。官方文档里说grpc path前面不需要“/”,且path以“/Tun”结束。稍加区别可以这样写

    #转发gRPC
       location ~ ^/grpc/(\d+)/Tun 
    {
        grpc_pass  grpcs://127.0.0.1:$1;
    }

同样的$1唯一参数,后端真实端口。

  • 监听端口

当然了,前置端口我这边用的443.即

server
{
	listen 443 ssl http2;
        ……
}

 

  • 尝试ws+tcp

如果你不用tcp+xtls的配置,上述已经完美解决,并且不需要SNI分流。

单独的,多个tcp的配置,显然server模块搞不定。尝试stream下SNI分流;这里绕不开要分n个二级域名出来,那么又绕不开证书申请的问题。

不推荐用泛域名SLL,这里再多展开一下“不同根域申请组合证书的问题”。

  • 组合证书问题

如:domain1.com与domain2.com,一个托管在腾讯,一个托管在CF。直接组合申请会返回失败。先获取CF的全局API,将domain1.com的几个二级域申请好,再获取dnspod的API将domain2.com的二级域申请好;再组合申请,完事删除单独的证书。

  • 关闭strict模式

都是在宝塔面板下的一键申请没什么好说的。证书部署后,记得关了strict模式。(防止影响服务器的其他网站)

add_header Strict-Transport-Security "max-age=31536000";

server模块下SSL相关,删除该行保存。

  • 单个tcp配置与ws(grpc)共存

证书准备完成后,单独tcp前置nginx如下:

stream {
    map $ssl_preread_server_name $backend_name {
        domain.com web;
        ws.domain.com ws;
        tcp.domain.com xtls;


    # 域名都不匹配情况下的默认值
        default web;
    }

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

    # xtls,配置转发详情
    upstream xtls {
        server 127.0.0.1:50001;
    }
    # ws,配置转发详情
    upstream ws {
        server 127.0.0.1:443;
    }

    # 监听 443 并开启 ssl_preread
    server {
        listen domain.com:443 reuseport;
        proxy_pass  $backend_name;
        ssl_preread on;

    }
}

其中domain.cm直接走博客,ws.domain.com走伪站后转到v2后端,tcp.domain.com直接转到v2后端。使用443作为监听,注意ws也是转发到443,这里其实是我复用了443端口,即443即在监听SNI分流,又作为了一个网站监听端口,网站下server模块来转发ws与grpc。如果你没有复用433,请将ws(grpc)转发到伪站的端口上。

复用443分流+伪站转发的方法如下:

nginx配置方案如上所述,但要修改一下服务的启动顺序。依次为

宝塔虚拟环境>不带分流的nginx>网站、v2后端>带分流的nginx

 

  • 多组匹配共存

成功之后,那么多组的tcp配置就是复制粘贴。(nginx没有for循环-_-||)。完整的便是

#sni分流
stream {
    map $ssl_preread_server_name $backend_name {
        domain.com web;
        ws.domain.com ws;
        tcp.domain.com xtls;
        tcp2.domain.com xtls2;
        tcp3.domain.com xtls3;
        tcp4.domain.com xtls4;
        tcp5.domain.com xtls5;
        tcp6.domain.com xtls6;

        default web;
    }

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

    # xtls,配置转发详情
    upstream xtls {
        server 127.0.0.1:50001;
    }
    upstream xtls2 {
        server 127.0.0.1:50002;
    }
    upstream xtls3 {
        server 127.0.0.1:50003;
    }
    upstream xtls4 {
        server 127.0.0.1:50004;
    }
    upstream xtls5 {
        server 127.0.0.1:50005;
    }
    upstream xtls6 {
        server 127.0.0.1:50006;
    }
    # ws,配置转发详情
    upstream ws {
        server 127.0.0.1:443;
    }

    # 监听 443 并开启 ssl_preread
    server {
        listen domain.com:443 reuseport;
        proxy_pass  $backend_name;
        ssl_preread on;

    }
}

额外的

cdn部分的内容就不放本篇了,还是老的方案。以后重开一篇讲。

由于7月份开始无差别的封锁443端口,为防止网站影响到v2的使用。故v2与伪站分离(web

我这边的修改是,伪站不用443端口,分流监听也改成其他端口。则tcp、ws、grpc不能共一个端口(2个咯),套cdn也不建议443端口了。

 

 

 

总结

那么以上尝试1+尝试2,就是完整的配置方案;实际配置过程中可能会error无数次哦,即使给了正确的答案。

这种方案将v2至于后端,性能有所下降是肯定的,同时tcp的优先级要高于其他协议(少转一次)。一切为了安全

 

 

 

 

发表评论