中继记录与存储的内容
中继的设计目标是:它的日志不能成为”谁在与谁通信”的记录。本页说明当前服务器会写入和保存什么。
在任何级别都不会记录
Section titled “在任何级别都不会记录”- 消息载荷和中继认证标签。
- 密钥:令牌密钥、密钥包和身份密钥。
- 原始帧或十六进制转储的帧,以及协议消息的调试转储。
- HTTP 请求行、请求头和请求路径。
标识符只以标签形式出现
Section titled “标识符只以标签形式出现”电路 ID、客户端 ID、身份密钥和消息 ID 从不以原始形式出现,也没有任何一行日志同时包含两个由身份派生的值。当日志需要区分不同事件时,使用一个 8 字符的标签:用每次启动时随机生成的密钥对该值做带密钥的 BLAKE3 哈希,截取 32 位。标签让开发者能在一次运行内跟踪某条电路,但无法反推,也无法跨重启匹配。标签只出现在 debug 和 trace 级别。
| 级别 | 内容 |
|---|---|
error | 服务器端故障,例如 TLS 初始化失败和证书过期。没有标识符,没有地址。 |
warn | 措辞固定的运行故障:ACME 问题、队列持久化失败、配置提示。客户端可触发的故障(例如格式错误的消息)记录在 debug 级别。没有标识符、地址或客户端提供的文本。 |
info | 启动与配置信息(版本、绑定地址、TLS 模式、限制、中继的固定值)、证书状态,以及开启持久化时队列加载与保存的数量。不涉及任何客户端、电路或数据包。 |
debug | 措辞固定的连接诊断信息:超时、解码失败、未知电路、数据包认证失败、伪装响应。只有在 log_client_ips = true 时才会出现客户端地址。 |
trace | 供开发使用的逐事件流程,只使用标签。生产环境不要使用 trace:即使是标签也会暴露流量模式。 |
默认级别是 info,可以安全地发送到日志聚合系统。
客户端 IP 地址
Section titled “客户端 IP 地址”默认不记录客户端 IP 地址。如需为处理滥用而记录:
[logging]log_client_ips = true # 默认 false这只会在 debug 级别的连接日志中加入地址,绝不会出现在 info、warn 或 error 中,并且仍需 --log-level debug 才能看到。开启后中继会在启动时警告:logging.log_client_ips is enabled: client IPs will appear in debug logs。请把这些日志视为敏感信息,并缩短保留时间。
中继运行时知道什么
Section titled “中继运行时知道什么”中继无法解密消息,但路由需要一些信息,这些信息只保存在内存中:
- 哪些账户在线、何时在线、来自哪个 IP 地址,以及每个在线账户发布的公钥(已在其 TLS 会话上证明);
- 哪两个账户之间有打开的会话,以及它们之间每个数据包的大小档位、时间和方向;
- 在最长十分钟内,哪个账户正在尝试联系哪个账户;等待离线用户的请求会保留一个带密钥的配对标签,直到送达,最长 72 小时;
- 用于按地址上限和公平份额的每个已连接地址的带密钥哈希,在该地址的最后一个连接关闭时删除。
路由状态使用每次重启都会变化的哈希作为键,会话状态会在双方都断开连接后十分钟内丢弃。这些信息都不会写入日志。但运营、扣押或取得运行中中继 root 权限的人,仍能从内存中读出当前在线账户与打开会话的关系图。消息内容仍然端到端加密。
中继存储什么
Section titled “中继存储什么”- 离线队列,默认保存在内存中。 发给离线用户的消息和消息请求只按接收方存放,键是每次重启都会变化的哈希。发送方的身份在加密载荷内部。每条记录只保存载荷、排队时间以及它是否为请求。条目在送达后或
ttl_secs后删除(默认 72 小时;请求最多 72 小时)。除非您开启持久化,否则不会写入磁盘。 - 可选的加密持久化。 设置
[server.offline_queue] persist = true时,队列以加密形式写入persist_path,其密钥位于内存文件系统上,机器重启后即丢失。参见离线队列。 - 中继身份密钥,位于
relay_identity_path,权限为0600。 - ACME 缓存,位于
cache_dir:ACME 账户密钥和证书私钥,文件权限为0600。
升级到协议第 2 版后首次启动时,中继会用零覆盖旧的明文队列文件(message_queues.json,其中保存了发送方和接收方的身份密钥)并将其删除。
送达回执和已读回执像消息一样端到端加密。中继仍可能根据时间推断出回执已发送。
运维检查清单
Section titled “运维检查清单”- 使用
info或warn级别运行。 - 除非正在处理滥用,否则保持
log_client_ips关闭。 - 保持指标端点在回环地址上。它只包含汇总计数器,但没有认证。
- 缩短 journal 保留时间(
journalctl --vacuum-time=7d,或在journald.conf中设置MaxRetentionSec=)。 - 如果使用 TCP 前端,它的日志不在上述保证范围内,除非关闭,否则可能记录客户端地址。
- 除非需要在重启后保留暂存消息,否则保持
[server.offline_queue] persist关闭。