6

NaiveProxy 安装教程 NaiveProxy 高速隐匿的代理工具

 1 year ago
source link: https://uzbox.com/tech/naiveproxy.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

NaiveProxy 安装教程 NaiveProxy 高速隐匿的代理工具

在安装NaiveProxy之前,我们首先需要了解一下NaiveProxy是什么东西,随着网络技术的更新,一些传统的代理工具逐渐被淘汰,淘汰的原因不言而喻,淘汰的同时又有一批新的技术脱颖而出。下面详细了解一下什么是NaiveProxy。一款强大而神器的代理工具。

什么是 NaiveProxy

NaiveProxy 是 Caddy Web 服务器的转发代理插件,一个插件都这么厉害。那么 Caddy 又是什么东西?

Caddy是什么

Caddy 是一个开源的,使用 Golang 编写,支持 HTTP/2 的 Web 服务端。它使用Golang 标准库提供HTTP 功能。 Caddy 一个显著的特性是默认启用HTTPS。它是第一个无需额外配置即可提供HTTPS 特性的Web 服务器。

作者 Matt Holt 于 2014 年 12 月开始开发 Caddy ,并于 2015 年 4 月发布第一个版本。在发布后的一年里,它的下载量超过了 20000 次,并在 GitHub 上获得了 4500 个 Star。

Caddy 支持各种 Web 技术,提供静态编译的二进制文件,支持 i386、amd64 和 ARM 架构上的 Windows、Mac、Linux、Android 和 BSD 操作系统。

Caddy 具有自动 HTTPS 的快速且可扩展的多平台 HTTP/3 Web 服务器

Caddy官网:https://caddyserver.com/

GitHub项目地址:https://github.com/caddyserver/caddy

NaiveProxy 安装教程 NaiveProxy高速隐匿的代理工具

关于 Caddy 不过多介绍,有想详细了解 Caddy 的网友,可以访问 Caddy 官方网站和项目页面进行查看。下面继续说 NaiveProxy

NaiveProxy 对比其它工具有什么不同

NaïveProxy 使用 Chromium 的网络堆栈来伪装具有强大的审查阻力和低可检测性的流量。重复使用 Chrome 的堆栈还可以确保性能和安全性方面的最佳实践。

Cronet 是一个类似地从 Chromium 的网络堆栈派生的库,但其官方版本仅限于 Android 和 iOS。NaïveProxy 的 Cronet 分支提供其原生 API 的二进制版本,支持多个平台,并支持使用 cgo 和cronet-go绑定创建 Go 应用程序。

使用 Chromium 的网络堆栈可以缓解以下流量攻击:

  • 网站指纹/流量分类:通过 HTTP/2 中的流量复用来缓解。
  • TLS 参数指纹识别:通过重用Chrome 的网络堆栈而失败。
  • 主动探测:被应用程序前端击败,即将代理服务器隐藏在具有应用层路由的常用前端服务器后面。
  • 基于长度的流量分析:通过长度填充来缓解。

NaiveProxy 使用Chrome的网络堆栈,Chrome 和标准前端(如 Caddy、HAProxy)之间的常规 HTTP/2 流量完全相同。前端还会将未经身份验证的用户和活动探测器重新路由到后端HTTP服务器,从而使得无法检测到代理的存在。

前端服务器可以是任何众所周知的反向代理,它能够基于 HTTP 授权标头路由 HTTP/2 流量,从而防止主动探测代理的存在。已知的包括带有 forwardproxy 插件和 HAProxy 的 Caddy。

现在主流代理工具的tls都使用http/1.1,而 NaiveProxy 使用的传输协议是 http2 与 http3

http2和http1的区别

HTTP/1.1,使用基于文本格式,文本表现形式多样、场景多,健壮性不足。HTTP/2使用二进制格式,只有0和1的组合,选择二进制传输,协议解析实现方便且健壮。
HTTP连接会随着时间进行自我调节,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调节被称为TCP慢启动。这种调节让具有突发性和短时性的HTTP连接变的十分低效。HTTP/2通过多路复用让所有数据流使用同一个连接,有效使用TCP连接,让高带宽也能真正的服务于HTTP的性能提升。
HTTP/2在应用层和传输层之间增加了二进制分帧,突破了HTTP/1.1性能限制,改进传输性能,实现低延迟和高吞吐量。
HTTP/2使用HPACK算法来压缩每次请求连接的头字段,降低了网络开销。HPACK算法可以减少需要传输的头字段大小,通讯双方通过建立和维护头字段表,字段表中使用长度较小的索引号表示重复的字符串,在用Huffman编码压缩数据,既避免了重复头字段的传输,又减小了需要传输的大小。

HTTP/2有哪些关键特性?

二进制分帧
HTTP/2所有性能增强的核心在于新的二进制分帧层,如下图所示,它是所有其他功能和性能优化的基础,它定义了如何封装HTTP消息并在客户端与服务器之间传输。

