本文最后更新于 2026 年 5 月 14 日
本文以 Debian 13 为例,介绍如何使用 sing-box 搭建 NaiveProxy 兼容服务端,并在客户端使用 sing-box 的 naive outbound 连接。本文同样适用于 Ubuntu 24.04 及以上系统。
本方案有以下特点:
- 服务端与客户端均使用 sing-box,无需 Caddy、Nginx、HAProxy 或 Go 编译环境
- 使用 sing-box 内置 ACME DNS-01 自动申请和续签真实 TLS 证书,无需开放 TCP 80
- 服务端同时监听 TCP 443 与 UDP 443,支持 HTTP/2 与 HTTP/3;客户端默认使用 HTTP/3
- 两端均为 sing-box 时可启用 UDP over TCP,兼顾 UDP 应用兼容性
- DNS 记录使用 Cloudflare 托管时必须保持 DNS only / 灰云,不要开启橙云代理
注:请先参照 Debian & Ubuntu 服务器的初始化配置 一文对服务器进行各种必要的配置。本文以 sammy 用户为例,并默认已按初始化配置文章对服务器进行了配置。
背景与原理
整体架构
1 | 客户端 sing-box |
NaiveProxy 的设计目标是将代理流量伪装成普通浏览器与 Web 服务器之间的 HTTP/2 或 HTTP/3 流量。sing-box 的 naive inbound / outbound 实现了兼容 NaiveProxy 的服务端与客户端。
需要注意:sing-box 的 Naive inbound 是纯代理入口,没有 Caddy forwardproxy 那样的伪装站 fallback。浏览器直接访问 https://naive.example.com 不一定显示正常网页。若强依赖伪装站 fallback,需要另行评估 Caddy forwardproxy 或 HAProxy 方案;本文不使用它们。
关于 HTTP/3
本文默认客户端启用 HTTP/3 / QUIC:
1 | "quic": true |
HTTP/3 更接近现代 Chrome 访问大量网站时的网络行为,在移动网络、跨国链路或丢包网络下也可能表现更好。但 H3 依赖 UDP 443,如果本地网络或 VPS 商家对 UDP 限速、QoS 或阻断,表现可能不如 H2。遇到连接失败、速度波动或间歇性断流时,删除客户端中的 "quic": true 即可回退到 HTTP/2。
本方案不适用的场景
- 必须隐藏 VPS 真实 IP 的场景
- 必须通过 Cloudflare Tunnel / CDN 的场景
- 必须让浏览器直接访问代理域名显示伪装站的场景
- 无法开放公网 TCP 443 与 UDP 443 的 NAT VPS 场景
准备工作
所需资源
- 一台 VPS,拥有公网 IPv4,推荐同时有 IPv6
- 一个域名,NS 托管到 Cloudflare
- 一个 Cloudflare API Token,用于 DNS-01 签发证书
- 客户端设备,需使用支持 sing-box Naive outbound 的客户端或官方 sing-box 命令行版本
下文假设域名为 example.com,Naive 服务使用子域名:
1 | naive.example.com |
请根据实际情况替换。
DNS 配置
在 Cloudflare DNS 中添加记录:
| 类型 | 名称 | 内容 | 代理状态 |
|---|---|---|---|
| A | naive | VPS IPv4 地址 | DNS only |
| AAAA | naive | VPS IPv6 地址,可选 | DNS only |
务必确认是灰云 DNS only,不是橙云 Proxied。
等待 DNS 生效后,在本地终端检查:
1 | dig naive.example.com A +short |
返回结果应为 VPS 的真实 IP。
创建 Cloudflare API Token
进入 Cloudflare Dashboard → My Profile → API Tokens → Create Token,创建自定义 Token:
| 项目 | 值 |
|---|---|
| Permissions | Zone - DNS - Edit |
| Zone Resources | 仅选择当前域名 |
sing-box 的 Cloudflare DNS-01 provider 支持只填写 api_token。zone_token 是可选项,用于额外提供 Zone:Read 权限;通常不需要。
安装基本工具
1 | sudo apt update && sudo apt install curl vim wget ca-certificates openssl -y |
防火墙放行端口
本文使用 DNS-01 签发证书,因此不需要开放 TCP 80。只放行 443:
1 | sudo ufw allow 443/tcp |
TCP 443 用于 HTTP/2 / HTTPS,UDP 443 用于 HTTP/3 / QUIC。
安装 sing-box
sing-box 官方提供 APT 仓库,推荐优先使用此方式,便于后续升级。
1 | sudo mkdir -p /etc/apt/keyrings && |
验证版本:
1 | sing-box version |
截至 2026 年 5 月,建议使用 1.13 系列稳定版。1.14 仍处于 alpha 阶段,配置迁移可等稳定版发布后再处理。
服务端配置
生成用户名与密码
用户名可以使用普通字符串,例如:
1 | sammy |
密码建议使用随机字符串:
1 | openssl rand -base64 24 |
输出示例:
1 | vJ0wP0s8j3QLg2Y+Qd7mP2F9Y9YlDLJ3 |
下文假设:
1 | username = sammy |
请替换为自己的值。
sing-box 配置
编辑 /etc/sing-box/config.json:
1 | sudo vim /etc/sing-box/config.json |
写入以下配置,注意替换域名、邮箱、Cloudflare Token、用户名与密码:
1 | { |
限制配置权限:
1 | sudo chown root:root /etc/sing-box/config.json |
关键字段说明
inbounds[].type:设为 naive,启用 NaiveProxy 兼容服务端。
listen:示例使用 ::,通常可同时监听 IPv6 与 IPv4。若你的系统没有 IPv6,或 ss 检查发现只监听 IPv6,可改为 0.0.0.0。
network:本文不写该字段。sing-box 文档说明 network 可为 tcp 或 udp,为空时同时监听 TCP 与 UDP。
quic_congestion_control:设为 bbr。这也是 Chromium / QUICHE 默认使用的 QUIC 拥塞控制。
tls.acme.dns01_challenge:使用 Cloudflare DNS-01 签发证书。配置 DNS-01 后不需要开放 80,也不需要额外运行 acme.sh。
tls.alpn:同时提供 h3 与 h2。客户端默认使用 H3,必要时可回退 H2。
检查并启动
1 | sudo sing-box check -c /etc/sing-box/config.json |
查看状态:
1 | sudo systemctl status sing-box |
首次启动时,sing-box 会通过 Cloudflare DNS-01 申请证书。如果失败,优先检查 DNS 是否为灰云、Token 权限是否为当前域名的 Zone - DNS - Edit、域名与邮箱是否填写正确。
验证服务端
检查监听端口:
1 | sudo ss -tlnp | grep ':443' |
正常情况下,TCP 443 与 UDP 443 都应由 sing-box 监听。
确认 TLS 与 HTTP/2:
1 | openssl s_client -connect naive.example.com:443 -servername naive.example.com -alpn h2 -brief |
如果能看到证书验证通过,并且 ALPN 协商出 h2,说明 TLS 与 H2 基本正常。H3 是否可用主要看 UDP 443 是否可达,客户端实际连接更有参考价值。
注意:浏览器直接访问 https://naive.example.com 不显示正常网页是预期现象。sing-box naive inbound 没有伪装站 fallback。
客户端配置
sing-box 的 Naive outbound 从 1.13.0 起加入。官方说明中,Naive outbound 只在 Apple platforms、Android、Windows 和部分 Linux 构建中可用。
Linux 客户端如通过 sing-box 官方 APT 仓库安装,通常无需手动处理 Cronet 依赖。只有手动下载官方 release 或使用第三方构建时,才需要确认该构建支持 Naive outbound,并能正确加载 libcronet.so。
以下为客户端示例配置,国内网站直连,其他流量走 Naive。两端均为 sing-box,因此默认开启 UDP over TCP v2。
1 | { |
客户端关键字段说明
outbounds[].type:设为 naive,表示使用 NaiveProxy outbound。
server:填写域名 naive.example.com。如果需要使用 IP 直连,也可以把这里改成 VPS IP,但 tls.server_name 仍应保持域名。
username / password:必须与服务端 users 中的配置一致。
insecure_concurrency:保持 0。多个并发隧道可能提升吞吐,但会增加流量分析特征,不建议默认开启。
udp_over_tcp:启用 UoT v2,用于承载 UDP 流量。两端都是 sing-box 时建议开启。
quic:设为 true,使用 HTTP/3 / QUIC。若当前网络 UDP 443 不稳定,删除该字段即可回退到 HTTP/2。
tls.server_name:用于证书校验和 TLS SNI。必须与证书域名一致。
Naive outbound 的 TLS 配置不要像 VLESS 那样堆 utls、alpn、fingerprint 等字段。Naive outbound 的核心是 Cronet / Chromium 网络栈本身,和普通 sing-box TLS outbound 的配置思路不同。
隐蔽性评估
检测者视角大致如下:
| 检测维度 | 看到的内容 |
|---|---|
| 连接目标 IP | VPS 真实 IP |
| SNI | naive.example.com |
| 证书 | Let’s Encrypt 等公开 CA 签发的真实证书 |
| 传输协议 | HTTP/3 over QUIC,或回退 HTTP/2 over TLS |
| 代理语义 | HTTP CONNECT |
| 浏览器直接访问 | 不显示伪装站 |
| 源站隐藏 | 不隐藏 |
Naive 仍然存在 TLS-in-TLS 特征,因为用户访问 HTTPS 网站时,内层 HTTPS 流量会被封装在外层 HTTPS CONNECT 隧道中。Naive 的 padding 能缓解部分长度特征,但不能让 TLS-in-TLS 现象完全消失。
简单理解:
| 目标 | 更适合的方案 |
|---|---|
| 隐藏源站 IP | VLESS + HTTPUpgrade / WS / gRPC + Cloudflare Tunnel |
| 直连、低延迟、Chrome/Cronet 特征 | NaiveProxy / sing-box naive |
| 减少 TLS-in-TLS 特征 | AnyTLS + REALITY 或 VLESS + Vision + REALITY |
| 需要伪装站 fallback | Caddy forwardproxy 或 HAProxy 方案 |
| 需要完整 UDP 代理 | Hysteria2 / TUIC 等方案 |
维护与排查
更新 sing-box
1 | sudo apt update |
查看版本:
1 | sing-box version |
查看证书与续签状态
sing-box 会自动续签 ACME 证书。可检查最近日志:
1 | sudo journalctl -u sing-box --since "7 days ago" --no-pager | grep -i -E 'acme|certificate|renew' |
也可以外部检查证书有效期:
1 | echo | openssl s_client -servername naive.example.com -connect naive.example.com:443 2>/dev/null \ |
定期轮换密码
建议每 3-6 个月轮换一次密码:
1 | openssl rand -base64 24 |
然后同时更新服务端与客户端配置:
1 | sudo vim /etc/sing-box/config.json |
常见排查
- ACME 证书签发失败:确认 DNS 记录为灰云,Cloudflare Token 有当前域名的
Zone - DNS - Edit权限,域名解析已生效。 - TCP/H2 可用,H3 不可用:检查 UDP 443 是否放行,VPS 商家和本地网络是否限制 UDP。无法解决时删除客户端
"quic": true回退 H2。 - 客户端提示证书错误:检查
tls.server_name是否与证书域名一致。 - Linux 客户端提示 Naive outbound 不可用:确认使用包含 Cronet 的 sing-box 构建,并且
libcronet.so能被加载。 - 浏览器访问域名不是正常网站:这是 sing-box native naive inbound 的预期现象,不代表代理不可用。
- 部分 UDP 应用异常:确认客户端
udp_over_tcp已启用;若仍不稳定,说明该应用更适合 Hysteria2 / TUIC 等原生 UDP 方案。
升级至 sing-box 1.14 后的调整
本文配置以 sing-box 1.13 稳定版为准。1.14.0 起,TLS 内联 acme 配置迁移为 certificate_providers。等 1.14 稳定版发布并确认兼容后,可按官方 Migration 文档迁移。
References
sing-box - ACME Certificate Provider