本文将介绍如何使用docker部署vless+ws+nginx,reality,naiveproxy节点,并共用443端口教程。主要涉及nginx的配置,文本将通过nginx监听443端口,对流量进行分流,也通过nginx反代ws,由此隐藏服务端的tls指纹特征,证书的申请由acme.sh脚本完成,此脚本可以自动续签证书,本教程将此脚本部署到了docker容器中,宿主机除了docker,不会安装任何其他软件,保证了系统环境的纯净。
vps一台,已安装docker(Linux系统Docker安装教程),已做好域名解析,已创建了一个docker网络(在本教程中,所有的容器都将放置在这个网络中):
docker network create --subnet 192.168.18.0/24 --gateway 192.168.18.1 anqiqii
在本教程中创建了一个名为anqiqii的网络,并确定网关为192.168.18.1(宿主机的内网IP)
添加的域名解析与docker网络的IP分配如下:
sea.anqi.ml --> 服务器公网IP(为xui面板与vless+ws+tls节点准备的,可套CDN)
naive.caq98i.top -->服务器公网IP(为naive节点准备的,直连,不能套CDN)
192.168.18.5 nginx
192.168.18.10 acme
192.168.18.15 xui
192.168.18.20 naive
可能有用:
racknerd $11一年VPS(3000 GB流量每月,1Gbps) 了解更多
① 安装nginx
创建一个临时nginx容器用于将nginx的默认主配置文件复制到宿主机:
docker run --rm -v /home/nginx:/mnt nginx cp /etc/nginx/nginx.conf /mnt/
创建一个nginx容器:
docker run -d \
--name nginx --network=anqiqii --ip 192.168.18.5 \
-p 80:80 \
-p 443:443 \
-v /home/nginx/conf.d:/etc/nginx/conf.d \
-v /home/nginx/html:/usr/share/nginx/html \
-v /home/cert:/home/cert \
-v /home/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
根据这个部署nginx的挂载命令,容器中的路径 /usr/share/nginx/html/ 其实对应了宿主机的 /home/nginx/html/ 路径,这个路径一般放置网站的根目录文件夹。在宿主机的 /home/nginx/html/ 目录下创建一个文件夹,以你的域名进行命名,在本例中,文件夹命名为:sea.anqi.ml;
② 在 /home/nginx/conf.d/ 目录下创建一个文件,以 .conf 结尾,在本例中,文件命名为:sea.anqi.ml.conf;打开此文件,编辑内容为:
server{listen 80;server_name sea.anqi.ml; # 修改为你自己为xui面板准备的域名index index.php index.html index.htm default.php default.htm default.html;root /usr/share/nginx/html/sea.anqi.ml; # 设置网站的根目录地址,将sea.anqi.ml替换为你自己的域名#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md){return 404;}location ~* \.log$ {deny all;}
location ~ ^/\.well-known {proxy_pass http://acme.sh:80;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
#禁止在证书验证目录放入敏感文件if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {return 403;}
location / { #反代 xui 面板proxy_pass http://192.168.18.15:54321; # 本教程将xui部署到了192.168.18.15,x-ui面板的默认端口为54321proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}access_log /usr/share/nginx/html/sea.anqi.ml/sssvip.log; # 设置日志存放路径,将sea.anqi.ml替换为你自己的域名,可以注释掉,不记录访问正常的日志error_log /usr/share/nginx/html/sea.anqi.ml/sssvip.error.log; # 设置错误日志存放路径,将sea.anqi.ml替换为你自己的域名}
修改nginx的主配置文件(/home/nginx/nginx.conf),找到 stream 模块,在里边添加如下配置:
map $ssl_preread_server_name $sni_name {www.reality.com reality; # www.reality.com为reality节点的伪装域名,与xui面板中reality节点配置的目标网站保持一致naive.caq98i.top naive; # naive节点的域名default blog; # 其他未匹配的域名走blog标注的上游服务器}# 配置不同的上游服务,转交数据包upstream reality {server 192.168.18.15:47869; # 部署reality的容器的ip和监听的端口}upstream naive {server 192.168.18.20:443; #naive容器的ip和监听的端口}upstream blog {server 127.0.0.1:8443; #其他,这里是转到了本机的8443端口;http块中可以配置不同的server监听8443端口实现各种定制功能}server {# 复用443端口配置listen 443 reuseport;# 根据sni分流到不同的上游服务器proxy_pass $sni_name;# 用于获取TLS握手信息,也就是可以获取SNI的信息用于分流ssl_preread on;}
修改完配置文件后使用 docker exec nginx nginx -t 检查配置文件是否有语法错误,确认无误后,使用 docker restart nginx 重启nginx(修改完配置后都需要重启nginx使之生效)
③ 安装acme.sh(用于申请证书)
docker run --rm -itd \-v /home/cert:/acme.sh \--net=anqiqii --ip 192.168.18.10 \--name=acme.sh \neilpang/acme.sh daemon
④ 使用acme.sh 申请证书:
docker exec acme.sh --issue -d sea.anqi.ml --server letsencrypt --standalone
-d 参数后边接申请证书的域名
⑤ 打开 /home/nginx/conf.d/ 中的网站配置文件,添加如下配置:
listen 8443 ssl http2; # https监听的端口,与stream模块中blog上游服务器配置的端口保持一致# 下面这部分添加到 #禁止访问的文件或目录 这一行的上边ssl_certificate /home/cert/path/fullchain.pem; # 更改为证书所在路径,一般是fullchain.pem文件ssl_certificate_key /home/cert/path/privkey.pem; # 更改为私钥所在路径,一般是privkey.pem文件ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;add_header Strict-Transport-Security "max-age=31536000";
⑥ 安装xui面板
cd /home && mkdir x-ui && cd x-ui
docker run -itd --network=anqiqii --ip 192.168.18.15 \
-v $PWD/db/:/etc/x-ui/ \
--name xui --restart=unless-stopped \
enwaiax/x-ui:alpha-zh
⑦ 浏览器访问 sea.anqi.ml 即可访问到xui面板,默认用户与密码都为 admin;进入建议即使修改密码。
注意:点击“面板设置”后,xui面板会自动修改买面板访问路径,请记住此路径(当然也可以在面板设置中自定义此路径)。
⑧ 添加一个vless+ws+nginx节点:
添加一个vless节点:备注随便写,协议选择vless,将传输改为 ws ,设置一个复杂一点的路径,比如可以将id作为路径。(注意,本教程使用的xui面板支持同一节点添加多用户,id需要点一下“添加用户”旁边的➕)

打开 /home/nginx/conf.d/ 中的网站配置文件,location / { #反代 xui 面板 的上一行添加如下配置:
location /db8b6abd-7676 { # 替换为你节点的设置的路径proxy_redirect off;proxy_pass http://192.168.18.15:15695; # 将ip为xui容器的ip,端口替换为节点的端口proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $http_host;proxy_read_timeout 300s;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
修改完配置后,使用 docker restart nginx 重启nginx
使用v2rayN链接节点,由于使用了nginx反代,需要将端口改为443;TLS选择tls;参考 基于Docker的 x-ui + nginx + ws 节点搭建教程 的最后部分。
PS:关于站点伪装:将nginx配置文件中的反代xui的路径修改为面板中xui设置的路径(即:将 location / { #反代 xui 面板 中的 / 修改为 xui 面板中设置的路径,见⑦);然后在网站的根目录下放置任意网页模板即可,在本教程中为文件夹 sea.anqi.ml (见①)
⑨ 使用xui创建一个reality节点,参考:使用x-ui面板构建vless+reality节点
注意:使用xui添加reality节点时,端口与nginx主配置文件中“realty”上游服务器中配置的端口一致;nginx主配置文件中map中有关于reality的配置,哪里的域名与xui配置中的“目标网站”中的域名一致。(这个域名不能随便填写,需要是真实存在的网站)
⑩ 部署naive节点可参考:基于docker自建NaiveProxy节点——隐藏你所有的科学上网特征并使用nginx分流实现与reality节点共用443端口
阅读完毕,来看看我们推荐的好工具吧!🦀🦀