NaiveProxy 安装 高速隐匿的代理工具-1

HTTP/2没有改动HTTP的应用语义,仍然使用HTTP的请求方法、状态码和头字段等规则,它主要修改了HTTP的报文传输格式。HTTP/1.1协议以换行符作为纯文本的分隔符,而HTTP/2将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们编码,这些帧对应着特定数据流中的消息,他们都在一个TCP连接内复用。

优先级排序
将HTTP消息分解为很多独立的帧之后就可以复用多个数据流中的帧,客户端和服务器交错发送和传输这些帧的顺序就成为关键的性能决定因素。HTTP/2允许每个数据流都有一个关联的权重和依赖关系,数据流依赖关系和权重的组合明确表达了资源优先级,这是一种用于提升浏览性能的关键功能。HTTP/2协议还允许客户端随时更新这些优先级,我们可以根据用户互动和其他信号更改依赖关系和重新分配权重,这进一步优化了浏览器性能。

首部压缩
HTTP每次请求或响应都会携带首部信息用于描述资源属性。HTTP/1.1使用文本的形式传输消息头,消息头中携带cookie每次都需要重复传输几百到几千的字节,这十分占用资源。

HTTP/2使用了HPACK算法来压缩头字段,这种压缩格式对传输的头字段进行编码,减少了头字段的大小。同时,在两端维护了索引表,用于记录出现过的头字段,后面在传输过程中就可以传输已经记录过的头字段的索引号,对端收到数据后就可以通过索引号找到对应的值。

多路复用
多路复用允许同时通过单一的HTTP/2连接发起多重的请求-响应消息,实现多流并行而并不依赖多个TCP连接,HTTP/2把HTTP协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息,并行地在同一个TCP连接上双向交换消息。

HTTP/2基于二进制分帧层,HTTP/2可以在共享TCP连接的基础上同时发送请求和响应。HTTP消息被分解为独立的帧,而不破坏消息本身的语义交错发出去,在另一端根据流标识符和首部将他们重新组装起来。通过多路复用技术,可以避免HTTP旧版本的消息头阻塞问题,极大提高传输性能。

HTTP/2服务器推送
HTTP2.0的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。服务器向客户端推送资源无需客户端明确的请求。服务端根据客户端的请求,提前返回多个响应,推送额外的资源给客户端。如下图所示,客户端请求stream 1,服务端在返回stream 1的消息的同时推送了stream 2和stream 4。

NaiveProxy 安装 高速隐匿的代理工具-2

服务端推送是一种在客户端请求之前发送数据的机制。在HTTP/2中,服务器可以对一个客户端的请求发送多个响应。如果一个请求是由你的主页发送的,服务器可能会响应主页内容、logo以及样式表,因为服务端知道客户端会用到这些东西。这样不但减轻了数据传送冗余步骤,也加快了页面响应的速度,提高了用户体验。

什么是HTTP3

HTTP/3是第三个主要版本的HTTP协议。与其前任HTTP/1.1和HTTP/2不同,在HTTP/3中,将弃用TCP协议,改为使用基于UDP协议的QUIC协议实现。

此变化主要为了解决HTTP/2中存在的队头阻塞问题。由于HTTP/2在单个TCP连接上使用了多路复用,受到TCP拥塞控制的影响,少量的丢包就可能导致整个TCP连接上的所有流被阻塞。

