故障排查
按“配置 → 构建能力 → 监听器 → 控制面 → 出站 → 事件投递”的顺序检查,可以避免只盯着最后一条错误。
配置无法通过校验
zero validate config.json重点看错误中的字段路径:
- 未知字段:检查拼写和当前版本文档;
- 引用不存在:检查 outbound、group、rule set 和 tag;
- 协议私有值无效:检查 UUID、密码、cipher、密钥和证书;
- 文件路径失败:相对路径以主配置目录为基准;
- 端口冲突:同一配置内重复监听会在启动前被拒绝。
更多例子见配置错误处理。
提示协议或能力未编译
查看二进制:
zero build-info如果 features 中没有配置引用的协议或能力,重新构建。例如:
cargo build --release --features connector,grpc-api不要因为源码目录里存在某个协议,就假定当前二进制已经包含它。
listener 启动或热更新失败
检查:
- 地址是否属于当前主机;
- 端口是否被其他进程占用;
- 当前用户是否有绑定端口的权限;
- 证书、规则文件和状态目录是否可访问;
- 热更新错误是否明确表示已恢复上一份配置。
config.apply 失败后先查询状态,确认旧 listener 是否恢复,再提交新的候选配置。
TUN 无法启动或启动后断网
Zero Core 0.0.1 会自动协调 Windows、Linux 和 macOS 的 TUN 捕获路由,并将代理出站绑定到当前物理 underlay egress。出现问题时先区分“创建 TUN 失败”和“路由已经接管但出口不可用”。
依次检查:
- 当前进程是否具有创建虚拟网卡和修改系统路由所需的管理员/root 权限;
runtime.tun.addr、secondary_addr和 MTU 是否有效,双栈主机是否确实需要dual_stack: true;strict_route: true时是否因为任一路由安装失败而主动回滚;- 主机物理默认路由是否在 TUN 启动后发生切换,例如 Wi-Fi、有线网络或 VPN 切换;
- 日志中是否存在 underlay、route reconcile、TUN device 或权限相关错误。
Windows 官方发布产物已经携带 Wintun 运行组件。使用官方压缩包时通常不需要另外下载 DLL;如果日志明确提示权限失败,应先以管理员权限运行,而不是把权限错误误判为缺少配置。自行重新打包 Zero 时仍要确认 Wintun 组件被一并分发。
macOS 会保留物理出口的 scoped route 语义;Linux/macOS/Windows 都会在默认出口变化后重新协调捕获路由。升级到该版本后不建议继续依赖为每个代理服务器手工添加静态 host route 来避免 TUN 回环。
如果通过控制面关闭 TUN,tun.stop 必须发送标准空对象参数:{"method":"tun.stop","params":{}}。
CLI 找不到运行中的 Zero
CLI 默认连接:
- Linux/macOS:
~/.zero/control.sock - Windows:
\\.\pipe\zero-control
如果运行时使用了自定义路径,CLI 也要传同一个路径:
zero status --socket /run/zero/control.sock还应确认 Zero 进程仍在运行,以及当前用户有权限访问 socket 或 Named Pipe。
HTTP 返回 401 或 403
- 确认环境变量已经在 Zero 进程启动前设置;
- 使用
Authorization: Bearer <token>或X-Zero-Api-Key: <token>; - 不要把 shell 变量名当成实际 token 发送;
- 检查反向代理是否保留认证 header。
远程明文 HTTP 即使认证成功也不会加密 token,必须使用 TLS 代理、VPN 或可信通道。
gRPC 无法跨主机启动
非 loopback 明文 gRPC 默认 fail-closed。选择一种方案:
- 配置 Zero 原生 TLS;
- 配置 mTLS;
- 在可信代理/VPN 后显式设置
allow_insecure_remote: true。
如果关闭 bearer_auth,远程访问必须由 mTLS 认证。详见保护控制接口。
代理可以连接但目标不可用
按层检查:
zero flows是否出现请求;zero events是否出现flow.routed和失败事件;- 当前 mode、selector 和 route.final 指向哪里;
- 域名、SNI、证书和协议凭证是否匹配;
- UDP 请求是否使用了当前协议支持的路径;
- 中继链中的每一跳是否可达。
如果只有经 HTTP forward proxy 的明文 HTTP 请求异常,而 HTTPS CONNECT 正常,先确认使用 Zero Core 0.0.1 的完整构建,并核对 HTTP 请求解析和转发日志。仍可稳定复现时,保留原始请求边界、构建信息和 flow 日志报告问题。
先使用快速开始的本地 direct 配置确认入站正常,再逐步加入真实代理出站。
Connector 一直积压
查询:
zero connector state --json config.json或:
curl \
-H "Authorization: Bearer $ZERO_API_KEY" \
http://127.0.0.1:9090/api/v1/sinks检查:
- URL 是否是接收端提供的完整地址;
- HTTPS 证书是否有效;
- 接收端是否在持久化后返回
2xx; 429/5xx是否持续;- outbox 目录是否可写;
write_blocked是否因磁盘保留水位触发;replay_gaps是否需要外部账本对账。
一个 sink 故障不应阻塞其他 sink。如果健康 sink 也停止,检查 EventDispatcher 是否启动以及二进制是否包含 connector。
仍无法定位
保存以下信息再报告问题:
zero build-infozero status --jsonzero validate config.json的完整错误- 相关日志时间段
- 已脱敏的配置
- 重现步骤和预期结果
不要提交 API key、Webhook header、协议密码、UUID、私钥或证书私钥正文。

