我正在尝试调试我的 IPv6 网络并遇到了一个我无法理解的问题。
我使用 OpenVPN 作为我的 VPN 服务器,下面是设置的简图:
当我尝试从 VPN Client ( 2001:470:7875:1::2
) ping 到 VPN Server ( 2001:470:7875:1::1
) 时,所有包都被丢弃了,但奇怪的是:
我可以通过 IPv6 ping 任何其他主机(如 Google)或通过 IPv6 连接到同一 VPN 服务器的任何其他 VPN 客户端。
我还可以在其本地 IPv6 接口 ( ens3
) 上 ping 我的 VPN 服务器。只有 VPN 服务器接口 ( tun0
) 在直接 ping 时不响应。
因此,我想知道发生了什么?
由于我有两个 IPv6 链接到互联网的 IPv6 版本,我必须做基于策略的路由。规则非常简单。
- 只有源自 VPN 服务器本身的 IPv6 包才允许通过本机 IPv6 链接发送。
- 所有其他 IPv6 包必须由 Hurricane Electric IPv6 隧道处理。
这导致我在 VPN 服务器上的以下路由表:
该命令ip -6 rule show
具有以下设置:
0: from all lookup local
32000: from 2001:470:7875::/48 lookup openvpn
32766: from all lookup main
表local
:
local ::1 dev lo proto kernel metric 0 pref medium
anycast 2001:470:1f14:2c7:: dev he-ipv6 proto kernel metric 0 pref medium
local 2001:470:1f14:2c7::2 dev he-ipv6 proto kernel metric 0 pref medium
anycast 2001:470:7875:1:: dev tun0 proto kernel metric 0 pref medium
local 2001:470:7875:1::1 dev tun0 proto kernel metric 0 pref medium
anycast 2a01:xxx:xxxx:: dev ens3 proto kernel metric 0 pref medium
local 2a01:xxx:xxxx:xxx::1 dev ens3 proto kernel metric 0 pref medium
anycast fe80:: dev ens3 proto kernel metric 0 pref medium
anycast fe80:: dev tun0 proto kernel metric 0 pref medium
anycast fe80:: dev he-ipv6 proto kernel metric 0 pref medium
local fe80::95d2:9e6b dev he-ipv6 proto kernel metric 0 pref medium
local fe80::5054:ff:fe66:f97f dev ens3 proto kernel metric 0 pref medium
local fe80::af96:f1e3:dbf3:96a7 dev tun0 proto kernel metric 0 pref medium
ff00::/8 dev ens3 metric 256 pref medium
ff00::/8 dev tun0 metric 256 pref medium
ff00::/8 dev he-ipv6 metric 256 pref medium
表main
:
local ::1 dev lo proto kernel metric 256 pref medium
2001:470:1f14:2c7::/64 dev he-ipv6 proto kernel metric 256 pref medium
2001:470:7875:1::/64 dev tun0 proto kernel metric 256 pref medium
unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium
2xxx:xxx:xxxx::/48 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
fe80::/64 dev he-ipv6 proto kernel metric 256 pref medium
default via 2a01:xxx:xxxx::1 dev ens3 metric 1024 pref medium
表openvpn
:
unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium
default via 2001:470:1f14:2c7::1 dev he-ipv6 metric 1024 pref medium
有谁能给我指点一下吗?:-)
快速回顾一下路由表中无法到达的线路
2001:470:1f14:2c7::/64 dev he-ipv6 proto kernel metric 256 pref medium
2001:470:7875:1::/64 dev tun0 proto kernel metric 256 pref medium
unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium
的范围2001:470:7875::/48
是从2001:470:7875:0:0:0:0:0
到2001:470:7875:ffff:ffff:ffff:ffff:ffff
。
我已将子网分配2001:470:7875:1::/64
给 VPN 隧道。
2001:470:7875:1::/64
是2001:470:7875::/48
子网的一部分,这可能会导致路由表中的冲突。2001:470:1f14:2c7::/64
不是子网的一部分,因此不会2001:470:7875::/48
与路由表冲突。
没有其他 IP 范围正在使用,但将在未确定的以后日期。
记住最长前缀获胜给我们以下行为:
- 子网的任何 IP 包
2001:470:1f14:2c7::/64
都将由 he-ipv6 接口处理。 - 子网的任何 IP 包
2001:470:7875:1::/64
都将由 tun0 接口处理。 - 2001:470:7875::/48 子网的所有其他IP 包将被回复为无法访问。
所以...
经过更多的挖掘,我发现我的设置可以稍微改进一下,尽管我并不完全相信我已经覆盖了所有的基础。
无论如何
ip -6 rule show
可以稍微调整一下。该行:
由以下命令生成:
这可以简化为:
这意味着基本上所有基于 IPv6 的流量都必须查找表
openvpn
,当且仅当流量来自 VPN 链接并且目标地址属于2003::/3
,这基本上是整个官方 IPv6 互联网 - 不包括 fe80::/10 和 fc 等本地地址::/7。最终结果是来自我的 VPN 链接的 IPv6 流量始终通过 Hurricane Electric 链接转发。
要记住的事情。每当我从该范围内的可用地址池中添加一个新子网时,
2001:470:7875::/48
我都必须输入两个条目。main
,说明如何将包从 VPN 服务器转发到新子网。openvpn
说明 VPN 客户端如何到达新子网。这通常是在通过 VPN 链接从一个客户端到另一个客户端的站点到站点流量时。无论如何:Ping 现在可以正常工作,我仍然可以通过 IPv6 ping Google。
该命令
ip -6 rule show
现在提供以下输出:其他一切都是从最初的问题开始的。
Traceroute 有点棘手,但只要使用 ICMP Echo 包就可以了。
在我的 VPN 客户端上运行命令
traceroute -6 -I google.com
给出了以下跟踪: