WireGuard 握手时间戳究竟告诉了你什么
握手时间不是浏览记录,但它把账号与某个事件联系起来。比较 WireGuard 和 OpenVPN 各自记录了什么,以及精度掩盖了什么。
一行写着“最近一次握手,两分钟前”的记录,看上去是持续活动的证据,其实远没有那么强。它标记的是某个对端最后一次完成的密钥交换;只要流量在跑,密钥就按固定的更新定时器轮换,对端一安静下来也就停了。那个时间能否把某个人和某件事联系起来,取决于旁边存着什么标识符,以及两个系统的时钟。下面说明这条记录在两种最常见实现中的行为,以及读它时容易错在哪里。
两种记录,两种含义
WireGuard 为每个对端保留一个握手时间戳,每次密钥更新都会替换它,另外还有两个方向的字节计数器。OpenVPN 通常记录会话开始、断开连接,以及配置的详细级别所补充的内容,因此记录的单位是会话,而不是密钥交换。
这一差别决定了“没有记录”意味着什么:
| Question | WireGuard handshake | OpenVPN session log |
|---|---|---|
| Did the peer send recently? | Strong hint within the rekey window | Not answered by start time alone |
| Did the peer stop? | Weak, because idle peers also stop rekeying | Only if a disconnect was written |
| What was visited? | Nothing | Nothing |
为什么握手不等于持续使用
只要有数据需要保护,WireGuard 大约每两分钟更新一次密钥,而空闲下来的对端干脆就停了。所以过期的握手可能意味着笔记本在睡眠、用户停下了工作,或者网络丢掉了本该触发下一次交换的包。时间戳只是活动的下界,不是注意力的追踪器。
反向的错误同样容易犯。持续的 keepalive 流量会让空闲设备上的隧道保持温热,于是一小时没人碰过的机器上也可能出现最近的握手。字节计数器在这里有用,因为它们能区分真正发送数据的对端和只交换 keepalive 的对端,也会告诉你哪个方向承载了流量。这些都不揭示目的地、页面或查询。
标识符与时间戳同行
没有账号、公钥或源地址的时间是孤儿。把时间戳与对端身份配对,观察就变得可关联:公钥在地址变化之间保持不变,而源地址可能被运营商地址转换之后的许多用户共享。
这种不对称正是多数隐私讨论忽略的地方。地址看起来匿名,因为它是共享的;密钥看起来技术性,因为它很长;但稳定的标识符是密钥。保留一个字段而丢弃另一个,会改变关联风险,却不改变表面上的精度。
关联本身就是被记录在案的担忧。把连接时间与服务商的登录事件、支持工单或支付记录放在一起,即使从未写下任何目的地,也能把身份与活动关联起来,这就是为什么配对比格式更重要。
跨系统关联需要对时钟保持谨慎
两个报告同一时刻的系统很少精确到秒一致。一个可能在输出中套用了时区偏移,另一个可能跑在差了几秒的时钟上,虚拟机在挂起之后也可能漂移。
在断定两个事件同时发生之前,先把两者换算到同一时区,并检查原始记录里的偏移,而不是显示出来的结果。如果你测量的间隔小于可能的偏差,那就根本谈不上先后。
实用的规则是只保留排障任务所需的精度,不多留。每小时的会话数足以回答可用性问题,而不必保留按账号的历史;聚合结果可以比它来源的原始行保存得久得多。
用命令读记录,而不是靠想象
把你准备推理的字段打印出来,用工具存储的单位,而不是仪表盘渲染的单位。
下面两行显示每个 WireGuard 对端的握手年龄和字节计数器,然后是从 OpenVPN 状态文件里取出的同类材料:
wg show all latest-handshakes
wg show wg0 transfer
cat /run/openvpn/server.status在得出结论之前,把年龄与密钥更新间隔作比较,并把计数器一起读。握手很新而几乎没有传输的对端在交换 keepalive;握手过期而计数器很大的对端则一直忙到停下为止。两行都没有说做过什么,把这一点讲清楚,比暗示时间戳证明了某次访问要准确。