我有两台 OpenSUSE 服务器,一台支持 IPv6 和 IPv4,而另一台仅支持 IPv4。两台服务器都通过 OpenVPN 连接,可以通过隧道顺利使用 IPv6 进行通信。
设置如下:
Server A (IPv6 and IPv4)
It has assigned a /64 IPv6 subnet, let's say it is: 2aFF:FFFF:FFFF:FFFF::/64
ens3 interface:
2aFF:FFFF:FFFF:FFFF::1/112
fe80::***/64 (link-local)
(Also tried using the /64 mask as shown below instead of the /112 mask. Same result)
2aFF:FFFF:FFFF:FFFF::1/64
tun0 interface:
2aFF:FFFF:FFFF:FFFF::1:1/112
fe80::***/64 (link-local)
Routes:
::1 dev lo proto kernel metric 256 pref medium
2aFF:FFFF:FFFF:FFFF::/112 dev ens3 proto kernel metric 256 pref medium
2aFF:FFFF:FFFF:FFFF::1:0/112 dev tun0 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
default via fe80::1 dev ens3 metric 1024 pref medium
Server B (IPv4 only on non-tun interfaces)
eno1 interface:
fe80::***/64 (link-local)
tun0 interface:
2aFF:FFFF:FFFF:FFFF::1:8000/112
fe80::***/64 (link-local)
routes (ip -6 route):
::1 dev lo proto kernel metric 256 pref medium
2aFF:FFFF:FFFF:FFFF::1:0/112 dev tun0 proto kernel metric 256 pref medium
fe80::/64 dev eno1 proto kernel metric 100 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
default dev tun0 metric 1024 pref medium
(Alternatively, explicitly define the route IP. It has the same result)
default via 2aFF:FFFF:FFFF:FFFF::1:1 dev tun0 metric 1024 pref medium
IPv6 转发显然已按照以下方式启用sysctl
:
# sudo sysctl net.ipv6.conf.all.forwarding
net.ipv6.conf.all.forwarding = 1
# sudo sysctl net.ipv6.conf.ens3.forwarding
net.ipv6.conf.ens3.forwarding = 1
通过此设置我可以从服务器乙ping 并连接到两者2aFF:FFFF:FFFF:FFFF::1:1
(服务器上的 tun0 地址A)这样 VPN 隧道就可以正常工作了;我也可以 ping 并连接到2aFF:FFFF:FFFF:FFFF::1
(服务器上的 ens3 地址A)但是如果我尝试连接到任何其他 ipv6 地址(例如wget -6 google.com
)它只能从服务器工作A但不在服务器上乙。
跟踪路由来自乙显示第一跳之后的星号,好像路线是错误的。
1 2aFF:FFFF:FFFF:FFFF::1:1 (2aFF:FFFF:FFFF:FFFF::1:1) 30.739 ms 30.755 ms 30.758 ms
2 * * *
[...]
30 * * *
我该如何修复这个 IPv6 连接问题?
答案1
你需要proxy_ndp
。您现在拥有以下 IPv6 配置:
- 外部路由器(你无法控制它):其他东西
[2001:0DB8::1]/64
,eth0
- 服务器 A:
[2001:0DB8::2]/112
开启eth0
,[2001:0DB8::1:1]/112
开启tun0
- 服务器B:
[2001:0DB8::1:2]/112
开启tun0
,其他内容
您可以立即看到问题:设备对子网大小不一致。外部路由器希望[2001:0DB8::0]/64
所有可直接到达通过eth0
。如果它尝试访问恰好属于 的主机[2001:0DB8::1:0]/112
,它将永远不会收到邻居发现协议请求的答复,因为该主机不在本地网络上。
这就是proxy_ndp
发挥作用的地方:它将使服务器 A 充当对特定主机的 NDP 请求的代理,所有这些请求都必须手动添加:
sysctl -w net.ipv6.conf.all.proxy_ndp=1
ip -6 neigh add proxy 2001:0DB8::1:2 dev eth0
这指示 PC 回答2001:0DB8::1:2
到达的NDP 请求eth0
。
[2001:0DB8::1]/64
我记得你还需要在eth0
和上使用tun0
,但我不太确定。这当然意味着需要在服务器 A 上为每个 IPv6 地址添加显式路由,因为存在歧义。
这样的设置可以起作用,但我并不推荐它。只需在 VPN 网络上使用 IPv6 NAT 和唯一本地寻址。是的,NAT 应该消失。不,它会继续存在。:-)