Naive节点搭建

naiveproxy 是一个web服务代理工具,和VPN有本质上的区别,naiveproxy 需要配合转发代理服务器使用,caddy 是具有自动TLS功能的HTTPS服务器。

执行以下安装命令,安装之前需要保证服务器到github的网络通畅。编译需要一定的时间,服务器CPU性能很关键,请耐心等待。

注意:forwardproxy 是第三方插件,caddy本身是不带的,下面是集成了 forwardproxy 和 naive 的 caddy

一定要安装带 forwardproxy 和 naive 插件的 caddy ,否则需要单独安装这两个 caddy 插件。

安装之后可以使用caddy list-modules | grep forward_proxy命令来查看。

xcaddy项目地址:https://github.com/caddyserver/xcaddy

naive服务端配置

编译安装caddy+naive:

apt install golang-go
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive

如果第二条指令执行出错,可以尝试执行go env -w GO111MODULE=on 再重试,还不行的话需要升级go版。

安装Go语言

Go官网下载地址:https://go.dev/dl/

Go语言安装教程:安装Go语言及搭建Go语言开发环境

在安装之前,首先使用 lscpu 查看一下服务器的CPU架构。

intel 与 amd 厂商使用的是基于X86架构的CPU,X86架构使用的是复杂指令集即指令一步到位,而arm使用的是精简指令集即指令由几个指令完成。
X86架构性能好,但是耗电多、电压高,主要用于桌面合服务器。
然而ARM架构耗电少、电压低,但是单核性能不如X86,主要用于移动设备。
近几年来,X86架构发展迟缓,ARM架构进步显著,已经从移动设备向桌面电脑和服务器进军了,如m1芯片。

arm架构的cpu:https://go.dev/dl/go1.19.2.linux-arm64.tar.gz

x86架构的cpu:https://go.dev/dl/go1.19.2.linux-amd64.tar.gz

在服务器上下载go语言安装包,然后解压到 /usr/local/ 目录中。

wget https://go.dev/dl/go1.20.4.linux-amd64.tar.gz
tar -zxvf go1.20.4.linux-amd64.tar.gz -C /usr/local/

go语言解压缩完毕即可,无需安装,解压缩后,在 /etc/profile 文件内添加变量。

## 添加 Go 环境变量:
echo 'export GOROOT=/usr/local/go' >> /etc/profile
echo 'export PATH=$GOROOT/bin:$PATH' >> /etc/profile
source /etc/profile go version

安装完毕后使用 go version 命令查看安装是否成功

能够正常显示GO语言版本,就表示已经安装成功了。

再次执行之前的命令

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移动到/usr/bin/

mv caddy /usr/bin/
/usr/bin/caddy version
setcap cap_net_bind_service=+ep /usr/bin/caddy
#使用setcap命令设置 /usr/bin/caddy 可以非ROOT用户启动1024以下端口。

注意:可以使用这条命令 setcap -r /usr/bin/caddy 清除附加权限。

编译完成后,将 caddy 文件夹拷贝到 /usr/bin 目录,之后查看一下是否编译成功。显示版本号,就已经编译成功了。

优化BBR加速模块

新版本Linux系统自带BBR加速模块,所以你可以直接执行以下命令,启用原版BBR加速。命令如下:

bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
sysctl -p

配置 caddy

以上都安装完毕后,接下来配置caddy

首先,将域名A记录解析到所在服务器的IP地址上。然后申请SSL域名证书。

#新建存放Caddyfile的目录
mkdir /etc/caddy/
#使用VI命令在/etc/caddy/目录中,新建Caddyfile配置文件
vi /etc/caddy/Caddyfile

生成强密码,输入下面命令,在服务器上自动生成一串强密码。(可以不用)

cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c32; echo;

使用下面的模板,进行如下更改:

  • 替换user为您选择的用于 NaiveProxy 身份验证的用户名。
  • 替换 pass 为您生成的强密码,或者自定义密码。
  • 用您的域名和主机名替换 example.com
  • 用您的实际电子邮件地址替换youremail@example.com用来接收 Let’s Encrypt 通知

caddy在服务器上有两种建立代理网站的方式,一种是将web网站文件保存在服务器上,另外一种是反向代理到其它网站。

如果想建立多用户版Naive,可以将 forward_proxy 模块复制。将basic_auth中的用户密码修改成另外一个就可以了。

反向代理到其它网站:

:443, example.com #你的域名
tls youremail@example.com #你的邮箱
route {
 forward_proxy {
   basic_auth user pass #用户名和密码
   hide_ip
   hide_via
   probe_resistance
  }
 #支持多用户
 forward_proxy {
   basic_auth user2 pass2 #用户名和密码
   hide_ip
   hide_via
   probe_resistance
  }
 reverse_proxy  https://demo.cloudreve.org  { #伪装网址
   header_up  Host  {upstream_hostport}
   header_up  X-Forwarded-Host  {host}
  }
}

在服务器上新建web网站:

:443, example.com
tls youremail@example.com
route {
  forward_proxy {
    basic_auth user pass
    hide_ip
    hide_via
    probe_resistance
  }
  file_server {
    root /var/www/html 
  }
}

caddy官方反向代理文档:https://caddyserver.com/docs/caddyfile/directives/reverse_proxy

