故障排查
按“配置 → 构建能力 → 监听器 → 控制面 → 出站 → 事件投递”的顺序检查,可以避免只盯着最后一条错误。
配置无法通过校验
bash
zero validate config.json重点看错误中的字段路径:
- 未知字段:检查拼写和当前版本文档;
- 引用不存在:检查 outbound、group、rule set 和 tag;
- 协议私有值无效:检查 UUID、密码、cipher、密钥和证书;
- 文件路径失败:相对路径以主配置目录为基准;
- 端口冲突:同一配置内重复监听会在启动前被拒绝。
更多例子见配置错误处理。
提示协议或能力未编译
查看二进制:
bash
zero build-info如果 features 中没有配置引用的协议或能力,重新构建。例如:
bash
cargo build --release --features connector,grpc-api不要因为源码目录里存在某个协议,就假定当前二进制已经包含它。
listener 启动或热更新失败
检查:
- 地址是否属于当前主机;
- 端口是否被其他进程占用;
- 当前用户是否有绑定端口的权限;
- 证书、规则文件和状态目录是否可访问;
- 热更新错误是否明确表示已恢复上一份配置。
config.apply 失败后先查询状态,确认旧 listener 是否恢复,再提交新的候选配置。
CLI 找不到运行中的 Zero
CLI 默认连接:
- Linux/macOS:
~/.zero/control.sock - Windows:
\\.\pipe\zero-control
如果运行时使用了自定义路径,CLI 也要传同一个路径:
bash
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 请求是否使用了当前协议支持的路径;
- 中继链中的每一跳是否可达。
先使用快速开始的本地 direct 配置确认入站正常,再逐步加入真实代理出站。
Connector 一直积压
查询:
bash
zero connector state --json config.json或:
bash
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、私钥或证书私钥正文。