接口上的 IPv6 地址不响应其他接口上的 NDP 数据包

接口上的 IPv6 地址不响应其他接口上的 NDP 数据包

从具有 192.168.2.0/24 和 2001:44b8:4112:8a02::/64 接口的给定计算机enp3s0,如果我执行以下操作:

canidae# ip link add dummy0 type dummy
canidae# ip addr add dev dummy0 2001:44b8:4112:8a02::55 
canidae# ip addr add dev dummy0 192.168.2.55
canidae# ip link set dummy0 up

以下输出ip addr确认两个 IP 地址都是全局的:

46: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 02:d1:a1:a4:7d:a6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.55/32 scope global dummy0
       valid_lft forever preferred_lft forever
    inet6 2001:44b8:4112:8a02::55/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::d1:a1ff:fea4:7da6/64 scope link 
       valid_lft forever preferred_lft forever

现在,我可以从网络上的另一台计算机 ping 通 192.168.2.55。数据包传入 并不重要enp3s0dummy0 因为 IP 地址是全局的。

但我无法从远程主机 ping 2001:44b8:4112:8a02::55 。主机发出 NDP 请求来定位 2001:44b8:4112:8a02::55,但没有得到响应。所以看起来这些地址实际上并不是全局的,而是特定于某个接口的。

如果我手动将相同的 IPv6 地址添加到enp3s0.它有效。事实上,如果我从 中删除 IPv6 地址分配,它会继续工作一段时间enp3s0,大概是因为 NDP 结果已被缓存。计算机知道如何处理该地址的数据包(如果收到),但只是喜欢保守秘密。

我的理解是,这应该与 IPv4 一样适用于 IPv6,但事实并非如此。

这台计算机没有iptablesip6tables可能阻止了某些内容。

这台计算机是:

canidae# uname -a
Linux canidae 5.9.0-3-amd64 #1 SMP Debian 5.9.9-1 (2020-11-19) x86_64
GNU/Linux

但我也见过类似的行为:

root@kube-node-3:~# uname -a
Linux kube-node-3 4.19.0-12-amd64 #1 SMP Debian 4.19.152-1 (2020-10-18) x86_64 GNU/Linux

有人能解释这种行为吗?是否可以修复它,使其按我的预期工作?

附言。对于非理想的测试 IP 地址 192.168.2.55/32 表示歉意 - 它是正确的,不要与广播地址 255 混淆。与 IPv6 地址相同。

答案1

这是针对 IPv4 提出的一个非常相似的问题:

https://serverfault.com/questions/834512/why-does-linux-answer-to-arp-on-in Correct-interfaces

我相信这也被称为“严格的arp”。我相信“严格 arp”默认情况下处于打开状态,但“严格 ndp”默认情况下处于关闭状态(实际上甚至不确定您是否可以更改此设置)。

因此,虽然我找不到任何参考资料,但我怀疑这是预期的行为。

相关内容