无日志政策:一张字段表胜过一句承诺
快喵VPN 的留存边界由 11 项字段逐条定义:4 类必要字段按最小化留存,7 类行为字段明确不写入。2026 年 8 月的字段评审与 6 月的受控连接复核均未发现偏差项记录。
政策边界:什么才算日志
“无日志”这句话在不同厂商那里指向不同的东西。先把边界说清楚,后面的表才有意义。
行业内对日志的定义至少有三套:一是访问记录(去过哪些站点),二是连接记录(何时连、连了多久、来自哪个地址),三是运行记录(进程报错、心跳、额度结算)。快喵的不留存范围覆盖前两类,第三类中仅保留与计费、并发相关的聚合数值。
三套定义的实际差异
- 访问记录 目标域名、URL、DNS 查询与正文。快喵全部不留存,也不存在可导出的替代形式。
- 连接记录 连接时间、持续时长、来源地址、出口映射。快喵仅在会话内存中维持必要映射,断开即释放。
- 运行记录 额度计数、在线设备数、节点健康度。快喵保留聚合数值,且不与访问行为关联。
- 审计记录 字段变更、阈值调整与偏差项。快喵留存并公开,属于对政策的自我约束而非用户行为记录。
把第三类全部去掉是不现实的:没有额度计数就无法结算,没有在线设备数就无法执行并发限制。因此判断一份政策是否可信,不看它声称不留什么,而看它对“必须留”的部分是否给出了用途、保留期与删除方式三件套。
快喵不记录你访问了什么,只记录你的账号还需要多少额度、当前有几台设备在线;前者是隐私,后者是账务。
必须留存的四类字段
每一项留存都应能被一句话解释:如果不留,会坏掉哪个功能。
快喵的留存字段共 4 类 11 个字段,全部可在账号设置页看到对应解释。留存原则是“账号维度、聚合形态、限期删除”:不与访问行为关联,不逐条留存明细,到期自动删除且不进入备份。
| 字段 | 用途 | 保留期 | 删除方式 | 是否可导出 |
|---|---|---|---|---|
| 账号邮箱 | 登录、找回、安全通知 | 账号存续期间 | 注销后 7 日内删除 | 是 |
| 密码摘要 | 登录校验(Argon2id 摘要) | 账号存续期间 | 注销后 7 日内删除 | 否 |
| 设备标识哈希 | 同时在线数限制、异常登录识别 | 解绑后 30 日 | 到期自动清除 | 是 |
| 套餐与到期时间 | 权益判定 | 账号存续期间 | 注销后 7 日内删除 | 是 |
| 流量计数(字节) | 额度结算与用量展示 | 账期结束后 90 日 | 到期自动清除 | 是 |
| 在线会话数 | 并发控制 | 仅内存,断开即释放 | 随会话结束释放 | 否 |
| 订单号 | 支付对账(不含卡号) | 按支付机构规则 | 由支付机构处理 | 是 |
为什么密码用 Argon2id
密码摘要使用 Argon2id,参数为内存 64 MB、迭代 3 轮、并行度 4,单次校验耗时在测试机上约 62 毫秒。选择内存困难型函数的原因是:即便数据库被整体拖走,GPU 集群对内存困难型摘要的破解成本也远高于对 SHA-256 的暴力枚举成本。
流量计数为什么不算日志
字节计数是与访问行为解耦的:它只知道“这个账号在这个账期用了多少字节”,不知道用在了哪里。技术上它无法被还原为站点清单,因为它不携带目标地址,也不携带时间序列的细粒度分布——快喵按天汇总,而不是按会话记录。
- 汇总粒度 按天汇总一次,不保留会话级明细,单日内的分布无法还原。
- 不含目标 计数字段与目标地址解耦,二者不在同一条记录里,也不存在关联键。
- 不含时间戳序列 只记日期,不记开始与结束时刻,无法推断使用时段。
- 可查看 用户可在账号页看到与后台一致的数值,不存在用户看不到的隐藏计数。
明确不留存的七类字段
这一节的价值不在于列出承诺,而在于说明每项承诺在工程上如何被落实。
不留存不是“没有记录”,而是“没有产生记录的位置”。快喵的做法是把这些字段从数据模型里删掉,而不是写完再删:节点侧不落业务日志,业务库表结构中没有目标地址列,因此也没有可以误写入的字段。
| 字段 | 落实方式 | 可被检查的位置 | 例外 |
|---|---|---|---|
| 访问目标域名 | 库表无此列,节点不解包 | 库表结构与节点配置 | 无 |
| URL 路径与参数 | 隧道内传输,节点不可见 | 两侧抓包对照 | 无 |
| DNS 查询内容 | 解析在隧道内完成,本地不缓存 | 客户端解析配置 | 无 |
| 源 IP 长期存档 | 仅内存 NAT 映射,断开释放 | 节点内存占用与重启行为 | 无 |
| 正文与附件 | 不终止站点 TLS | 抓包确认两侧均为站点密文 | 无 |
| 应用层协议类型 | 不解析端口与协议 | 节点转发队列实现 | 无 |
| 连接时间序列 | 只保留按天汇总的计数 | 库表结构与导出接口 | 计费必需的最小时间戳 |
“没有字段”比“不留存”更强
一件事只有在数据模型里被删掉之后,才真正无法被误记录。快喵把目标地址从库表结构中移除,任何代码路径都无法写入一个不存在的列;这比在写入前加一层判断更可靠,因为判断可以被一次配置或一次紧急排障绕过。
- 结构约束 字段不存在时,误写入会直接报错,而不是悄悄成功。
- 审计友好 审计方只需核对库表结构与实际写入,不必信任代码里的判断分支。
- 版本稳定 字段移除后不会因为“临时需要”被重新加回,任何新增都要走评审。
排障时临时开启详细日志是最常见的漏洞来源。快喵的节点侧没有可开启的详细日志开关,排障只能依赖聚合健康度与客户端本地事件摘要。
从断开到释放的 90 秒
承诺在断开的那一刻开始生效。把这几百毫秒数清楚,比任何形容词都有用。
一次断开涉及四个动作:释放 NAT 映射、销毁会话密钥、写入一条无内容的断开事件、更新聚合在线数。前两个动作在客户端与节点侧同时执行,实测从断开指令发出到映射彻底释放的中位耗时为 0.4 秒,最长不超过 90 秒的上限。
- 指令下发用户点击断开或网络中断被检测到,客户端向节点发送释放请求,超时上限 5 秒。
- 映射释放节点删除该会话的 NAT 表项,地址与端口不再被保留,随之可被其他会话复用。
- 密钥清零客户端进程对密钥内存区执行清零并覆盖一次占位写入,随后释放内存页。
- 事件写入写入一条仅含时间戳与结果码的断开事件,用于健康度统计,不包含目标与会话标识。
- 聚合更新在线会话数减一,按分钟汇总后写入聚合指标,不保留单会话明细。
| 动作 | 目标上限 | 实测中位 | 超限处理 |
|---|---|---|---|
| 释放请求送达 | 5 秒 | 0.3 秒 | 超时后节点侧主动回收 |
| NAT 映射删除 | 1 秒 | 0.1 秒 | 回收任务兜底,最长 90 秒 |
| 密钥清零 | 立即 | 小于 1 毫秒 | 进程退出时操作系统回收 |
| 断开事件写入 | 2 秒 | 0.2 秒 | 失败则丢弃,不重试 |
| 聚合指标更新 | 60 秒 | 按分钟汇总 | 延迟一个周期不影响准确性 |
异常断开的兜底
真实场景里多数断开不是用户点击,而是网络消失或进程被杀。这两种情况下客户端无法发出释放请求,节点只能依赖心跳超时回收:连续 3 次心跳未收到(约 45 秒)即判定会话失效并删除映射。因此 90 秒是目前观察到的最坏情况上限。
- 进程被杀 无法发送释放请求,由心跳超时回收,最坏 90 秒。
- 网络消失 同上,且客户端恢复后会以新会话重新协商,不复用旧映射。
- 设备休眠 心跳暂停被视为断开,唤醒后重新建立会话。
- 节点重启 内存中的映射随进程消失,无需额外清理。
例外情形与处理顺序
没有例外的政策不可信,没有边界的例外同样不可信。
快喵承认两类例外:支付合规所需的订单信息,以及安全事件处置所需的攻击特征。两者都有明确的处理顺序与可查记录,且都不得扩展到访问行为。政策文本与实现之间的偏差会被列为审计偏差项,而不是被解释成“业务需要”。
| 例外类型 | 涉及字段 | 处理主体 | 保留上限 | 禁止扩展到 |
|---|---|---|---|---|
| 支付合规 | 订单号、金额、支付渠道 | 第三方支付机构 | 按机构规则,本站不存卡号 | 访问目标与设备指纹 |
| 安全事件 | 攻击特征(源地址段、时间窗) | 安全团队 | 事件关闭后 30 日 | 正常用户的访问记录 |
| 账号争议 | 登录时间、设备哈希 | 客服与风控 | 争议关闭后 30 日 | 浏览内容与目标域名 |
| 司法调阅 | 仅可提供表 1 所列字段 | 法务 | 按调阅文书 | 表 2 所列任何字段 |
处理顺序
- 最小化先确认诉求能否用聚合数据满足,能用聚合就不用明细。
- 限范围明细只在必要时间窗与必要字段内提供,超出部分拒绝。
- 双人复核任何明细导出需两名成员复核并留记录,单人无法完成。
- 留痕公示处理记录进入年度透明度统计,按类别计数公开,不含个案细节。
第四条是这套机制的关键:如果例外处理完全不可见,它就会在几年内膨胀成事实上的常规做法。按类别计数公开,既能证明例外被使用过,也能让外界看出使用频率是否异常。
年度统计按类别给出次数,不给个案细节,也不给时间精确到时。这类统计目前仅覆盖表 1 字段,如果你在政策文本中发现与之不符的表述,请通过安全邮箱指出。
第三方与传输链
政策只约束自己,链路上的其他人需要单独交代。
快喵链路上的第三方共有四处:支付机构、邮件服务、CDN 与云主机。前两者会接触到账号标识,后两者只承载静态资源与节点流量,不接触账号数据。四处都不接收访问目标,也都不接收会话密钥。
| 第三方 | 接触的数据 | 不接触的数据 | 留存责任 | 用户可否拒绝 |
|---|---|---|---|---|
| 支付机构 | 订单号、金额、支付渠道 | 访问目标、设备指纹 | 按机构规则 | 不可(支付必需) |
| 邮件服务 | 账号邮箱、通知内容 | 访问目标、会话 | 按服务商规则 | 可(关闭通知邮件) |
| CDN | 静态资源请求 | 账号数据、隧道流量 | 按服务商规则 | 不可(页面加载必需) |
| 云主机 | 节点流量密文 | 正文、密钥、目标明文 | 不落业务日志 | 不可(服务必需) |
另一个常被忽略的第三方是操作系统本身:系统更新、崩溃上报与输入法都可能独立联网。快喵对这些流量不做拦截也不做代理,因为越权接管会带来更大的风险;用户若需要,可以在分流规则里把这些进程显式指向隧道,客户端只提供能力,不替用户决定。
为什么云主机不算“看到你的流量”
节点运行在云主机上,云厂商在物理层可以看到进出网卡的字节流,但看到的是隧道密文与站点 TLS 密文两层封装后的结果,既无会话密钥也无站点私钥。这一点与“云厂商能看到你的浏览内容”有本质区别,但也不能说完全没有接触面——流量元数据(时间、字节量)在物理层客观存在。
- 可见 网卡层面的字节流、时间与字节量,属于任何网络服务都无法消除的元数据。
- 不可见 正文、目标域名、DNS 查询与会话密钥,均由两层加密覆盖。
- 减缓措施 节点分散在多个云厂商,单一日志源无法还原完整路径。
- 不作承诺 不宣称对物理层元数据完全免疫,只说明其不进入业务库。
读者核验方法
一份政策如果不提供核验路径,就只能靠信任。以下四步任何人都可以自行完成。
核验的目标不是证明厂商在说谎,而是确认承诺与可观察行为之间没有明显偏差。四步中前三步不需要任何特殊工具,第四步需要一点耐心:等待账期结束后对照用量页面与邮件通知。
四步核验
| 步骤 | 操作方法 | 判定标准 | 常见误判 |
|---|---|---|---|
| 1 抓包 | 在客户端机器上用系统工具抓包,观察是否有明文目标 | 目标地址不以明文出现 | 把隧道头误认为目标 |
| 2 查用量 | 对照账号页显示的字节数与本地统计 | 两者差异在 1% 以内 | 把协议开销算作差异 |
| 3 查导出 | 尝试导出账号数据,看包含哪些字段 | 仅含表 1 字段 | 把订单号当作行为记录 |
| 4 看通知 | 等待账期结束,核对用量通知内容 | 通知不含任何访问目标 | 把邮件正文当政策原文 |
核验时的三个注意
- 区分层级 物理层元数据与业务库记录是两件事,前者无法消除,后者才是政策对象。
- 区分时间 断开后的释放有上限,应在断开 2 分钟后再检查,而不是立刻下结论。
- 区分版本 政策文本会随版本更新,核验结论应标明对应的客户端与文档版本。
- 保留证据 核验记录建议包含观察位置、时间戳与结论,便于后续比对。
附录:字段表与自查
本节把字段表、删除时限与自查顺序集中列出,便于一次性核对。
关键数值与来源
下表把本页出现的数值与其采集条件并列列出,便于逐项核对。同一指标在不同条件下可能变化,引用时建议连同条件与样本量一起引用,否则数字会失真。
| 项目 | 数值与表述 | 采集条件与来源 |
|---|---|---|
| 断开释放耗时 | 断开指令到映射彻底释放的中位耗时 0.4 秒 | 来源:2026-09 埋点统计,样本 1,842 次 |
| 映射回收上限 | 异常断开依赖心跳超时回收,最坏 90 秒 | 条件:连续 3 次心跳未收到,约 45 秒判定 |
| 密码校验耗时 | Argon2id 单次校验耗时约 62 毫秒 | 条件:内存 64 MB、迭代 3 轮、并行度 4 |
| 留存字段数 | 当前版本留存字段共 11 项 | 依据:2026-08-14 字段评审记录 |
| 计数保留期 | 流量计数在账期结束后保留 90 日 | 依据:政策文本第 4 节执行口径 |
| 设备标识清除 | 设备解绑后 30 日内清除哈希值 | 来源:定时任务日志核对结果 |
术语表
- 留存字段
- 为了功能可用而必须保存的字段,必须给出用途、保留期与删除方式。
- 行为字段
- 描述用户访问行为的字段,本政策明确不写入,包括目标域名与正文。
- 聚合指标
- 按时间窗汇总的数值,无法还原到单个会话,用于健康度与额度统计。
- NAT 映射
- 把源地址替换为节点地址的会话级表项,仅存于内存,断开即释放。
- 心跳超时
- 连续 3 次未收到心跳即判定会话失效,约 45 秒,是异常断开的判定依据。
- 字段评审
- 新增或变更留存字段前的强制评审,未通过不得上线。
- 受控连接复核
- 在隔离环境抓取业务库写入,核对是否与字段表一致的方法。
- 透明度统计
- 按类别计数公开的例外处理记录,不含个案细节。
删除时限速查
| 数据类别 | 触发事件 | 删除时限 | 执行方 |
|---|---|---|---|
| 账号与摘要 | 用户注销 | 7 日内 | 后台定时任务 |
| 设备标识哈希 | 设备解绑 | 30 日 | 后台定时任务 |
| 流量计数 | 账期结束 | 90 日 | 后台定时任务 |
| 聚合在线数 | 按分钟汇总 | 保留 13 个月 | 后台定时任务 |
| 断开事件 | 写入即不可延期 | 90 日 | 后台定时任务 |
| 事件摘要(本地) | 用户导出或到期 | 7 日 | 客户端本机清理 |
自查清单
- 确认版本记录客户端版本与政策文本版本号,两者应能对应到同一发布批次。
- 核对字段把表 1 与账号数据导出结果逐项比对,多出的字段即为偏差。
- 核对不留存用抓包确认目标地址不以明文出现,用导出确认结果中无目标清单。
- 核对删除注销一个测试账号,7 日后尝试登录,应提示账号不存在。
本章字段与时限来自 2026-08-14 字段评审通过的版本;如实际行为与此不符,以库表结构与导出接口的实际返回为准,并通过安全邮箱反馈。