NaiveProxy
NaïveProxy 使用 Chromium 的网络堆栈来伪装具有强大审查抵抗力和低可检测性的流量。重用 Chrome 的堆栈还可以确保性能和安全性方面的最佳实践。
NaiveProxy的特点
使用 Chromium 的网络堆栈可以缓解以下流量攻击:
- 网站指纹识别/流量分类:通过 HTTP/2 中的流量复用进行缓解。
- TLS 参数指纹识别:通过重用Chrome 的网络堆栈而失败。
- 主动探测:被应用程序前端打败,即将代理服务器隐藏在具有应用层路由的常用前端服务器后面。
- 基于长度的流量分析:通过长度填充来缓解。
项目地址
https://github.com/klzgrad/naiveproxy
NaiveProxy 搭建
naiveproxy 会直接启用 http3 的 quic 协议,不要担心443端口被占用的问题,UDP和TCP的端口是不冲突的。
搭建前准备
- NaiveProxy 使用的是TLS流量,所以需要申请域名域名,首先注册域名。推荐注册6字母的10年xyz,折合每年1美元,土耳其区GOOGLE DOMAIN更便宜。
- 申请 let's encrypt 的免费TLS证书。
- 安装Go语言
- 安装Caddy
安装GO语言
Go官网下载地址:https://go.dev/dl/
Go语言安装教程:安装Go语言及搭建Go语言开发环境
在安装之前,首先使用 lscpu
查看一下服务器的CPU架构。
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/
go语言解压缩完毕即可,无需安装,解压缩后,在 /etc/profile
文件内添加变量。
echo export PATH=$PATH:/usr/local/go/bin >> /etc/profile
source /etc/profile
go version
能够正常显示GO语言版本,就表示已经安装成功了。
安装 NaïveProxy 和 Caddy
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
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 目录,之后查看一下是否编译成功。显示版本号,就已经编译成功了。
配置 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;
使用下面的模板,进行如下更改:
- 替换yourname为您选择的用于 NaiveProxy 身份验证的用户名。
- 替换 pass 为您生成的强密码,或者自定义密码。
- 用您的域名和主机名替换 example.com
- 用您的实际电子邮件地址替换[email protected]用来接收 Let's Encrypt 通知
caddy在服务器上有两种建立代理网站的方式,一种是将web网站文件保存在服务器上,另外一种是反向代理到其它网站。
如果想建立多用户版Naive,可以将 forward_proxy 模块复制。将basic_auth中的用户密码修改成另外一个就可以了。
在服务器上新建web网站:
: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
}
}
将域名反向代理到其它网站地址:
:443, example.com
tls [email protected]
route {
forward_proxy {
basic_auth yourname pass
hide_ip
hide_via
probe_resistance
}
reverse_proxy https://example2.com {
header_up Host {upstream_hostport}
}
}
caddy官方反向代理文档:https://caddyserver.com/docs/caddyfile/directives/reverse_proxy
几种配置域名SSL证书的方式:
- 手工向证书发行方申请方式
手动从证书发行方申请证书,然后在Caddy配置中指定证书和秘钥文件路径:
tls /path/example.com.crt /path/example.com.key - 主机自动申请方式
如果目标域名(例如: example.com)已经解析到了本机,那么 Caddy2 启动后会尝试自动通过 ACME HTTP 申请证书(默认的证书发行方为 let's encrypt)。
优点:配置简单,
语法如下, 后面的 email 参数是告知 CA 申请人的邮箱。
tls email - 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成功启动之后,接下来配置一下自启动文件,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
显示active(running)表示 caddy 已经启动成功了。
ss -tulpn | grep caddy
到这里 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"
配置 NaiveProxy 客户端
{
"listen": "socks://127.0.0.1:1080",
"proxy": "https://user:[email protected]"
}
或者quic://user:[email protected]
配置结束,开始畅游网络吧!