修改好配置文件后,启动 caddy 。在启动 caddy之前,你需要先格式化配置文件,否则会报错,使用 caddy fmt –overwrite /etc/caddy/Caddyfile 命令

#格式化配置文件
caddy fmt --overwrite /etc/caddy/Caddyfile
#启动配置文件
caddy run --config /etc/caddy/Caddyfile

在浏览器中输入域名后,网站可以正常打开,caddy成功启动之后,接下来配置一下自启动文件,reboot 重新启动服务器。

caddy配置守护进程(开机自启):https://github.com/klzgrad/naiveproxy/wiki/Run-Caddy-as-a-daemon

常用命令

# 以后台的方式启动 caddy
caddy start --config  /etc/caddy/Caddyfile
# 以前台的方式启动 caddy
caddy run --config  /etc/caddy/Caddyfile
# 停止
caddy stop 
# reload 配置文件 
caddy reload  --config  /etc/caddy/Caddyfile
# 安装 CA 证书到本地目录
caddy trust
# 格式化 Caddyfile 
caddy fmt --overwrite /etc/caddy/Caddyfile
# 将标准的 Caddyfile 转成 json 格式的等效配置文件, 小白就不要折腾这种配置文件了
caddy adapt --config  /etc/caddy/Caddyfile --pretty

手动创建一个自启动配置文件。注意不要使用命令来启动caddy

vi /etc/systemd/system/naive.service

将下面内容粘贴到 naive.service 文件中后 :wq 保存退出vi编辑模式。

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=root
Group=root
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target

自启动文件创建完毕后,启动caddy:

#daemon-reload 加载新的 unit 配置文件
systemctl daemon-reload
#enable 创建 unit 配置文件的软链
systemctl enable naive
#start 启动配置文件
systemctl start naive
#status 查看配置文件当前状态
systemctl status naive

这就表示 caddy 已经启动成功了。

检查 Caddy 是否正在侦听端口80和443:

ss -tulpn | grep caddy

您可以通过在 PC 上打开 Google Chrome 并访问您的主机。例如:https://www.example.com

到这里 Naive 就已经配置完毕了,如果你喜欢尝试不同的naive配置文件,也可以采用下面的JSON方式,自定义naive配置文件。

Json自定义配置文件

查看官方JSON 配置结构

除了创建 Caddyfile 配置文件之外,你还可以将 Caddyfile 配置文件,转换为 json 文件。转换之后的 json 文件可以临时测试使用,也可以作为永久的配置文件使用,修改 naive.service 文件中的路径即可。下面贴出来一个自定义的 json 配置文件,喜欢测试的可以用来测试使用。

#  /etc/caddy/caddy_server.json
{
  "admin": {
    "disabled": true
  },
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [
            ":443"
          ],
          "routes": [
            {
              "handle": [
                {
                  "handler": "subroute",
                  "routes": [
                    {
                      "handle": [
                        {
                          "auth_user_deprecated": "用户名",
                          "auth_pass_deprecated": "密码",
                          "handler": "forward_proxy",
                          "hide_ip": true,
                          "hide_via": true,
                          "probe_resistance": {}
                        }
                      ]
                    },
                    {
                      "match": [
                        {
                          "host": [
                            "域名"
                          ]
                        }
                      ],
                      "handle": [
                        {
                          "handler": "file_server",
                          "root": "/var/www",
                          "index_names": [
                            "index.html"
                          ]
                        }
                      ],
                      "terminal": true
                    }
                  ]
                }
              ]
            }
          ],
          "tls_connection_policies": [
            {
              "match": {
                "sni": [
                  "域名"
                ]
              }
            }
          ],
          "automatic_https": {
            "disable": true
          }
        }
      }
    },
    "tls": {
      "certificates": {
        "load_files": [
          {
            "certificate": "/etc/letsencrypt/live/域名/fullchain.pem",
            "key": "/etc/letsencrypt/live/域名/privkey.pem"
          }
        ]
      }
    }
  }
}

运行配置文件之前也需要预先格式化一下,否则会报错!

#格式化配置文件
caddy fmt --overwrite "/etc/caddy/caddy_server.json"
caddy run --config "/etc/caddy/caddy_server.json"

SSL证书地址:/root/.local/share/caddy/certificates/acme.zerossl.com-v2-dv90

配置 NaiveProxy 客户端

网络上除了NaiveProxy官方提供的客户端,还有很多支持NaiveProxy的第三方客户端,例如Q2ray。

NaiveProxy官方客户端

Naive客户端支持很广泛,Windows、Linux、Mac、Android等,最关键的是支持 Openwrt,可以将客户端内置到路由器中。

Naive客户端下载地址:https://github.com/klzgrad/naiveproxy/releases

下面看一下Windows平台的客户端配置以及连接速度。

下载 Windows 版本的客户端,解压缩后,打开 config.json 文件。

{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://user:pass@example.com"
}

config.json 文件中很简单,就五行代码,还包括两行括号。

  • listen 不需要改动,本机的代理端口,默认1080。也可以将127.0.0.1修改成0.0.0.0
  • proxy 是上面设置的服务端的用户密码以及域名。如果使用 HTTP3 则将 https:// 改为 quic://
  • log 日志文件,无需填写。如果删除该行,客户端的dos窗口不显示日志。

NaiveProxy客户端启动完毕后,还需要配置一个socks5的网络代理,才能正常使用 Google Chrome 浏览器进行访问。

发表评论