你的 VPN 是承载 IPv6,还是只连到了服务器?
能到 IPv6 不等于承载 IPv6。检查两个协议族,在承载与封堵之间做选择,并让终止开关覆盖同样的范围。
只测 IPv4 的泄漏检测结果干净,IPv6 检测却暴露出你的家庭地址,而隧道名义上是连通的。这种组合在双栈网络上很常见,因为 VPN 只改变了其中一个协议族的路径,另一个原封不动。外层隧道与隧道内的流量是两个彼此独立的地址决策。测其中一个,说明不了另一个。
既要看客户端报告了什么,也要看请求实际用了哪个协议族,因为一个主机名可能同时返回两类答案。
两个协议族,两条不同的路径
操作系统为每个地址族各维护一张路由表。为 IPv4 装一条默认路由,并不会为 IPv6 装一条;一个能通过 IPv4 到达的隧道端点,也说明不了 IPv6 流量是否会进入它。当隧道里没有 IPv6 默认路由时,主机会用上它手头任何一条 IPv6 路径,而那往往是物理链路。从应用的角度看,这条连接就是直连。
同时返回 A 和 AAAA 记录的主机名让这件事更难看清,因为应用可能以不同顺序尝试两个协议族。请求成功并不能证明它走了哪条路径。要用能标明测的是哪个协议族的检测。
能到服务器,不等于承载流量
服务商说的支持 IPv6,可能指好几种不同的能力。端点可以接受 IPv6 连接,而隧道里仍然只承载 IPv4。隧道可以承载 IPv6 内层报文,而外层传输仍是 IPv4。或者客户端干脆把 IPv6 全封掉,让任何东西都逃不出隧道。这是三种截然不同的行为,而一个只写支持 IPv6 的页面并不区分它们。
先问设计需要哪一种。必须访问纯 IPv6 服务的网络,需要承载。必须阻止 IPv6 直连流量的网络,需要封堵或完整承载,而不是营销页上的一个标签。
在承载与封堵之间做选择
承载意味着隧道有 IPv6 地址、内部有默认路由,并且两端策略都允许这类流量。封堵意味着客户端有意不让 IPv6 跑到隧道之外,这很安全,但对访问 IPv6 目的地毫无用处。两者都正当;两者都不是可以默认假设的设定。先选定需求,再核实客户端是否真的实现了它。
只有 IPv4 的访客网络无法验证 IPv6 路径,所以在那里做的检测,对两种协议族并存的家庭网络什么也说明不了。要在真正提供该协议族的地方测。
终止开关需要同样的覆盖面
只覆盖 IPv4 的终止开关,会让另一个协议族直接出去,而这正是它本该阻止的泄漏。要复核它针对两个协议族、以及隧道建立或断开这些过渡时刻的规则。在系统范围内关掉 IPv6 并不是替代方案:它可能破坏无关服务,还会把客户端策略问题藏在一项全局改动背后。
把 DNS 与这一切分开来看。DNS 关心的是谁回答查询、查询怎么走;之后的应用程序连接有自己的路径。一个可能是对的,另一个未必,把两者混在一起诊断只会得出混乱的结论。
记录每次检测测的是哪个协议族,以及客户端声称具备哪种能力。这两项事实能回答支持标签永远不会回答的问题。