从具有 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。数据包传入 并不重要enp3s0
,dummy0
因为 IP 地址是全局的。
但我无法从远程主机 ping 2001:44b8:4112:8a02::55 。主机发出 NDP 请求来定位 2001:44b8:4112:8a02::55,但没有得到响应。所以看起来这些地址实际上并不是全局的,而是特定于某个接口的。
如果我手动将相同的 IPv6 地址添加到enp3s0
.它有效。事实上,如果我从 中删除 IPv6 地址分配,它会继续工作一段时间enp3s0
,大概是因为 NDP 结果已被缓存。计算机知道如何处理该地址的数据包(如果收到),但只是喜欢保守秘密。
我的理解是,这应该与 IPv4 一样适用于 IPv6,但事实并非如此。
这台计算机没有iptables
或ip6tables
可能阻止了某些内容。
这台计算机是:
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”默认情况下处于关闭状态(实际上甚至不确定您是否可以更改此设置)。
因此,虽然我找不到任何参考资料,但我怀疑这是预期的行为。