日志与错误消息
所有消息都走 nginx 的 error_log,前缀固定为 cfd_tunnel:;块隧道再带一段 [名字] 或 [#序号]。
级别约定
| 级别 | 什么时候 |
|---|---|
| NOTICE | 正常生命周期:注册成功、快速隧道地址、来源地址生效、混合模式说明 |
| WARN | 可继续但值得注意:路径超长不做规则匹配、remote_config 混合模式提示 |
| ERR | 失败:凭据读取/解析失败、连接边缘失败、provisioning 失败、裸 TCP 流被丢弃、注入目标不存在 |
| INFO | 只有 cfd_tunnel_verbose on 才有:协议细节 |
成功路径的消息
| 消息(片段) | 级别 | 含义 |
|---|---|---|
已注册到边缘(location=…),注入目标 … | NOTICE | 注册成功,location 是边缘地址,注入目标是解析后的 listen |
快速隧道临时地址(重启即变)https://… | NOTICE | 临时隧道申请成功;cfd-quick-url 就是抓这一行 |
快速隧道模式(quick on):只有 0 号 worker … | NOTICE | 说明 quick tunnel 只由 0 号 worker 建立 |
注入连接的来源地址 = …(默认是 127.0.0.1) + 配套 set_real_ip_from 写法 | NOTICE | 配了 inject_source_addr 时的启动说明 |
已应用远程配置 version=…(N 条规则;…) | NOTICE | 边缘下发的配置被接受 |
失败路径的消息
| 消息(片段) | 原因 | 处置 |
|---|---|---|
读取凭据 … 失败 | 文件不存在或 worker 用户读不到 | 权限 / 路径 |
token 不是合法的 base64 | 内联 token 带空白、缺 = 填充、用了 URL-safe 字符 | 见 凭据 |
token 解出来不是 JSON | 解出来的字节不是 JSON 对象 | 那是别的 base64,不是 token |
token 里的 t 不是合法 uuid / s 不是合法的 base64 | 字段内容坏 | 重新从控制台复制 |
token 带 endpoint/region | token 有 e | 本模块只连一个 cfd_tunnel_edge |
连接边缘 … 失败 | DNS / TCP / TLS / 代理 | 看 verbose 细节行 |
provisioning 失败 | quick service 不可达 / 返回非 200 / ALPN 不是 h2 | 检查网络与 cfd_tunnel_quick_service |
裸 TCP 隧道流被丢弃 | 流头带 Cf-Cloudflared-Proxy-Src | 这是定案行为,不是 bug |
注入目标 … 不存在 / 有歧义 | inject_listen 指不到唯一 listen | 改配置 |
远程配置 version=… 被拒绝:… | 内层规则非法(含不支持的正则语法),旧规则表不动 | 看日志里的原因字符串,改 dashboard 的 ingress |
收到远程配置 version=…,但当前已应用 … | 版本没变大,整个忽略(与 cloudflared 一致) | 不需要处理 |
抓消息的几条命令
bash
# 最近 20 条模块日志
grep -E 'cfd_tunnel' /var/log/nginx/error.log | tail -20
# 只看失败
grep -E '\[error\].*cfd_tunnel' /var/log/nginx/error.log | tail -20
# 只看快速隧道地址
grep -o '快速隧道临时地址(重启即变)https://[^ ]*' /var/log/nginx/error.log | tail -1
# 只要某条块隧道
grep 'cfd_tunnel: \[edge-a\]' /var/log/nginx/error.log | tail -20日志里没有秘密
token 与 secret 从不写进日志 —— 只打来源、字节数与账号标签。贴日志求助是安全的。