使用 nginx stream 实现共用 443 端口

最近由于我这里移动的宽带无法通过 vmess 访问网页,而国内的网站却不受影响,想到有可能是域名的问题,国内的域名或者常见的域名就不受影响,所以想着是不是可以使用 vless-reality-vision 避开这个限制。而且根据理解 vless-reality-vision 使用 443 端口可能是更好的选择,但是机子上面的 443 端口已经被 nginx 占用了,通过搜索在网上找到了别人分享的可以通过 nginx 的 steam 模块进行分流,由于我机子上的服务都是使用 docker 启动的,分析下来发现使用 docker 的情况下可以实现非常完美的效果。

首先机子上面要先安装 docker,然后需要创建一张 docker 内部用来通信的网卡(命名为 internal):

docker network create internal

准备 vless-reality-vision 的配置文件,在配置文件中有一些参数需要自定义,分别是:

  1. id,uuid 生成可以使用 xray 的命令来生成,windows 下的命令是 xray.exe uuid
  2. privateKey,也需要去替换,这个参数和客户端的 publicKey 是对应的,通过命令 xray.exe x25519 生成,执行这个命令之后会同时输出这两个 key。
  3. shortIds(可选),用来区分不同的客户端,在服务端可以填写多个,客户端中填写服务端中填写的任一个就行,可以通过 openssl rand -hex 3 生成,命令中的 3 可以替换成 1 到 8 中的任意一个数字。
  4. destserverNames(可选),dest 中的值需要填写可以正常访问的境外支持 tls1.3(通过 F12 - Security - Overiew 查看) 和 h2(通过 F12 - Network - Protocol 查看) 的网站serverNames 填写与 dest 域名共用同一个证书的网站(通过 F12 - Security - Main origin 下的网站中的 SAN 查看),但是暂不支持填写 * 通配符,serverNames 中填写的域名任一个都可以填写到客户端中的 serverName 中,serverNames 也可以简化到只填写和 dest 相同的一个域名。

我这里提供了一个 API 可以生成一个直接用的 vless-reality-vision 的配置文件

https://workflow.xinebf.com/webhook/domain-san?d=support.microsoft.com

其中:d= 后面填写配置文件中的 dest

在修改好 vless-reality-vision 的配置文件(保存在 ~/app/back/xray-vless-reality-vision.json)之后,就可以启动 docker 命令了。

在这个 docker 的启动命令中并没有将端口映射到容器外,此时的 vless-reality-vision 并不能被连接,需要创建一个 nginx 的容器通过其中的 stream 模块分流,创建 nginx 的配置文件(保存在 ~/data/nginx/nginx_stream.conf)通过命令启动 nginx stream 的容器,在这个 nginx stream 的配置文件中包含了所有服务端设置的 serverNames,即客户端可以填写任意服务端 serverNames 中包含的域名。可以在 nginx 的容器中对外映射 80 端口,nginx stream 的容器对外映射 443 端口。

至此,就可以通过 443 端口使用 vless-reality-vision 了。

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>