如何修复 IPv6 无法在接口之间正确转发流量的问题?

如何修复 IPv6 无法在接口之间正确转发流量的问题?

我有两台 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]/64eth0
  • 服务器 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 应该消失。不,它会继续存在。:-)

相关内容