我想我遗漏了一个非常简单的细节,而且我的问题的答案已经存在,但我不知道用什么词来搜索,因此抱歉,我问了这个问题:
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 的邻居请求”。
问题
eth0
当代表远程办公室发送邻居请求时,Linux 内核如何决定在本地使用什么源地址?- 设置此子网时我错过了什么?
我的配置
这些接口包括:
# 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 代理”这个术语是我不知道的,但它是与谷歌相关的术语。
解决方案
- 内核需要响应
eth0
接口上的 NS 查询,以获取知道如何在其他接口上路由的 IP:
net.ipv6.conf.eth0.proxy_ndp = 1
- 内核要响应的单个 IP 必须配置为:
ip -6 neigh add proxy 2001:db8:X:Y::25:1060 dev eth0
- 如果 VPS 是 KVM,则
ndpresponder
必须采用类似的解决方案,因为默认情况下,某些 KVM 虚拟机管理程序配置为删除本地链接邻居发现广告,这会导致路由器永远不会收到这些代理响应。此程序改为从全局单播地址发送广告响应,因此它们不会被 KVM 管理程序丢弃。使用 ndpresponder 时,proxy_ndp
不使用功能。
感谢@u1686_grawity 的帮助。事实证明,重要的不是 IP 的大小,而是如何使用它。