跳到正文
不翻车专注 VPN 软件评测

NaiveProxy 是什么?握手和 Chrome 一模一样,代价是什么

不翻车编辑部 · 更新于

NaiveProxy 科普封面:握手和 Chrome 一样,它是什么

先说结论:NaiveProxy 没有自己设计加密协议,而是把 Chrome 浏览器的网络代码直接拿来当客户端,走浏览器本来就有的 HTTPS 代理隧道(HTTP/2,也可以换 HTTP/3)。2026 年 10 月 18 日我们在测试服务器上做了实验:NaiveProxy v154 发出的第一个握手包,和正式版 Chrome 155 的加密套件(15 个)、扩展(16 个)、签名算法逐项相同;服务端开了防探测以后,不带密码去敲门,看到的是一个普通网页,没开的直接回 407 自报“我是代理”。代价是要自己的域名和证书、要一直跟着 Chrome 更新,Clash 系(mihomo)和 3x-ui 都用不了。

下面的原理部分来自 klzgrad/naiveproxy 仓库的 README 和发布页、sing-box 的 NaiveProxy 出站文档,以及一篇 2024 年的论文,核对日期 2026 年 10 月 18 日。实验的完整记录(版本、参数、原始数字)在文末。

NaiveProxy 是什么

NaiveProxy 2018 年 1 月在 GitHub 上开源,到 2026 年 10 月有约 9500 颗星,最新版是 10 月 7 日发布的 v154.0.8037.49-4。版本号开头的 154 就是它所用的 Chrome 版本。

NaiveProxy 发布页:v154.0.8037.49-4,标着 Latest

它和别的协议最大的不同在客户端。别的协议是自己写一套网络代码,再想办法让握手看起来像浏览器;NaiveProxy 直接用 Chromium(Chrome 的开源底子)的网络栈,只保留需要的部分,官方写的是裁剪到原来源码和体积的 0.3%。README 第一句就是:用 Chromium 的网络栈来伪装流量。

NaiveProxy README 开头:用 Chromium 的网络栈伪装流量,以及它针对的四类流量识别手段

数据走的是 HTTPS 代理的 CONNECT 隧道,这是浏览器设置代理时本来就有的功能。从外面看,就是一个 Chrome 在访问一个 HTTPS 网站。

想不被认出来,要过两关

第一关是长相。 你的设备连服务器,发出的第一个包叫客户端问候(Client Hello),里面列着它会用的加密方式、支持的扩展。不同程序列法不同,像指纹一样,这叫 TLS 指纹。很多协议是照着浏览器的样子去模仿这份清单,模仿得再像,也可能有细节对不上;NaiveProxy 发出去的本来就是 Chrome 的清单。

第二关是敲门。 防火墙觉得一台服务器可疑,会自己连过去试探,看它是不是代理,这叫主动探测。README 里给的参考是 2015 年就有人实测过的研究。NaiveProxy 的办法是让服务器门口站着一个真网站,官方叫“应用前置”(application fronting)。

实测一:握手和 Chrome 155 一样

服务端用的是官方推荐的 Caddy(v2.11.7)加 forwardproxy 插件的 naive 分支。我们让三种程序各连三次,在服务器上抓下每一个客户端问候,用 tshark 读出字段:

  • NaiveProxy v154.0.8037.49-4 客户端
  • 正式版 Chrome 155.0.8059.84(打开三次,每次启动发了两个客户端问候)
  • curl 7.68.0(OpenSSL 1.1.1f)

抓包结果:NaiveProxy 和 Chrome 155 的套件、扩展、密钥交换相同,curl 是 31 个套件、固定 512 字节

NaiveProxy v154 Chrome 155 curl 7.68
加密套件 15 个 15 个 31 个
扩展 16 个 16 个 12 个
签名算法(不算 GREASE) 11 个,与 Chrome 相同 11 个 20 个
后量子密钥交换 X25519MLKEM768 有 有 没有
客户端问候长度 1894–1958 字节 1894–1990 字节 每次 512 字节

