全球 IPv6 地址并不意味着流量绕开了隧道
作用域说明地址能被路由到多远,而不是这个数据包去了哪里。下结论之前,请先读接口、所选路由和隧道前缀。
一个测试页面报告了全球 IPv6 地址,结论就直接跳到了“流量绕过了 VPN”。这个结论需要页面从未展示的两件事:哪个应用发出了请求,以及内核为它选择了哪条路由。地址的作用域描述的是这个地址能被路由到多远。它完全不能说明这个特定的数据包去了哪里。
作用域和角色是两个不同的问题,证据也不同。
作用域回答的是谁可以路由它,而不是谁正在这么做
全球单播地址原则上可以在公共互联网上路由,唯一本地地址是给内部拓扑用的,链路本地地址只存在于一条链路上。这些都是地址块的属性。一个去往特定目的地的数据包是否走出隧道,由路由表和绑定在接口上的策略共同决定,而这两者都可能指向任何一边。
地址可以是全球作用域,却仍然在隧道里传输,因为隧道是一条路径,而不是一套地址规划。
读接口上的全部地址,而不是网页测试
接口输出会同时显示多个地址:物理链路上的外部地址、隧道地址,以及每个接口一个链路本地地址。 网页测试只显示一次请求的源地址。先用 ip -6 addr show 开始,记下每个地址属于哪个接口、带多少位前缀,然后再问这次请求实际用了哪个接口。
把它与 ip -6 route get 2606:4700::1111 对比,后者会打印内核为某个目的地选择的接口和源地址。
全球前缀是如何进入隧道的
有两种设计能在隧道接口上生成全球地址。服务商可以 把一个路由到客户端的前缀通过隧道委派下去,这样地址就是全球的,而路径仍然是隧道。或者客户端保留自己原生的全球地址,由隧道把它作为内部流量承载,外层报头负责干活。两种设计都不需要地址转换,混乱恰恰始于把 IPv4 NAT 的习惯当成 IPv6 的要求。
去问管理员这两种设计里哪一种适用。答案决定了对端服务器把你的请求看成什么源。
为什么看起来像私有的地址不是信任信号
唯一本地地址只说明运营者打算把它用于内部路由,别的什么也说明不了。它不能证明设备被管理、软件可信,或者流量被加密。反过来,全球地址也不能证明流量逃出了隧道,而这正是整篇文章要拆掉的假设。
信任要看策略、认证和加密。地址的外观是一个弱启发式,两个方向都会出错。
把路由和策略当作两个问题来测
第一是路由:先让 curl -6 https://ifconfig.me 走隧道,再走物理接口,比较两次的答案。第二是策略:确认隧道实际承载的是哪个前缀,以及对端是否有返回它的路由。对公共网站的成功请求什么都证明不了,因为任何地方都能到达那个目的地。策略测试要使用内部目的地。
记下每条路径产生的源地址。这才是“是否绕过隧道”这一主张真正需要的证据。