基于docker自建NaiveProxy节点——隐藏你所有的科学上网特征并使用nginx分流实现与reality节点共用443端口


分类:建站与VPS       作者:Caq98i       发布时间:2023-04-28       更新时间:2023-05-10 阅读量:4784    


naive节点的服务端消除了服务端tls指纹和科学上网特征并伪装成了正常网站,同时naive还消除了客户端的tls指纹和tls-in-tls特征,再http2的加持下自带多路复用,相比于ws需要频繁握手,可以获得更低的延迟(仅对比直连情况,naiveproxy不能使用CDN加速)。NaiveProxy的客户端使用了chrome浏览器内核作为网络协议栈,将代理完全模拟成了正常的使用谷歌浏览器访问正常的网站。



准备工作

VPS一台:已安装docker和nginx(nginx需要stream模块,可以使用docker安装,只要保证nginx容器与naive容器位于同一docker网络之上就行)、域名一个并做好域名解析(不要使用CDN)

PS:如果这个VPS只部署NaiveProxy节点,可以不安装docker和nginx,直接在VPS上部署,推荐使用ubuntu系统。但为了是多种科学上网协议都能走443端口,推荐使用nginx做sin分流

本教程使用的VPS:(便宜美区VPS-月付不到6元  购买链接

docker安装教程:Linux系统Docker安装教程

购买域名:namesilo ;优惠码:c34aq98i

设置Nameservers教程:使用namesilo注册域名修改名称服务器Nameservers教程

 

视频演示:https://youtu.be/b-i8pfuTws0

 

部署NaiveProxy服务端

① 创建一个docker网络:这里创建了一个anqiqii的网络,创建网络是为了给容器一个固定IP

docker network create --subnet 192.168.18.0/24 --gateway 192.168.18.1 anqiqii

 

② 创建一个ubuntu容器,我们将在这个容器中部署naive并通过nginx复用443端口。对于直接在VPS中部署naive,推荐使用ubuntu系统。

docker run -it --network=anqiqii --ip 192.168.18.66 --name naive -v /home/naiveproxy:/root ubuntu /bin/bash

 

③ 进入容器后,进入/root目录:cd ~ ;然后执行如下命令编译安装 caddy+naive

apt update

apt install golang-go

apt install ca-certificates

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive

 

④ 在编译好的caddy程序的同级目录下创建一个Caddyfile文件:(由于做了挂载,这个目录对应了宿主机的 /home/naiveproxy 目录)

:443, naive.caq98i.top    #监听的端口和部署naiveproxy的域名

tls [email protected]    #邮箱,真实的邮箱or虚假的邮箱均可

route {

 forward_proxy {

   basic_auth user password     #用户名和密码

   hide_ip

   hide_via

   probe_resistance

  }

 #多用户支持

 forward_proxy {

   basic_auth user2 password2      #第二个用户的用户名和密码

   hide_ip

   hide_via

   probe_resistance

  }

 reverse_proxy  https://www.bing.com  {    #反代一个网站用于伪装

   header_up  Host  {upstream_hostport}

   header_up  X-Forwarded-Host  {host}

  }

}

 

基于nginx的多节点443端口复用

配置nginx用于多节点的sin分流实现443端口复用同时也将80端口配置给容器便于caddy自动申请证书

⑤ nginx的stream配置如下:

stream {

    map $ssl_preread_server_name $sni_name {

      www.reality.com   reality;         # reality节点的伪装域名

      naive.caq98i.top   naive;        # naive节点的域名

      default       blog;        # 其他未匹配的域名走blog标注的上游服务器

    }

    

# 配置不同的上游服务,转交数据包

    upstream reality {

      server 192.168.18.99:47869;    # 部署reality的容器的ip和监听的端口

    }

    

    upstream naive {

      server 192.168.18.66: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;

  }

}

 

⑥ 在HTTP块中添加一个server,这个在caddy申请证书是用到

server

{

    listen 80;

    server_name naive.caq98i.top;      # naive节点的域名

    

  location / {

  proxy_pass http://192.168.18.66/;     # naive容器的IP

  proxy_set_header Host $host;

  proxy_set_header X-Real-IP $remote_addr;

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  }

}

 

⑦ 回到naive容器,执行:./caddy start ;caddy会自动申请证书并启动naiveproxy的服务端;最后,使用 CTRL+P+Q 保持当前的进程并退出容器

注:只要正常开放了80和443端口,caddy就能正常自动获取证书。在本例中,caddy部署在了docker容器中(ip地址为192.168.18.66)并可以监听80和443端口,但这是内网IP,并不是公网IP,申请证书时,caddy需要通过公网IP的80和443端口和CA机构通讯以便获得证书的签发。本教程中,公网IP的80和443端口被nginx监听,通过配置nginx将关于域名maive.caq98i.top的数据包转交给caddy所在的容器。

caddy常用命令:

前台运行caddy:./caddy run

后台运行caddy:./caddy start

停止caddy:./caddy stop

重载配置:./caddy reload

 

naiveproxy客户端配置

⑧ 新建一个.json文件,配置如下:

{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://user:[email protected]"
}

配置了监听端口,proxy中配置了用户名,密码和naive节点的域名

 

⑨ 在V2rayN中添加一个自定义配置服务器:

如果对V2rayN客户端不熟悉,可以参考:v2ray 系列教程


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


            support a 🍕


留言与评论







限时特惠促销