为什么 ndisc6 无法更新内核邻居表?

为什么 ndisc6 无法更新内核邻居表?

我一直在使用 ARP/NDP 进行一些工作并发现它ndisc6不会更新邻居表(与 不同arping)。

arping例如:连接到 VLAN 成员的设备上配置了 192.168.0.14,因此我们能够解析其地址。

root@ubuntu:/# ip neigh show 192.168.0.14
root@ubuntu:/# arping 192.168.0.14 -i Vlan1000
ARPING 192.168.0.14
60 bytes from ca:6c:4c:92:85:1c (192.168.0.14): index=0 time=38.088 msec
60 bytes from ca:6c:4c:92:85:1c (192.168.0.14): index=1 time=84.431 msec
60 bytes from ca:6c:4c:92:85:1c (192.168.0.14): index=2 time=119.154 msec
60 bytes from ca:6c:4c:92:85:1c (192.168.0.14): index=3 time=53.739 msec
^C
--- 192.168.0.14 statistics ---
4 packets transmitted, 4 packets received,   0% unanswered (0 extra)
rtt min/avg/max/std-dev = 38.088/73.853/119.154/31.015 ms
root@ubuntu:/# ip neigh show 192.168.0.14
192.168.0.14 dev Vlan1000 lladdr ca:6c:4c:92:85:1c REACHABLE

如您所见,arping能够在内核邻居表中添加新条目,如下所示ip neigh

对于类似的 IPv6 示例,ndisc6无法做到这一点:

root@ubuntu:/# ip neigh show fc02:1000::3
root@ubuntu:/# ndisc6 fc02:1000::3 Vlan1000
Soliciting fc02:1000::3 (fc02:1000::3) on Vlan1000...
Target link-layer address: CA:58:C2:5F:7C:02
 from fc02:1000::3
root@ubuntu:/# ip neigh show fc02:1000::3
root@ubuntu:/#

fc02:1000::3 是连接到 VLAN 成员的设备上配置的类似有效 IP 地址。尽管收到了有效的邻居通告消息,但内核邻居表并未更新,如以下空输出所示ip neigh

我还在评论中找到了其他人看到相同问题的参考这个答案但没有解释原因。

答案1

内核是保存邻居记账的地方。因此,如果用户空间工具生成 ARP(用于 IPv4)查询或新民主党使用原始套接字(ARP 和 AF_INET6 的 AF_PACKET、NDP 的 SOCK_RAW)查询(对于 IPv6),答复对于内核来说并不重要...

... 除了Linux 内核有一个 IPv4 ARP 切换让它信任收到的 ARP 流量,即使没有被请求。因此 ARP回复阿尔平命令会让内核添加一个 ARP 条目,但是 IPv6 没有这样的切换。

我承认,在使用通用多操作系统时,Linux 上的行为也存在差异阿尔平工具而不是iputils-arping:在前一种情况下,ARP 条目仍然“由于某种原因”被创建。


无论如何,这种情况不会发生在 IPv6 上,但很容易解决:先创建条目,稍后更新,ndisc6因为内核将有一个条目并处理回复。最佳状态类型是陈旧:被认为有效但不可靠。

为了避免一些不必要的干扰,ip neigh change首先尝试不提供 MAC 地址,以便保留以前可能有效的条目,如果由于没有条目或可能处于失败状态而失败(对于这些情况,MAC 地址是强制性的),则使用ip neigh replace(而不是ip neigh add为了避免两个命令之间的竞争条件)并提供假的当地的MAC地址。

对于OP的情况:

ip -6 neigh change fc02:1000::3 nud stale dev Vlan1000 ||
    ip -6 neigh replace fc02:1000::3 lladdr 02:00:00:00:00:00 nud stale dev Vlan1000
ndisc6 fc02:1000::3 Vlan1000

现在这应该给出正确的条目:

ip -6 neigh show fc02:1000::3

相关内容