Linux:什么原因导致静态 ARP 条目在链路关闭时刷新

Linux:什么原因导致静态 ARP 条目在链路关闭时刷新

这是一个关于网络行为差异的问题Debian 破坏者(内核 4.19.0-18)和Debian Bullseye(内核 5.10.0-9)。在 Buster 上,如果接口上的链接断开,代理 arp 条目会保留下来。在 Bullseye 上则不会。

情况:在特定接口上创建静态代理 ARP 条目:

ip neigh add proxy 1.2.3.5 dev eth0

我可以验证该条目是否存在:

ip neigh show proxy

现在,如果该接口上的链接断开并再次恢复,则在 Buster 上代理 arp 条目仍然存在,而在 Bullseye 上它们却消失了。

我想知道这种差异背后的原因。这是内核功能吗?是 udev 执行此操作吗?是否有 sysctl 设置来控制此操作?

有人能给我指点一下吗?如果你知道如何在 Bullseye/内核 5.10 上创建静态 ARP 条目那就更好了。

请注意,我使用的是 sysvinit,而不是 systemd。谢谢!

答案1

以下是与此问题相关的变更历史记录:

  • 2018-10-12 09:47:39 -0700

    net:驱逐运营商停机时的邻居条目

    在 netdev -next tree 上提交:当链路上的载波发生故障时,负责删除邻居条目,并在提交消息中说明理由。

  • 2018-10-22 07:47:45 +0100

    内核v4.19发布。

    这仍然不包括来自 netdev -next 分支的提交。

  • 2018-10-24 06:47:44 +0100

    Davem 的拉取请求(包括之前的邻居更改)的合并已合并到 linux master 中,因此被包含在 linux 中v4.20一旦发布。

快进...

  • 2021-11-01 19:57:14 -0700+2021-11-01 19:57:17 -0700

    net:arp:引入arp_evict_nocarriersysctl参数

    此更改引入了一个新的 sysctl 参数arp_evict_nocarrier。设置后(默认),ARP 缓存将在事件发生时清除NOCARRIER。此新选项的默认设置为“1”,以保持现有行为。
    [...]

因此,您可能必须等待 bullseye-backports 中的内核 >= 5.16 才能恢复旧行为,例如:

sysctl -w net.ipv4.conf.eth0.arp_evict_nocarrier=0

或者等待稍后的调整代理人条目的行为类似于永久条目(其获取特定代码以免受到载体关闭事件的影响)。


关于第二个问题“如何创建静态 ARP 条目”,以下是在接口上为 MAC 地址为 12:34:56:78:9a:bc 的 192.0.2.2 添加静态条目的方法eth0,使用replace关键字而不是关键字,add该关键字可能会随机返回RTNETLINK answers: File exists error(或者change会遭受相反的结果):

ip neigh replace 192.0.2.2 dev eth0 lladdr 12:34:56:78:9a:bc nud permanent

相关内容