IPv6 泄露是指 VPN 只承载了 IPv4 流量,设备的 IPv6 流量仍然从物理网卡直连目标站点,目标站点和运营商因此看到你的真实 IPv6 地址。这个问题在双栈网络里很常见,因为系统会优先选择 IPv6,而许多 VPN 配置只给 IPv4 建了路由。
为什么双栈环境容易泄露
现代系统在访问一个同时有 A 记录和 AAAA 记录的域名时,会按 Happy Eyeballs(RFC 8305)的思路先尝试 IPv6,超时后再回退 IPv4。隧道有没有承载 IPv6,系统并不关心。只要物理网卡上还有一条 IPv6 默认路由,这部分流量就会走原有路径。

隧道里没有 IPv6 路由会发生什么
WireGuard 或 OpenVPN 如果只把 0.0.0.0/0 路由进隧道,IPv6 默认路由保持不变,所有走 IPv6 的连接都不会经过 VPN。用户看到的现象是大部分站点识别为 VPN 出口,但支持 IPv6 的大型站点记录到的是真实地址。
IPv6 地址能暴露多少信息
当前主流系统默认启用 IPv6 隐私扩展(RFC 4941),接口标识会周期性变化,但前缀部分仍然指向你所在的网络和运营商。对于要隐藏网络位置的场景,前缀本身已经足够说明问题。
怎么检测
连接 VPN 后在终端执行 curl -6 https://ifconfig.me。结果要么连接失败,要么返回隧道出口的 IPv6 地址,都说明没有泄露;如果返回的是你的运营商分配的地址,就是泄露。再用 ip -6 route(Windows 用 Get-NetRoute -AddressFamily IPv6)查看默认路由是否仍指向物理网卡。
三种修法的取舍

方案一:让隧道一并承载 IPv6
这是更完整的做法。WireGuard 客户端的 Address 里再分配一个 ULA 地址(例如 fd00:8::2/128),AllowedIPs 写成 0.0.0.0/0, ::/0;服务端开启 net.ipv6.conf.all.forwarding=1,并用 ip6tables 做地址转换或分配真实前缀。这样 IPv6 流量和 IPv4 一样走隧道。
方案二:直接禁用 IPv6
Linux 上执行 sysctl -w net.ipv6.conf.all.disable_ipv6=1 即可临时生效,写入 /etc/sysctl.d 后永久生效。这是最省事的办法,代价是本地网络里依赖 IPv6 的服务也会受影响。
方案三:用防火墙阻断物理网卡上的 IPv6 出站
例如 ip6tables -A OUTPUT -o eth0 -p tcp -j REJECT,让应用快速回退到 IPv4。这种方式保留了系统的 IPv6 配置,适合需要按网卡精细控制的环境,但需要确保规则不会误伤隧道自己的握手流量。
方案对照
| 方案 | 优点 | 代价 |
|---|---|---|
| 隧道承载 IPv6 | 双栈都在保护之下 | 服务端要配置 IPv6 转发 |
| 禁用 IPv6 | 配置最简单 | 影响本地 IPv6 服务 |
| 防火墙阻断 | 不改系统网络配置 | 需要维护规则,且不同系统写法不同 |
修完之后怎么确认
重新连接后再执行一次 curl -6 和 ip -6 route,并打开浏览器检测页面对比。同时也要检查 DNS 有没有经 IPv6 泄露,这两类问题常常一起出现。




