为什么 VPN 一直连着,IPv6 地址却变了
临时地址会按设计轮换,所以两张截图可能不同,路由却没有任何变化。要比较前缀、接口和路由,而不是完整地址。
相隔一小时的两张截图显示了不同的 IPv6 源地址,最直观的解读是隧道泄漏或重新连接了。通常两者都没有发生。主机使用的是临时地址,这是操作系统的一项隐私功能,会按计时器轮换接口标识符。那次比较之所以看起来板上钉钉,只是因为它把一个从来就不稳定的字段当成了前提。
临时地址轮换的到底是什么
临时地址由接口前缀加上主机更换的标识符构成,并带有首选寿命和有效寿命。在有效寿命到期之前,主机会生成一个替代地址,因此两条连接完全可以从不同来源出去。链路本地地址和前缀本身保持不变,网络正是靠这一点仍然认得这台机器。
这种轮换并不会让账户、Cookie 或浏览模式变得匿名。想识别你的站点有 Cookie、登录状态和指纹,而变化着的源地址在这些面前几乎不起作用。轮换只改动报文头里的一个字段,而这个字段从来都不是路径上唯一的标识。
网站只看到一个地址,主机却持有多个
服务器只记录它收到的那次请求的来源,仅此而已。主机可能同时持有多个不同范围和寿命的地址,哪一个胜出取决于地址选择规则和目的地。把网站上的值读成机器的地址,正是这场混乱的起点。同一台主机在同一时刻可以对两个站点表现得像两台机器,只因为每条连接选了不同的地址。
测试时用 ip -6 addr show dev eth0 查看接口:出现多个带寿命的地址,说明轮换本就按设计存在。再问内核会用哪条路由,用 ip -6 route get 2001:db8:10::5,它会把设备以及该目的地的首选源打印出来。
比较前缀、接口和路由,而不是字符串
做 VPN 测试时,真正要问的是报文有没有走隧道出去,这是路由和策略问题。源地址只是它的弱代理:隧道接口上轮换的地址仍然在隧道上。重新连接的隧道通常改变的是前缀或设备,而这些变化不必读完整地址就能看到。
所以要比对被选中的路由、报文离开的接口,以及它携带的前缀。这三者在多次运行之间足够稳定,而每一项变化时含义各不相同。
前缀变了、接口变了,或者通往目的地的路由不再走隧道,这时的变化才有意义。只有接口标识符变了、前缀和设备都没变,那是隐私功能在按预期工作。如果只有标识符移动,那次测试测的是隐私计时器,而不是覆盖范围。在把责任推给隧道之前,先写下三者中究竟是哪一个变了。
不要为了让截图一致就关掉 IPv6
关掉 IPv6 确实能让重复测试一致,但它同时把整整一个地址族从你的隧道本该覆盖的网络里移除了。当策略是承载 IPv6 时,关掉它只是掩盖了覆盖缺口,而不是补上缺口。
如果策略是在支持之前封锁 IPv6,那就明确封锁,并把决定写下来。下一位管理员需要看到「有记录的封锁」和「关掉的协议栈」之间的差别。
该记录什么,一次测试能证明什么
记录 前缀、接口名称、选中的路由、目的地和时间戳,并在旁边写上完整地址。临时地址规范解释了驱动轮换的那些寿命,所以完整地址才是笔记里最不稳定的字段。三次运行中有两个稳定字段一致,比任何单次地址相同都更有说服力。
一次测试只是对一次请求的一次观察。笔记才是把下一次观察变成比较的东西。两者都留着,下一次分歧的代价就只是一眼,而不是一个下午。