使用docker在一台VPS上部署vless+ws+nginx, reality, naive节点并共用443端口


分类:建站与VPS       作者:Caq98i       发布时间:2023-05-16       更新时间:2023-11-26 阅读量:5057    


本文将介绍如何使用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) 了解更多

$49.99一年VPS 特惠CN2线路

$169.99一年VPS 高端CN2 GIA线路  了解更多

域名注册 一美元优惠码:c34aq98i  了解更多

 

视频演示教程:【超硬核节点搭建教程】使用docker在一台VPS上搭建vless+ws+nginx节点 最新的reality+xtls-rprx-vision节点 naiveproxy节点 并共用443端口 - YouTube

 

① 安装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面板的默认端口为54321
proxy_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端口


阅读完毕,来看看我们推荐的好工具吧!🦀🦀


            support a 🍕


留言与评论







限时特惠促销