Juicity
Juicity 是一种基于 QUIC 的代理协议及其实现,灵感来源于 TUIC。它在 TUIC 的基础上针对 UDP 转发、连接稳定性和客户端兼容性进行了改进。Juicity 于 2023 年 7 月发布,目前由社区维护。
基本信息
| 项目 | 信息 |
|---|---|
| 发布 | 2023.07 |
| 传输层 | QUIC(UDP) |
| 官方实现 | juicity/juicity |
| 许可证 | AGPL-3.0 |
| 生态成熟度 | 小众 / 社区维护 |
核心特性
基于标准 QUIC
Juicity 构建在标准 QUIC 协议之上,要求最低支持 BBR 拥塞控制算法,TLS 版本必须为 1.3 以上,ALPN 标识为 h3。流量从协议层面看与普通 HTTP/3 流量高度相似。
UUID + 密码认证
Juicity 使用 UUID 和密码的组合进行身份认证。认证发生在 QUIC 连接建立阶段,客户端通过单向流发送认证请求,服务端验证通过后才开始处理代理请求。单个 QUIC 连接只需认证一次,其上承载的所有 Stream 共享该认证状态。
客户端 --[QUIC 握手]--> 服务端
客户端 --[单向流:UUID + Token]--> 服务端
客户端 --[Stream 1:代理请求 A]--> 服务端
客户端 --[Stream 2:代理请求 B]--> 服务端
Token 的生成基于 QUIC 连接的 TLS ExportKeyingMaterial,结合 UUID 和密码派生,保证了认证信息与底层连接的绑定。
UDP over Stream
这是 Juicity 相对于 TUIC 的核心改进之一。TUIC 在 udp_relay_mode=native 时,丢包会导致应用层重试(如 DNS 重试),影响体验;而在 quic 模式下,每个 UDP 数据报使用独立的单向流,资源消耗较大。
Juicity 采用 UDP over Stream 方案:同一源地址三元组 <源 IP, 源端口, UDP> 的所有数据报共享同一条 QUIC Stream,兼顾了效率和可靠性:
QUIC 连接
├── Stream 1 → TCP 连接 A(Google)
├── Stream 2 → TCP 连接 B(GitHub)
├── Stream 3 → UDP 流(源 192.168.1.1:12345)
│ ├── [proxy header][len][payload] 数据报 1
│ ├── [proxy header][len][payload] 数据报 2
│ └── [proxy header][len][payload] 数据报 3
└── Stream 4 → UDP 流(源 192.168.1.1:53)
全锥型 NAT 支持
Juicity 的 UDP 实现支持全锥型 NAT(Full Cone),适合需要 NAT 穿透的应用场景(如 P2P 游戏、VoIP)。通过将同一源地址的 UDP 数据报绑定到同一条 Stream,Juicity 能够维护稳定的地址映射。
动态 Stream 管理
QUIC 协议对 maxOpenIncomingStreams 有限制。Juicity 要求客户端维护远端可用 Stream 的动态计数,当可用数量不足时自动建立新的 QUIC 连接。如果客户端无法获取精确的可用 Stream 数量(如底层 QUIC 库不暴露该接口),则在累计打开 30 条 Stream 后创建新连接。
与 TUIC 的对比
Juicity 官方明确表示其设计目标是改进 TUIC 的不足:
| 对比维度 | Juicity | TUIC v5 |
|---|---|---|
| UDP 转发方式 | UDP over Stream | native / quic 可选 |
| 丢包时 UDP 表现 | 较好,共享 Stream | native 模式下较差 |
| 全锥型 NAT | 支持 | 有限支持 |
| Stream 资源消耗 | 较低 | quic 模式下较高 |
| 认证方式 | UUID + Password | UUID + Password |
| 拥塞控制 | BBR(最低要求) | BBR / CUBIC 可选 |
| 传输层 | QUIC(TLS 1.3) | QUIC(TLS 1.3) |
| 需要域名 | 是 | 是 |
| 客户端生态 | 较窄 | 较广 |
| 维护状态 | 社区维护 | 活跃 |
总结: Juicity 在 UDP 处理上有明确的技术改进,但客户端生态不如 TUIC 广泛。如果你主要使用 TCP 代理,TUIC 的客户端支持更好;如果需要高质量的 UDP 转发(如游戏、DNS),Juicity 值得尝试。
与 Hysteria 2 的对比
| 对比维度 | Juicity | Hysteria 2 |
|---|---|---|
| 拥塞控制 | BBR(标准) | Brutal(激进) |
| 高丢包性能 | 较强 | 极强 |
| 带宽占用行为 | 自适应,友好 | 主动占用,可能触发告警 |
| UDP 代理 | UDP over Stream | UDP over QUIC Datagram |
| 端口跳跃 | 不支持 | 支持 |
| 流量伪装 | 标准 QUIC / TLS 1.3 | HTTP/3 + 可选混淆 |
| 客户端支持 | 较窄 | 广 |
优缺点
| 优点 | 缺点 |
|---|---|
| QUIC 传输,在高延迟/高丢包线路上表现好 | 依赖 UDP,在 UDP 封锁的网络中不可用 |
| UDP over Stream 改进了 TUIC 的 UDP 转发问题 | 需要域名和有效的 TLS 证书 |
| 支持全锥型 NAT,适合游戏和 P2P 场景 | 客户端生态较窄,主流客户端支持有限 |
| 标准拥塞控制,对线路友好 | 社区维护,更新节奏不确定 |
| 配置简单 | 文档和教程资源较少 |
| TLS 1.3 内置加密,安全性好 | — |
适用场景
推荐使用 Juicity 的场景:
- 对 UDP 转发质量有较高要求(如游戏加速、DNS 查询)
- 愿意自行测试和排障,接受客户端生态较窄的现状
- 作为 Hysteria 2 / TUIC 的补充或备选方案
- 需要全锥型 NAT 支持的应用场景
不推荐单独依赖 Juicity 的场景:
- 需要广泛客户端支持的用户(优先选择 TUIC 或 Hysteria 2)
- 企业/校园网络可能封锁 UDP 的环境
- 不愿投入时间自行排障的用户
服务端部署
前置条件
- 一台公网 VPS,已开放 UDP 端口(如 443)
- 一个指向服务器 IP 的域名
- 有效的 TLS 证书
安装 Juicity 服务端
从 GitHub Releases 下载预编译二进制文件:
# 查看最新版本并下载
wget https://github.com/juicity/juicity/releases/latest/download/juicity-server-x86_64-linux-musl
chmod +x juicity-server-*
mv juicity-server-* /usr/local/bin/juicity-server
申请 TLS 证书
# 使用 acme.sh 申请 Let's Encrypt 证书
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d your.domain.com --webroot /var/www/html
~/.acme.sh/acme.sh --install-cert -d your.domain.com \
--cert-file /etc/juicity/cert.crt \
--key-file /etc/juicity/private.key \
--reloadcmd "systemctl restart juicity-server"
生成 UUID
cat /proc/sys/kernel/random/uuid
服务端配置文件(/etc/juicity/config.json)
{
"listen": ":443",
"users": {
"00000000-0000-0000-0000-000000000000": "your-strong-password"
},
"certificate": "/etc/juicity/cert.crt",
"private_key": "/etc/juicity/private.key",
"congestion_control": "bbr",
"log_level": "info"
}
配置字段说明:
| 字段 | 说明 |
|---|---|
listen | 监听地址和端口 |
users | 用户列表,键为 UUID,值为密码,支持多用户 |
certificate / private_key | TLS 证书和私钥路径 |
congestion_control | 拥塞控制算法,可选 bbr、cubic、new_reno |
log_level | 日志级别 |
生成证书链哈希(可选)
Juicity 支持 pinned_certchain_sha256,用于固定证书链哈希,防止中间人攻击:
juicity-server generate-certchain-hash /path/to/fullchain_cert.pem
Systemd 服务单元
[Unit]
Description=Juicity Server
After=network.target
[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/juicity-server run -c /etc/juicity/config.json
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable juicity-server
systemctl start juicity-server
systemctl status juicity-server
# 查看日志
journalctl -u juicity-server -f
开放防火墙规则
ufw allow 443/udp
客户端配置参考
Juicity 官方客户端
从 GitHub Releases 下载对应平台的客户端。
最小配置(config.json):
{
"listen": ":1080",
"server": "your.domain.com:443",
"uuid": "00000000-0000-0000-0000-000000000000",
"password": "your-strong-password",
"sni": "your.domain.com",
"allow_insecure": false,
"congestion_control": "bbr",
"log_level": "info"
}
完整配置:
{
"listen": ":1080",
"server": "your.domain.com:443",
"uuid": "00000000-0000-0000-0000-000000000000",
"password": "your-strong-password",
"sni": "your.domain.com",
"allow_insecure": false,
"congestion_control": "bbr",
"log_level": "info",
"pinned_certchain_sha256": "aQc4fdF4Nh1PD6MsCB3eofRyfRz5R8jJ1afgr37ABZs=",
"forward": {
"127.0.0.1:12322": "127.0.0.1:22",
"0.0.0.0:5201/tcp": "127.0.0.1:5201",
"0.0.0.0:5353/udp": "8.8.8.8:53"
}
}
配置字段说明:
| 字段 | 说明 |
|---|---|
listen | 本地 SOCKS5/HTTP 代理监听地址,支持 user:pass@:1080 格式 |
server | 服务端地址和端口 |
uuid | 用户 UUID |
password | 用户密码 |
sni | TLS SNI,当 server 为域名时可省略 |
allow_insecure | 是否跳过证书验证,生产环境应设为 false |
congestion_control | 拥塞控制算法,可选 bbr、cubic、new_reno |
pinned_certchain_sha256 | 固定证书链哈希,增强安全性 |
forward | 端口转发规则,格式:"<本地地址>[/tcp][/udp]": "<远程地址>" |
运行客户端:
./juicity-client run -c config.json
订阅链接格式
juicity://uuid:password@your.domain.com:443?congestion_control=bbr&sni=your.domain.com&allow_insecure=0
dae 客户端
dae 是 Linux 平台的高性能代理客户端,原生支持 Juicity。配置方式参见 dae 文档。
v2rayA
v2rayA 是跨平台的 Web UI 客户端,支持 Juicity。通过 Web 界面导入订阅链接或手动添加节点即可。
客户端支持
| 平台 | 客户端 | 支持状态 |
|---|---|---|
| Windows / macOS / Linux | juicity-client | 支持(官方 CLI) |
| Linux | dae / daed | 支持 |
| Windows / macOS / Linux | v2rayA | 支持 |
| iOS | — | 暂无主流客户端支持 |
| Android | — | 暂无主流客户端支持 |
| Windows | v2rayN | 需确认版本 |
Juicity 的客户端生态远不如 TUIC 和 Hysteria 2。目前主要通过官方 CLI 客户端和 dae 使用,iOS 和 Android 平台暂无主流 GUI 客户端支持。选择 Juicity 前请确认你的平台有可用的客户端。
常见问题
Q:Juicity 和 TUIC 该选哪个?
如果你需要广泛的客户端支持(尤其是 iOS/Android),选 TUIC。如果你主要在 Linux 上使用,且对 UDP 转发质量有较高要求,Juicity 的 UDP over Stream 方案有一定优势。
Q:Juicity 支持多用户吗?
支持。服务端配置的 users 字段可以添加多个 UUID-密码对。
Q:congestion_control 用 bbr 还是 cubic?
推荐 bbr。BBR 在高延迟链路上的表现优于传统 CUBIC,且是 Juicity 的最低要求。
Q:是否可以在没有域名的情况下使用?
不可以。Juicity 要求 TLS 1.3,需要有效的证书和域名。如果无域名,建议使用 VLESS + Reality 方案。
Q:为什么连接后速度很慢?
检查以下几点:
- 服务端和客户端的
congestion_control是否一致 - VPS 是否对 UDP 有限制
- 客户端所在网络是否封锁 UDP
- 尝试更换端口
延伸阅读
- Juicity 项目:github.com/juicity/juicity
- Juicity 协议规范:docs/spec_en.md
- TUIC 协议 — Juicity 的灵感来源
- Hysteria 2 — 更成熟的 QUIC 系协议,高丢包线路首选
- VLESS 协议 — TCP 方向的首选现代协议