两边唯一不同的是 GREASE:Chrome 故意往清单里塞的随机值,Chrome 自己每次连也不一样。长度在 1894 到 1990 字节之间跳,也是 Chrome 本身的行为。curl 的清单完全是另一套,放在一起一眼就能分出来。

这也带来一个要求。README 写得很直白:用户应该一直用最新版,这样签名才能和 Chrome 保持一致。

NaiveProxy README:用户应一直使用最新版,以保持签名与 Chrome 一致

Chrome 大约每 4 周升一次大版本,握手可能跟着变。这次我们测的 NaiveProxy 是 154、Chrome 是 155,这两个版本握手没有变化;但客户端要是半年不更新,大家的 Chrome 都换了样子,你反而显眼。

实测二:敲门

同一台服务器开两个端口:20641 是 Caddy 自带的代理,没写防探测;20640 在配置里加了 probe_resistance,后面放了一个诱饵网页“小明的相册”。

实验用的 Caddyfile:basic_auth、hide_ip、hide_via、probe_resistance,最后是 file_server

结果:

敲门结果:20641 端口打开首页、不带密码当代理用都回 407,realm 写着 Caddy Secure Web Proxy;20640 端口不带密码当代理用回 308 跳回首页

  • 20641(没开防探测):像浏览器一样打开首页,回 407;不带密码当代理用,也回 407 Proxy Authentication Required,还附上 realm="Caddy Secure Web Proxy"。等于直接告诉对方:我是代理。
  • 20640(开了防探测):浏览器打开,是一个普通网页;不带密码或密码填错当代理用,回 308 跳回首页,和普通网站没有两样。用户名和密码都对,它才转发。

浏览器打开 20640 端口看到的诱饵网页:小明的相册

自己搭的时候,probe_resistance 这一行千万别漏。

实测三:开头几个包的长度会变

翻墙时你打开的网站本身也是 HTTPS,代理的加密里面又装着一层你和网站之间的握手,这叫 TLS 套 TLS(AnyTLS 那篇专门讲过)。里面那层握手的包长很有规律,外面的人光看长度就可能猜出来。

NaiveProxy 的对策写在 README 的填充协议里:每条流开头的 8 次读写,各加 0 到 255 字节的随机填充,后面不加,免得拖慢速度。另外它把多条连接合进同一条 HTTP/2 连接里跑(多路复用)。

NaiveProxy README 填充协议:每条流开头 kFirstPaddings(8)次读写加填充,填充长度在 0 到 255 之间随机

我们经 NaiveProxy 把同一个网址 https://example.com/ 请求了 6 次。里面装的是同一个 curl 请求,curl 自己的客户端问候固定 512 字节;可服务器看到的外层前几个包,长度每次都不一样:

经 NaiveProxy 请求 6 次,服务器端看到的客户端前 7 个包长度每次都不同

这组实验说明填充在起作用,没有做不加填充的对照,不单独量化效果。

论文怎么说:难认,不等于认不出

2024 年 USENIX Security 会议上,Xue 等研究者发表了一篇专门识别“TLS 套 TLS”的论文,在美国一家运营商的网络里测了多种代理配置。表 3 里:

论文表 3 节选:vless over tls 识别率 0.74830,trojan over tls 0.73705,naiveproxy 0.32772,XTLS-vision 0.51281

  • 没做填充的 VLESS + TLS:74.8%
  • 加了 Vision 填充:51.3%
  • NaiveProxy:32.8%,在同一张表里算低的

论文的解释是多路复用比单纯的随机填充更管用,而 NaiveProxy 默认开着多路复用。但 32.8% 意味着三条里还能认出一条;而且这是在美国做的研究,不代表防火墙的实际做法,防火墙用什么方法没有公开数据。VLESS + REALITY 那篇引用的也是这张表。

自己搭需要什么

  1. 一台海外服务器;
  2. 一个自己的域名;
  3. 443 端口(所有 HTTPS 网站都用它)。

服务端用 Caddy 加作者维护的 forwardproxy naive 分支,官方已经编译好,下载就能用。官方示例配置的关键几行:basic_auth(用户名密码)、hide_ip(转发时不加你的 IP)、hide_via(不加代理标记)、probe_resistance(防探测),最后用 file_server 放一个真网站当门面。有了域名,证书 Caddy 会自己申请。

