Naïve 是近些年出现的一款比较成熟、高效的代理工具。服务端为 Caddy Web 服务器插件,实现代理功能;客户端使用 Chrome 协议栈,使得代理数据在审核工具是看起来更像正常的 HTTPS 数据流,从而降低代理服务器被命中而挂掉的机率。

本文将详细讲解如何部署和使用 Naïve,希望给墙内的小伙伴多一个选择。

1] Naïve 原理和优势

在了解 Naïve 之前,可能大家都有个疑问,现在科学上网的工具虽说不上众多,起码 V2ray/Xray 也可以扛大梁,为什么还要再选择 Naïve 呢。其实回答这个问题,只需要我的亲身经历就可以解释。

我之前部署有一套 Xray 代理,采用 Nginx 作为后端服务器,跑了一个小网站作为掩饰网站,协议使用 VLESS,加密方式采用 XTLS,开了80和443端口,代理数据走443,访问网站走80和443。通过浏览器访问网站,可以正常跳转至网页内容,也可以正常代理上网。这套代理正常使用了一年多,自以为隐蔽性是比较高的,直到近期服务器 443 端口忽然被封了,但是80确可以正常访问。于是换了一个端口跑代理,不久新端口又被封了,才感觉到审核工具功能又有了提升,可以识别代理数据了。后来通过相关知识才了解到,代理数据是全过程加密的,被识别的可能性不大,而问题出在服务器 TLS 指纹上。

在进行 TLS 连接之前,客户端和服务器会协商 TLS 的连接细节,这些交互内容计算得出的 hash 串就是 TLS 指纹,服务器和客户端都有各自的指纹。敢叫指纹,肯定是不同的服务器生成的 hash 串都是唯一的,但是却偏偏出了一个工具 jarm,通过特殊算法收集服务器指纹,将相关性较高的指纹生成同一个 jarm 串。由于 Xray 服务端直接同客户端交互,所以会生成自己的指纹,而 jarm 串也与其它 Web 服务器的 jarm 串不一致,最终因为 jarm 串相似度较低而被审核工具识别到。这也是为什么代理服务器只是被封了端口而没有封 IP 的原因了,审核工具高级了么,可以精准识别。

现在就好理解 Naïve 的优势了,Naïve 天生就是为了对付 jarm 算法的。服务端是支持前向代理的 Caddy 服务器,客户端是伪装过的 Chome 浏览器,虽然代理方式还是通过客户端将代理数据发送给服务器,但是服务端和客户端的 jarm 串都是正常网站交互的串,从而降低被识别的风险。

采用 Naïve 后效果可以说是立竿见影,Xray 服务端的 jarm 指纹相似度仅为1600多;而转为 Naïve 后,jarm 指纹相似度一下提高到460000多,被命中识别的概率大大降低。

当然,Naïve 的优势不仅仅在于高隐蔽性,其服务端的高效性和 TLS 高级功能也是值得称道的,这都得益于采用了 Caddy 服务器,想了解 Caddy 的相关细节,可以访问其 >>官方网站<<

2] Naïve 服务器安装部署

之前介绍过,Naïve 服务器其实就是一个嵌入了 Naïve 插件的 Caddy 服务器,所以部署 Naïve 服务器的过程就是本地编译一个可执行的 Caddy,然后配置启动 Caddy 服务端,就完成了服务器的配置。过程看似简单,但还是需要一些前置条件的,一个条件是已经生效的 DNS 解析,另一个就是可信证书机构颁发的域名证书。由于 Caddy 是支持自动申请证书的,没有 DNS 解析可能会造成证书申请失败,从而影响服务器正常运行;可信证书就更好理解了,虽然 Caddy 有证书就可以跑服务,但是用它就是为了把代理服务器伪装成正常网站,而网站如果采用自签名的证书,很明显就是不正常。

本次 Naïve 服务器的部署方案采用如下方式:

  • HTTP 网站使用 nginx
  • HTTPS 网站使用 Caddy
  • 域名证书使用 Let’s Encrypt

采用这种方式是为了申请和更新证书方便。可能有些朋友会问,为什么不直接用 Caddy 自动申请证书功能呢,嘿嘿,那当然是因为我不会呀。Nginx 加 Let’s Encrypt 是 Xray 就练就的本事,能用就行。再说用 Let’s Encrypt 的证书,需要设置 Caddy 的配置文件,可以更深入理解 Caddy,方便之后修改个侦听端口绑定域名啥的。

安装 Nginx 和申请 Let’s Encrypt 的部分就略过,不了解的朋友可以参考 >>相关教程<<

Caddy 是使用 Go 语言开发的,本地部署 Naïve 服务器实际上就是用 Go 语言本地编译一个具有 Naïve 插件的 Caddy 可执行程序。所以 Caddy 的安装可以理解成本地编译 Caddy 的教程。全部命令如下:

/* Go 语言安装部分 */ 
# wget https://go.dev/dl/go1.19.2.linux-amd64.tar.gz
# rm -rf /usr/local/go && tar -C /usr/local -xzf go1.19.2.linux-amd64.tar.gz
# export PATH=$PATH:/usr/local/go/bin

/* Naïve 服务器安装部分,安装之前需要安装libnss3 */    
# go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
# ~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive
# setcap cap_net_bind_service=+ep ./caddy

安装完成后,会在用户家目录生成一个可执行文件 caddy,也就是 Naïve 的服务端。如果在编译过程中遇到问题编译不成功,而主机是 AMD64 架构的 Linux 系统,可以从本站下载已经编译好的版本(Naïve AMD64 Linux 版 2.6.2),直接可以按以下的步骤部署服务器即可。

创建一个 Caddy 的配置文件”/etc/caddy/caddy.json”,内容如下:

/* 
{
  "admin": {
    "disabled": true
  },
  "logging": {
    "sink": {
      "writer": {
        "output": "discard"
      }
    },
    "logs": {
      "default": {
        "writer": {
          "output": "discard"
        }
      }
    }
  },
  "apps": {
    "http": {
      "servers": {
        "srv0": {
          "listen": [
            ":443"
          ],
          "routes": [
            {
              "handle": [
                {
                  "handler": "subroute",
                  "routes": [
                    {
                      "handle": [
                        {
                          "auth_pass_deprecated": "passwd",
                          "auth_user_deprecated": "user",
                          "handler": "forward_proxy",
                          "hide_ip": true,
                          "hide_via": true,
                          "probe_resistance": {}
                        }
                      ]
                    },
                    {
                      "match": [
                        {
                          "host": [
                            "example.com"
                          ]
                        }
                      ],
                      "handle": [
                        {
                          "handler": "file_server",
                          "root": "/wwwroot/html",
                          "index_names": [
                            "index.html"
                          ]
                        }
                      ],
                      "terminal": true
                    }
                  ]
                }
              ]
            }
          ],
          "tls_connection_policies": [
            {
              "match": {
                "sni": [
                  "example.com"
                ]
              }
            }
          ],
          "automatic_https": {
            "disable": true
          }
        }
      }
    },
    "tls": {
      "certificates": {
        "load_files": [
          {
            "certificate": "/path/to/certkey.pem",
            "key": "/path/to/privkey.pem"
          }
        ]
      }
    }
  }
}

配置文件中的标红内容需要根据实际情况进行修改,其中:

  • listen 为 Caddy 侦听的端口,默认为443,没有特殊需求,建议不修改
  • auth_pass_deprecated 为 Naïve 代理认证的密码
  • auth_user_deprecated 为 Naïve 代理认证的用户名
  • host 为 Caddy 服务器域名
  • root 为网站文件的实际目录
  • sni 为服务器名称标识,使用单一证书时保持与 host 相同即可
  • certificate 为域名证书的公钥文件
  • key 为域名证书的私钥文件

全部修改正确后,可以使用如下命令进行验证:

# ./caddy run --config /etc/caddy/caddy.json

图.1 启动 Caddy 应用

如出现图.1 所示内容而没有报错,则表示 Naïve 服务器可以正常使用了。

管理方便起见,可以将 caddy 程序移动至”/usr/local/bin”目录,并创建一个服务文件”caddy.service”,内容如下:

# /etc/systemd/system/caddy.service RHEL/CentOS Version
# /lib/systemd/system/caddy.service Debian Version
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=root
#Group=caddy
ExecStart=/usr/local/bin/caddy run --environ --config /etc/caddy/caddy.json
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/caddy.json
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

创建完成的,就可以使用如下命令启动并查看 Naïve 服务器的状态了:

# systemctl enable caddy
# systemctl start caddy
# systemctl status caddy

如果见到如下内容,则 Naïve 服务器就部署成功了:

图.2 查看 Naïve 服务器状态

3] Naïve 客户端的使用
Naïve 目前可以使用的客户端包含桌面端和 Andriod 手机端。桌面端客户端为命令行工具,为一个可执行文件 naive,在该文件的相同目录,创建一个配置文件”config.json”,内容如下:

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

修改其中的 user、passwd以及example.com:8443等内容为与 Naïve 服务器配置对应的内容即可,客户端配置示例展示了如果 服务器采用非443端口时的写法,方便大家尝试。

完成后使用如下命令启动 Naïve 客户端:

# ./naive config.json

图.3 启动 Naïve 客户端

此时,就成功启动了 Naïve 客户端。

使用 Naïve,需要对浏览器设置代理,以 Firefox 为例,代理设置如下图所示:

图.4 浏览器设置使用 Naïve 代理

浏览器选择手动配置代理,然后在 SOCKS 主机中填入与 Naïve 客户端对应的配置内容,版本选择 v5,保险起见,建议钩选”使用 SOCKS v5 时代理 DNS 查询”。

全部设置完成后,就可以打开浏览器验证代理功能了。不出意外的话,就可以见到久违的 GOOGLE 了。

至于 Android 手机端,本站 >>下载页面<< 会提供专用软件”SagerNet”和”Naïve插件”的下载,全部下载后安装到手机,在手机中添加一个 Naïve 站点,填入相应内容即可使用,这里不再赘述。

总之,Naïve 是一个具有更高隐蔽性的科学上网神器,值得墙内朋友尝试。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注