为什么这个/120 ipv6子网不路由?

为什么这个/120 ipv6子网不路由?

我想我遗漏了一个非常简单的细节,而且我的问题的答案已经存在,但我不知道用什么词来搜索,因此抱歉,我问了这个问题:

2001:db8:X:Y::25:785c/112在我的 Linux VPS 主机中,我在接口上分配了 ipv6 地址eth0;我想将其划分为两个 /120 子网,一个用于 VPS 主机,另一个通过 VPN 路由到另一个站点(通过接口)tuns0。问题是来自其他远程办公室的 ping 不会路由到我的 VPS 提供商并路由到互联网;它们通过 VPN 隧道到达 VPS 主机,但 VPS 主机似乎无法解析路由器的 MAC 地址,因为它使用“错误”的源和/或目标地址询问“2001:db8:X:Y::1 的邻居请求”。

问题

  1. eth0当代表远程办公室发送邻居请求时,Linux 内核如何决定在本地使用什么源地址?
  2. 设置此子网时我错过了什么?

我的配置

这些接口包括:

# ip -6 addr list eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
    inet6 2001:db8:X:Y::25:785c/120 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3cff:fe2e:4906/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

# ip -6 addr list tuns0
85: tuns0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1423 state UNKNOWN qlen 100
    inet6 2001:db8:X:Y::25:61/120 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::2de4:df93:3c60:d6f6/64 scope link flags 800
       valid_lft forever preferred_lft forever

远程办公室分配的地址为 2001:db8:X:Y:25:1060/120

路由表为:

# ip -6 route list
unreachable ::/96 dev lo metric 1024 error -113 pref medium
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -113 pref medium
unreachable 2002:a00::/24 dev lo metric 1024 error -113 pref medium
unreachable 2002:7f00::/24 dev lo metric 1024 error -113 pref medium
unreachable 2002:a9fe::/32 dev lo metric 1024 error -113 pref medium
unreachable 2002:ac10::/28 dev lo metric 1024 error -113 pref medium
unreachable 2002:c0a8::/32 dev lo metric 1024 error -113 pref medium
unreachable 2002:e000::/19 dev lo metric 1024 error -113 pref medium
2001:db8:X:Y::1 dev eth0 proto static metric 100 pref medium
2001:db8:X:Y::25:1000/120 dev tuns0 metric 1024 pref medium
2001:db8:X:Y::25:7800/120 dev eth0 proto kernel metric 256 pref medium
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -113 pref medium
fe80::/64 dev eth0 proto kernel metric 100 pref medium
fe80::/64 dev tuns0 proto kernel metric 256 pref medium
default via 2001:db8:X:Y::1 dev eth0 proto static metric 100 pref medium

内核转发已启用:

# sysctl net.ipv6.conf.{eth0,tuns0}.forwarding
net.ipv6.conf.eth0.forwarding = 1
net.ipv6.conf.tuns0.forwarding = 1

防火墙:

# ip6tables -nvL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all      *      tuns0   ::/0                 ::/0
 3307  344K ACCEPT     all      tuns0  *       ::/0                 ::/0
    0     0 ACCEPT     all      *      *       ::/0                 ::/0                 state RELATED,ESTABLISHED
    3   216 ACCEPT     icmpv6    eth0   *       ::/0                 ::/0                 ipv6-icmp !type 128 code 0

症状

从远程办公室 ping 到公共 IP 时,会发生以下情况:

# ping6 -c 1 2606:4700::6810:85e5
PING 2606:4700::6810:85e5(2606:4700::6810:85e5) 56 data bytes

--- 2606:4700::6810:85e5 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

VPS 主机上的 wireshark 跟踪显示:

Capturing on 'eth0'
  1 0.000000000 fe80::216:3cff:fe2e:4906 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::1 from 00:16:3c:2e:49:06
  2 1.001850169 fe80::216:3cff:fe2e:4906 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::1 from 00:16:3c:2e:49:06
  3 2.003817526 fe80::216:3cff:fe2e:4906 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::1 from 00:16:3c:2e:49:06

  4 3.005863618 2001:db8:X:Y::25:785c -> ff02::1:ff25:1060 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::25:1060 from 00:16:3c:2e:49:06
  5 4.007810968 2001:db8:X:Y::25:785c -> ff02::1:ff25:1060 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::25:1060 from 00:16:3c:2e:49:06
  6 5.009819429 2001:db8:X:Y::25:785c -> ff02::1:ff25:1060 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::25:1060 from 00:16:3c:2e:49:06

笔记此跟踪中有两种发现,并且 VPS 提供商的路由器从未响应;根据下面的成功跟踪,我认为内核应该使用元组“2001:db8:X:Y::25:785c -> ff02::1:ff00:1”来处理其 NS 请求。我很想了解它为什么选择这些地址。

当我从 Linux 主机 ping 时,邻居发现请求不同,路由器响应,并且 ping 成功:

Capturing on 'eth0'
  1 0.000000000 2001:db8:X:Y::25:785c -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation for 2001:db8:X:Y::1 from 00:16:3c:2e:49:06
  2 0.001160390 2001:db8:X:Y::1 -> 2001:db8:X:Y::25:785c ICMPv6 86 Neighbor Advertisement 2001:db8:X:Y::1 (rtr, sol, ovr) is at 74:8e:f8:71:a3:00
  3 0.001180977 2001:db8:X:Y::25:785c -> 2606:4700::6810:85e5 ICMPv6 118 Echo (ping) request id=0x5033, seq=1, hop limit=0
  4 0.002499763 2606:4700::6810:85e5 -> 2001:db8:X:Y::25:785c ICMPv6 118 Echo (ping) reply id=0x5033, seq=1, hop limit=0 (request in 3)

答案1

当我弄清楚这个问题后,我就回答我自己的问题。

VPS 提供商将我的 VPS 连接到虚拟以太网网络,VPS 依靠网络发现协议来查找路由器。类似的配置记录在这个博客这非常有用;“NDP 代理”这个术语是我不知道的,但它是与谷歌相关的术语。

解决方案

  1. 内核需要响应eth0接口上的 NS 查询,以获取知道如何在其他接口上路由的 IP:
net.ipv6.conf.eth0.proxy_ndp = 1
  1. 内核要响应的单个 IP 必须配置为:
ip -6 neigh add proxy 2001:db8:X:Y::25:1060 dev eth0
  1. 如果 VPS 是 KVM,则ndpresponder必须采用类似的解决方案,因为默认情况下,某些 KVM 虚拟机管理程序配置为删除本地链接邻居发现广告,这会导致路由器永远不会收到这些代理响应。此程序改为从全局单播地址发送广告响应,因此它们不会被 KVM 管理程序丢弃。使用 ndpresponder 时,proxy_ndp不使用功能。

感谢@u1686_grawity 的帮助。事实证明,重要的不是 IP 的大小,而是如何使用它。

相关内容