NaiveProxy README 示例 Caddyfile:forward_proxy 里的 basic_auth、hide_ip、hide_via、probe_resistance

sing-box 文档专门提醒:不要用自签名证书,它会显著改变流量行为,违背 NaiveProxy 抵抗流量分析的初衷。我们的实验用的是临时自签证书,因为只比较客户端问候,它在服务器发证书之前就发出去了,不受影响;正式使用请用域名和正规证书。

sing-box 文档:自签名证书会显著改变流量行为,不应该在生产环境中使用

哪些客户端支持

  • 官方:Windows、macOS、Linux 命令行版,OpenWrt。
  • 安卓:Exclave、husi、NekoBox(README 列出的)。
  • Windows:v2rayN(README 列为第三方图形客户端)。
  • sing-box:1.13.0 起有 NaiveProxy 出站,只能在苹果平台、安卓、Windows 和特定 Linux 构建上用。iPhone 要找基于 sing-box 1.13 以上版本的客户端。

sing-box 文档:NaiveProxy 出站仅在 Apple 平台、Android、Windows 和特定 Linux 构建上可用

不支持的:Clash 系的 mihomo 内核(官方文档的出站列表里没有,2026-10-18 核对),Xray 内核也没有。所以 3x-ui 面板里建不了 NaiveProxy 节点,和3x-ui 完整搭建教程里的方法不是一套。

缺点

  1. 门槛高:要域名、证书、443 端口,比在 3x-ui 里点几下建 VLESS 麻烦。
  2. 要一直追着 Chrome 更新:客户端旧了,指纹就对不上了。
  3. 默认走 TCP:HTTP/2 底下是 TCP,线路丢包多时会主动降速,这点和 VLESS 一样(Hysteria2 和 VLESS 丢包实测)。要转发 UDP,sing-box 里有 udp_over_tcp 选项;也可以试 QUIC 模式。
  4. 客户端少:mihomo 和 Xray 都不支持,iPhone 上的选择尤其少。

和讲过的协议比

  • VLESS + REALITY:借别人网站的证书,不用买域名,3x-ui 里点几下就有。NaiveProxy 要自己的域名和网站,好处是握手本身就是 Chrome,不用模仿。
  • AnyTLS:同样在对付 TLS 套 TLS,靠一张能随时更换的填充表。NaiveProxy 靠 Chrome 本身,加开头的填充和多路复用。

没有一个是隐身衣。同一台服务器两个都开,晚上各连几次,在你那边连得稳、速度好的那个,就是你该用的。

常见问题

NaiveProxy 能让网速变快吗? 不能。它管的是不容易被认出来,快不快看服务器和线路。

机场节点写着 NaiveProxy,是不是更安全? 协议伪装得好,但节点那头能看到什么,和协议没有关系,见VPN 厂商能看到什么。

用它还会被封吗? 有可能。官方说的是抗审查能力强、难被发现,没有说不会被封;服务器的 IP 被封了,换什么协议都没用。

iPhone 能用吗? 要找基于 sing-box 1.13 以上的客户端;常见的 Clash 系客户端用不了。

实验记录

  • 时间:2026 年 10 月 18 日(UTC 19:43–19:46)
  • 服务器:测试服务器(香港,1 核 1 GB,Ubuntu 20.04),临时进程,实验后已删除
  • 服务端:Caddy v2.11.7 + forwardproxy naive 分支(官方编译版 v2.11.7-naive);20640 端口开 probe_resistance,20641 端口不开
  • 客户端:NaiveProxy v154.0.8037.49-4(linux-x64)、Chrome 155.0.8059.84、curl 7.68.0(OpenSSL 1.1.1f)
  • 抓包:tcpdump 只抓发往 20640 的 TLS 握手;tshark 4.6.8 读 ja4、ja4_r、扩展、长度
  • 局限:单台服务器、单个时段;不测速度;识别率只引用论文,没有在真实审查网络里测

资料来源