本文将介绍如何使用docker在一台VPS上部署vless+ws+nginx,reality,vless+grpc+nginx三合一节点,并共用443端口。文本将通过nginx监听443端口,对流量进行分流,也通过nginx反代ws和grpc协议,由此隐藏服务端的tls指纹特征,同时也可将使用cloud flare进行反代优选,通过合适的ip优选可以流畅的观看4K视频。
vps一台,已安装docker(Linux系统Docker安装教程),有一个域名,并已托管到了cloudflare并做好了域名解析且开启了CDN加速(可以参考:使用namesilo注册域名修改名称服务器Nameservers教程 和 域名与cloudflare CDN加速)。
docker一键安装脚本:
curl -sSL https://get.docker.com/ | sh
可能有用:
racknerd $12.98一年VPS(4000 GB流量每月,1Gbps) 更多特价VPS
$36.00一年洛杉矶特惠VPS_联通9929移动cmin2电信CN2GIA
$49.99一年VPS 特惠CN2线路 Vultr促销活动及优惠码汇总——新用户注册送50美金
视频演示教程:
本教程需要使用本机的443端口、8443端口、80端口(由nginx占用),这些都是建站的常用端口,如果存在端口冲突请自行修改相应的配置文件。另外,请检查防火墙配置,是否放行了443端口与80端口,本教程中搭建的3个节点均使用了VPS的443端口与80端口。除此之外,80端口也用于acme.sh申请证书使用。
Debian系统一般使用的ufw防火墙,部分VPS商家可能只放行了22端口(比如vultr),关于ufw的防火墙,可以参考:
为Debian系统配置ufw防火墙指南(其他系统可能不是使用的ufw防火墙,请自行查找相关资料)
另外,部分VPS商家除了在系统中配置了防火墙,也会在他们的控制面板中配置防火墙(比如腾讯云,阿里云),请修改相应的防火墙规则,放行需要的端口。
从本站下载的项目文件中,nginx容器使用了host网络,会占用了宿主机的443端口、8443端口、80端口。443端口的占用见nginx的主配置文件中配置的stream模块,用于sni分流,会根据sni将数据转发到不同的容器的某个端口,从而实现多协议节点共用443端口。比如对于网站的tls加密访问会分流到本机的8443端口。
对于网站的配置都在 ./nginx/conf.d/ 文件夹中,本站给出的示例中,里边放置了xui.conf 文件,用于配置xui面板的反代以及ws,grpc协议的反代(nginx前置),也设置了将证书签发机构对域名验证的请求转发到acme.sh容器。
对于非纯净的VPS,请自行修改相应的配置防止可能的端口占用冲突。比如:如果宿主机已经有nginx了,可以注释掉本站提供的压缩包中的 docker-compose.yml 文件中关于nginx容器的配置,然后根据 ./nginx/ 中的nginx主配置文件与网站配置文件,自行修改宿主机的nginx配置文件。
本节的主要实现:在服务端部署xui面板,并使用nginx反代xui面板,同时为xui面板申请证书,提供对xui面板的https加密访问。
① 下载本站准备的配置文件压缩包:xui-servers.zip;解压后上传到VPS的任意路径
本站更新了服务端的配置压缩包,可以点击下载:x-ui-servers.zip
本标签提供的压缩包进行了如下更新:
1. 添加了sing-box容器以支持hysteria2协议(使用教程见:hysteria2搭建教程)
2. 更新了x-ui面板的docker镜像,新版x-ui面板支持生成wireguard协议的出入站,功能更加强大(UI界面与本文中的截图有较大差异,所以仍然保留了之前版本服务端的配置压缩包的下载地址)跟新后的x-ui面板可以更为方便的添加路由规则与出站,详见:使用新版x-ui面板配置wireguard出站(无需关注x-ui的搭建部分,直接看本文即可);如果使用之前的版本的服务端的配置压缩包添加wireguard出站,可以参考:使用warp搭建解锁奈飞 chatGPT 等的科学上网节点-基于xray-core的wireguard出站协议
② 修改 ./nginx/conf.d/xui.conf
的第7行需要修改为你已经准备好的域名
③ cd到 docker-compose.yml 文件所在的目录后执行:
docker compose up -d
其他 docker compose 命令:
停止容器:
docker compose down
重启容器:
docker compose restart
重载 docker-compose.yml 文件(重载意味着会删除此文件定义的所有容器并重新创建)
docker compose up --force-recreate -d
重载指定的容器:
docker compose up -d --force-recreate --build --no-deps <SERVICE_NAME>
<SERVICE_NAME>为容器的名称,可以查看 docker-compose.yml 文件获得。
④ 使用acme.sh 申请证书:
docker exec acme.sh --issue -d sea.anqi.ml --server letsencrypt --standalone
-d 参数后边接申请证书的域名(请提前做好域名解析)
注意:申请证书前应保证域名已经正确解析,nginx配置文件中已经修改为了解析后的域名且nginx的配置已经生效。由于本教程是先修改好了配置文件再创建容器,所以对nginx配置的修改是生效了的。如果你是先创建了容器,再修改了nginx的配置,那么你就需要重启nginx容器使配置生效。
重启nginx容器的命令为:
docker restart nginx
⑤ ./nginx/cert
为证书目录,使用acme.sh申请到的证书都放在这里。然后修改 ./nginx/conf.d/xui.conf
的第11、12行为证书的路径(在这份配置文件中,路径 /etc/nginx/cert/
就对应了 ./nginx/cert
路径)。
在nginx配置文件中,使用acme申请到的证书和私钥的路径分别为:(需要将绿色部分的mydomain修改为你自己的域名)
/etc/nginx/cert/mydomain_ecc/fullchain.cer
/etc/nginx/cert/mydomain_ecc/mydomain.key
然后,重载nginx配置:
docker exec nginx nginx -s reload
PS:有时候,由于nginx的BUG,可能执行重载nginx容器的命令后,nginx并没有重载配置文件,可以采用重启nginx容器的方式使配置生效。
⑥ 浏览器使用域名即可访问到xui面板,默认用户与密码都为 admin
;进入建议即使修改密码。
注意:点击“面板设置”后,xui面板会自动修改买面板访问路径,请记住此路径(当然也可以在面板设置中自定义此路径)。
如果使用默认用户名与密码无法登录xui面板,可以尝试清空项目目录下的x-ui文件夹,然后重新构建xui容器(在 docker-compose.yml 文件所在的目录执行):
docker compose up -d --force-recreate --build --no-deps xui
① 使用xui添加一个vless+ws+nginx节点:
添加一个vless节点:备注随便写,协议选择vless,将传输改为 ws ,路径设置为:/ssvipass<port>
,<port>与节点端口保持一致,比如下图路径应该设置为:/ssvipass15695
。(注意:本教程使用的nginx前置进行反代,tls由nginx提供,节点不需要开启tls;同时nginx是根据路径决定将流量转发到不同的节点端口的)
② 在x-ui面板中,依次点击 操作👉二维码👉复制;然后打开v2rayN软件,使用快捷键 CTRL+V 粘贴节点。双击节点进行修改:将端口改为443;TLS选择tls;别名随便写,用于自己分区不同的节点。fingerprint可以随便选一个用于伪装。
PS:没有v2rayN或者没用过v2rayN ? 可以参考这个 v2ray节点使用教程
客户端可以在路径后边加上?ed=2048
来减少延迟
保存后,即可对节点进行测试了。如果测试不通可以在“伪装域名”处填写你的域名。这个节点的“地址”是填写的经过cloudflare CDN加速的域名,使用的是cloudflare默认分配的CDN ip,在某些网络环境下体验并不友好,可以自行指定CND的ip地址,参考这两个工具:Cloudflare节点优选工具;Cloudflare批量CND科学上网节点生成工具
另外,如果你的VPS线路本身比较好,可以在“地址”处填写你的VPS的公网IP,“伪装域名”填写你搭建梯子的域名,这样就能不经过cloudflare的反向加速,实现直连。
(虽然采用了nginx前置来消除服务端的指纹特征,但由于CFW对tls-in-tls特征识别能力的提升,不建议直连此节点!)
使用xui添加一个vless节点:备注随便写,协议选择vless,将传输改为 grpc ,serviceName 设置为:passgrpc<port>
,<port>与节点端口保持一致,比如为:passgrpc15695
。
同样是将节点复制到v2rayN中进行连接,双击节点进行修改:将端口改为443;TLS选择tls;别名随便写,用于自己分区不同的节点。在“地址”处填写你的VPS的公网IP,“伪装域名”填写你搭建梯子的域名(cloudflare默认不支持grpc的CDN,这里就直接采用直连的方式了,虽然可以去cf的控制面板开启)。
▶由于CFW对tls-in-tls特征识别能力的提升,不建议直连此节点!
▷配置cloudflare为grpc节点开启CDN可以参考这个视频教程:https://youtu.be/nlZy7dcNifA
① 添加一个 vless + xtls-rprx-vision + reality 的节点:记住端口号,之后修改nginx主配置文件会用到;至少有一个用户,没有用户就点击下图③处的+号;flow选“xtls-rprx-vision”(选择此项需要将网络选为tcp,同时勾选reality)
注:reality将使用目标网站的证书进行伪装,可以很好的隐藏服务端特征,配合xtls-rprx-vision流控可以极大的消除tls in tls特征,增强安全性。
关于目标网站的选择,可以参考这个视频:reality节点搭建演示
reality突然不通,可以排查一下是不是目标网站的问题:美西目标域名推荐 · XTLS/Xray-core · Discussion #2256 · GitHub
② 修改nginx主配置文件:
./nginx/nginx.conf 为nginx的主配置文件,需要修改的内容为:
第20行:将域名修改为目标网站的域名
第25行:将端口号修改为reality协议节点的端口号(见上图的②)
③ 修改完成后保存配置文件,然后重载nginx配置使修改生效:
docker exec nginx nginx -s reload
④ 将节点复制到v2rayN中进行连接,双击节点进行修改:将端口改为443;在“地址”处填写你的VPS的公网IP
注:本项目所有的nginx日志文件都配置到了 ./nginx/html/
之中。
reality可以与grpc搭配,可以获得比vless + xtls-rprx-vision + reality更低的延迟与更快的速度,但由于xtls-rprx-vision不能与grpc搭配,可能存在tls-in-tls的特征,安全性不及这里搭建的vless + xtls-rprx-vision + reality方案。
搭建reality+grpc节点可以参考:使用x-ui面板构建vless+reality节点
如果需要共用443端口,请为 reality+grpc 选择与 vless + xtls-rprx-vision + reality 不一样的目标网站,同时需要修改nginx的主配置文件,根据sni将443端口收到的请求转发到 reality+grpc 节点监听的端口。如果不需要共用443端口,可以修改 docker-compose.yml 文件中的xui容器的配置,添加端口映射后,重构xui容器。
可以修改站点的配置文件 ./nginx/conf.d/xui.conf
:取消第八、九行的注释,其中第9行为网站的根目录,可以上传任意网站的模板文件到 ./nginx/html/
目录下,比如可以将网站的模板文件夹(假设文件夹名称为 worldhello ,里边有.html等文件)上传到 ./nginx/html/
目录,这样第九行应该为:
root /usr/share/nginx/html/worldhello/;
然后将74行的 location /
改为 location /path
。其中path为第⑥步中提到的面板路径。
最后,重载nginx配置即可。
◭ 建议开启BBR,这对本文介绍的几种基于TCP的代理协议都是有很高的速度提升的。Debian系统开启bbr拥塞控制算法教程
可以借助nginx添加一个自定义的订阅地址,方便在各个客户端分享使用节点。详见:基于nginx构建自己专属的节点订阅链接地址
阅读完毕,来看看我们推荐的好工具吧!🦀🦀