NaiveProxy是一种基于 HTTP/2 协议,并类似于Trojan协议,伪装成最流行的HTTPS流量的新代理技术协议。NaïveProxy使用Chrome的网络堆栈来伪装流量,具有很强的抗审查能力和低可探测性。重用Chrome的堆栈也确保了性能和安全方面的最佳实践。

NaïveProxy可以缓解以下几种流量攻击:

  • 通过HTTP/2中的流量复用缓解指纹识别/流量分类
  • 通过重复使用Chrome的网络堆栈缓解对于TLS参数指纹识别
  • 通过「应用前置」,将代理服务器隐藏在一个常用的前端(Caddy)与应用层路由后面)来防御主动探测
  • 通过填充长度缓解基于长度的流量分析。

NaïveProxy的代码由一系列补丁组成,基于每个新版本的Chrome进行变形和重构。

架构

[浏览器 → Naïve (客户端)] ⟶ 审查者 ⟶ [前端 → Naïve (服务端)] ⟶ Internet

NaïveProxy使用Chrome的网络栈。所以防火墙截获的流量行为与Chrome和标准前端服务器(如Caddy、HAProxy)之间的常规HTTP/2流量是完全相同的。

前端的Caddy会将未经过认证的用户和主动探测流量重定向至后端的伪装服务器(或其他网站),使其无法检测到代理的存在,例如:

[探测] ⟶ 前端 ⟶ [本地伪装index.html]

从v84版本开始,用户可以使用包含naïve的caddy forwardproxy分支来代替单独的naïve服务端

部署

安装go,caddy运行go版本新一点好。

snap install go --classic

安装caddy

caddy是一个像 Apache, nginx, 或 lighttpd 的web服务器。相较nginx比较简单,而且全自动支持HTTP/2协议,无需任何配置。得益于go的特性,caddy只是一个小小的二进制文件,没有依赖,很好部署。

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

老样子,查询asn

http://ipinfo.io/

查找伪装网站

https://fofa.info/

asn=="AS63150" && region=="SG" && port=="443" && cert!="Let's Encrypt" && cert.issuer!="ZeroSSL" && status_code="200" && is_domain=true

kanglecapsule.com

www.anakteknik.co.id

创建Caddyfile文件

:443, 你的域名 #你的域名
tls 你的邮箱 #你的邮箱
route {
forward_proxy {
basic_auth user password #用户名和密码
hide_ip
hide_via
probe_resistance
}
reverse_proxy https://www.anakteknik.co.id { #伪装网址
header_up Host {upstream_hostport}
header_up X-Forwarded-Host {host}
}
}

客户端文件设置

{
"listen": "socks://127.0.0.1:1080",
"proxy": "https://user:Dsc20010224@dengshicong.sbs"
}

下载新内核替换如V2rayN内,与chrome内核相对应版本。

Untitled 15

Untitled 1 5

测速,还是很猛的,速度可能会没reality快,看地区与延迟。

Untitled 2 6

油管10W kbps

Untitled 3 6

自定义端口(可选)

启动命令

./caddy start --config config.json

新建一个config.json文件

//需删除注释内容caddy才能加载
{
"apps": {
"http": {
"servers": {
"srv0": {
"listen": [
":4431" //监听端口
],
"routes": [
{
"handle": [
{
"auth_user_deprecated": "user", //用户名
"auth_pass_deprecated": "pass", //密码
"handler": "forward_proxy",
"hide_ip": true,
"hide_via": true,
"probe_resistance": {}
}
]
},
{
"handle": [
{
"handler": "reverse_proxy",
"headers": {
"request": {
"set": {
"Host": [
"{http.reverse_proxy.upstream.hostport}"
],
"X-Forwarded-Host": [
"{http.request.host}"
]
}
}
},
"transport": {
"protocol": "http",
"tls": {}
},
"upstreams": [
{
"dial": "demo.cloudreve.org:443" //伪装网址
}
]
}
]
}
],
"tls_connection_policies": [
{
"match": {
"sni": [
"naive.buliang0.tk" //域名
]
},
"certificate_selection": {
"any_tag": [
"cert0"
]
}
}
],
"automatic_https": {
"disable": true
}
}
}
},
"tls": {
"certificates": {
"load_files": [
{
"certificate": "/root/a.crt", //公钥路径
"key": "/root/a.key", //私钥路径
"tags": [
"cert0"
]
}
]
}
}
}
}

TLS指纹

TLS指纹又叫SSL指纹,或者JA3指纹,TLS在建立连接时,客户端会向服务端发送client hello包,通过计算得到JA3指纹。在TLS握手中还有服务端响应的server hello包,也有特征,通过计算可以得到

即:

  • JA3是标记客户端的指纹
  • JA3S是标记服务端的指纹
  • JARM是升级版的JA3S指纹

计算JA3

==Client Hello 的版本==、==可接受的加密算法==、==扩展列表中的每一个 type 值==、==支持的椭圆曲线==和==支持的椭圆曲线格式==。然后,用==,==来分隔各个字段、用使用==-==来分隔各个字段中的各个值(十进制哦),将这些值串联在一起之后,计算 MD5,就是一个 ja3 了。

更新的JA4指纹,JA4 可以直接对quic解析。

  • JA4 — TLS Client
  • JA4S — TLS Server Response
  • JA4H — HTTP Client
  • JA4L — Light Distance/Location
  • JA4X — X509 TLS Certificate
  • JA4SSH — SSH Traffic

TLS指纹查看

我们先不使用代理,抓个包看看

Untitled 4 5

再使用代理浏览,指纹没有发生变化。

Untitled 5 5

那再查看节点的指纹

下载jarm工具,监测的是探测是十次后的指纹

wget https://raw.githubusercontent.com/salesforce/jarm/master/jarm.py

Untitled 6 5

查询指纹,语法如下,可以找到四十多万条相同指纹的匹配网站,都是可以正常访问的网站,所以通过这个指纹并不能识别出是否正在使用代理。

jarm==“40d40d40d00000000043d40d40d43d684d61a135bd962c8dd9c541ddbaefa8”

https://fofa.info/

Untitled 7 5