一行写着“最近一次握手,两分钟前”的记录,看上去是持续活动的证据,其实远没有那么强。它标记的是某个对端最后一次完成的密钥交换;只要流量在跑,密钥就按固定的更新定时器轮换,对端一安静下来也就停了。那个时间能否把某个人和某件事联系起来,取决于旁边存着什么标识符,以及两个系统的时钟。下面说明这条记录在两种最常见实现中的行为,以及读它时容易错在哪里。

两种记录,两种含义

WireGuard 为每个对端保留一个握手时间戳,每次密钥更新都会替换它,另外还有两个方向的字节计数器。OpenVPN 通常记录会话开始、断开连接,以及配置的详细级别所补充的内容,因此记录的单位是会话,而不是密钥交换。

这一差别决定了“没有记录”意味着什么:

QuestionWireGuard handshakeOpenVPN session log
Did the peer send recently?Strong hint within the rekey windowNot answered by start time alone
Did the peer stop?Weak, because idle peers also stop rekeyingOnly if a disconnect was written
What was visited?NothingNothing

为什么握手不等于持续使用

只要有数据需要保护,WireGuard 大约每两分钟更新一次密钥,而空闲下来的对端干脆就停了。所以过期的握手可能意味着笔记本在睡眠、用户停下了工作,或者网络丢掉了本该触发下一次交换的包。时间戳只是活动的下界,不是注意力的追踪器。

反向的错误同样容易犯。持续的 keepalive 流量会让空闲设备上的隧道保持温热,于是一小时没人碰过的机器上也可能出现最近的握手。字节计数器在这里有用,因为它们能区分真正发送数据的对端和只交换 keepalive 的对端,也会告诉你哪个方向承载了流量。这些都不揭示目的地、页面或查询。

标识符与时间戳同行

没有账号、公钥或源地址的时间是孤儿。把时间戳与对端身份配对,观察就变得可关联:公钥在地址变化之间保持不变,而源地址可能被运营商地址转换之后的许多用户共享。

这种不对称正是多数隐私讨论忽略的地方。地址看起来匿名,因为它是共享的;密钥看起来技术性,因为它很长;但稳定的标识符是密钥。保留一个字段而丢弃另一个,会改变关联风险,却不改变表面上的精度。

关联本身就是被记录在案的担忧。把连接时间与服务商的登录事件、支持工单或支付记录放在一起,即使从未写下任何目的地,也能把身份与活动关联起来,这就是为什么配对比格式更重要。

跨系统关联需要对时钟保持谨慎

两个报告同一时刻的系统很少精确到秒一致。一个可能在输出中套用了时区偏移,另一个可能跑在差了几秒的时钟上,虚拟机在挂起之后也可能漂移。

在断定两个事件同时发生之前,先把两者换算到同一时区,并检查原始记录里的偏移,而不是显示出来的结果。如果你测量的间隔小于可能的偏差,那就根本谈不上先后。

实用的规则是只保留排障任务所需的精度,不多留。每小时的会话数足以回答可用性问题,而不必保留按账号的历史;聚合结果可以比它来源的原始行保存得久得多。

用命令读记录,而不是靠想象

把你准备推理的字段打印出来,用工具存储的单位,而不是仪表盘渲染的单位。

下面两行显示每个 WireGuard 对端的握手年龄和字节计数器,然后是从 OpenVPN 状态文件里取出的同类材料:

wg show all latest-handshakes
wg show wg0 transfer
cat /run/openvpn/server.status

在得出结论之前,把年龄与密钥更新间隔作比较,并把计数器一起读。握手很新而几乎没有传输的对端在交换 keepalive;握手过期而计数器很大的对端则一直忙到停下为止。两行都没有说做过什么,把这一点讲清楚,比暗示时间戳证明了某次访问要准确。

相关文章