QUIC(快速UDP网络连接)是一种实验性的网络传输协议,由Google开发,该协议旨在使网页传输更快。在2018年10月28日的邮件列表讨论中,互联网工程任务组(IETF) HTTP和QUIC工作组主席Mark Nottingham(英语:Mark Nottingham)提出了将HTTP-over-QUIC更名为HTTP/3的正式请求,以“明确地将其标识为HTTP语义的另一个绑定……使人们理解它与QUIC的不同”,并在最终确定并发布草案后,将QUIC工作组继承到HTTP工作组。[ 在随后的几天讨论中,Mark Nottingham(英语:Mark Nottingham)的提议得到了IETF成员的接受,他们在2018年11月给出了官方批准,认可HTTP-over-QUIC成为HTTP/3。

2019年9月,HTTP/3支持已添加到Cloudflare和Google Chrome(Canary build)。Firefox Nightly在2019年秋季之后添加支持。

2022年6月6日,IETF正式标准化HTTP/3为RFC9114。

NaiveProxy 安装 高速隐匿的代理工具-1

http3,基于 udp 的 quic 协议,UDP 是“无连接”的,根本就不需要“握手”和“挥手”,所以就比 TCP 来得快。同时因为 naiveproxy 通过重用了 chrome 的网络堆栈,就实现了流量的彻底隐藏,同时又获得了 http3 的高速传输。

NaiveProxy 搭建

言归正传,下面搭建一个 naiveproxy 服务器,naiveproxy 会直接启用 http3 的 quic 协议,不要担心443端口被占用的问题,UDP和TCP的端口是不冲突的。

NaiveProxy项目主页:https://github.com/klzgrad/forwardproxy

NaiveProxy搭建 前的准备工作

NaiveProxy 使用的是TLS流量,所以需要申请域名域名,首先注册域名。

免费注册国外域名:.tk .ml .ga .cf .gq

然后申请 let’s encrypt 的免费TLS证书。

免费申请SSL证书机器人:Certbot快速申请自动续订https域名证书

其次是你需要一台独立的云主机,如果你还没有免费的云主机,可以去谷歌云、亚马逊云、微软云进行免费申请。

推荐使用亚马逊云,每月100G流量,免费时长一年。免费申请 AWS EC2 亚马逊云服务器

安装Go语言

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

在安装之前,首先使用 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.19.linux-amd64.tar.gz
tar -zxvf go1.19.linux-amd64.tar.gz -C /usr/local/
wget https://go.dev/dl/go1.19.linux-amd64.tar.gz
tar -zxvf go1.19.linux-amd64.tar.gz -C /usr/local/

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

echo export PATH=$PATH:/usr/local/go/bin >> /etc/profile
source /etc/profile
go version
echo export PATH=$PATH:/usr/local/go/bin  >> /etc/profile
source /etc/profile
go version

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

d34620f7e08de4c0c17808a75d584bc3.png

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

安装 NaïveProxy 和 Caddy

naiveproxy 需要配合转发代理服务器使用,caddy 是具有自动TLS功能的HTTPS服务器。

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

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

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

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive
cp caddy /usr/bin/
/usr/bin/caddy version
setcap cap_net_bind_service=+ep /usr/bin/caddy
#使用setcap命令设置 /usr/bin/caddy 可以非ROOT用户启动1024以下端口。
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive
cp 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 目录,之后查看一下是否编译成功。显示版本号,就已经编译成功了。

31959c997ac24f805cf9fc75a244e4ef-e1666953383192-1280x125.png

配置 caddy

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

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

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

生成强密码,输入下面命令,在服务器上自动生成一串强密码。

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

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

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

查看官方JSON 配置结构

:443, example.com
route {
forward_proxy {
basic_auth yourname pass
hide_ip
hide_via
probe_resistance
file_server {
root /var/www/html
:443, example.com
tls [email protected]
route {
  forward_proxy {
    basic_auth yourname pass
    hide_ip
    hide_via
    probe_resistance
  }
  file_server {
    root /var/www/html 
  }
}

几种配置域名SSL证书的方式:

  1. 手工向证书发行方申请方式
    手动从证书发行方申请证书,然后在Caddy配置中指定证书和秘钥文件路径:
    tls /path/example.com.crt /path/example.com.key
  2. 主机自动申请方式
    如果目标域名(例如: example.com)已经解析到了本机,那么 Caddy2 启动后会尝试自动通过 ACME HTTP 申请证书(默认的证书发行方为 let's encrypt)。
    优点:配置简单,
    语法如下, 后面的 email 参数是告知 CA 申请人的邮箱。
    tls email
  3. dns 自动申请方式
    Let's encrypt通过域名服务商提供的域名解析记录api,来验证我们对域名的所有权。
    优点:不需要任何公网IP地址,只要通过dns的解析记录即可完成验证; 另外,如果网站启用了 CDN,必须使用这个方式。
    缺点:配置比较麻烦,需要设置一些环境变量,另外还需要下载对应dns 服务商的插件(插件简化了caddy调用DNS服务商API的过程),。 caddyfile中的语法:
    tls {
    dns ...
    }

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

#格式化配置文件
caddy fmt --overwrite /etc/caddy/Caddyfile
#启动配置文件
caddy run --config /etc/caddy/Caddyfile
#格式化配置文件
caddy fmt --overwrite /etc/caddy/Caddyfile
#启动配置文件
caddy run --config /etc/caddy/Caddyfile
592688346e514d2e9e4122d99db1fac0-1280x318.png

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

# 以后台的方式启动 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
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
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
[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
#daemon-reload 加载新的 unit 配置文件
systemctl daemon-reload
#enable 创建 unit 配置文件的软链
systemctl enable naive
#start 启动配置文件
systemctl start naive
#status 查看配置文件当前状态
systemctl status naive
f9a336a5de270754a968e2ef14add817.png

查看以喜爱配置文件的当前状态,绿灯表示 caddy 已经启动成功了。

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

ss -tulpn | grep caddy
ss -tulpn | grep caddy

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

json自定义配置文件

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

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

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

配置 NaiveProxy 客户端

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

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

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

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

acc5d65954ba4ec4331f060ad6b968cc.png

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

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

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK