配置ARP时效超时

问题描述 投票:33回答:3

我正在尝试配置ARP年龄超时。我想我应该将/proc/sys/net/ipv4/neigh/default/base_reachable_time_ms设置为所需的超时。但是,尽管我将其设置为30000毫秒(30秒),但仍需要将近10分钟才能从ARP缓存中删除条目。在阅读了几篇文章后,我发现还有更多的设置会影响超时:

/proc/sys/net/ipv4/neigh/default/gc_interval
/proc/sys/net/ipv4/neigh/default/gc_stale_time
/proc/sys/net/ipv4/route/gc_interval
/proc/sys/net/ipv4/route/gc_timeout

我不知道该为这些程序编程。在Linux中,gc_timeout默认为5分钟。我把它改为30秒,但我仍然没有看到base_reachable_time/23*base_reachable_time/2中的条目被删除。

如何设置ARP缓存的到期时间?

linux linux-kernel arp
3个回答
87
投票

Linux内核中的邻居缓存并不像人们想象的那么简单。我会尝试用它来解释一些怪癖。

实际上完全脱离缓存的邻居缓存条目或仅被标记为陈旧/无效之间存在细微差别。在base_reachable_time / 2和3 * base_reachable_time / 2之间的某个时刻,该条目仍将在缓存中,但它将被标记为STALE状态。您应该能够通过“ip -s neighbor show”查看状态,

pherricoxide@midigaurd:~$ ip -s neighbor list
192.168.42.1 dev eth0 lladdr 00:25:90:7d:7e:cd ref 2 used 184/184/139 probes 4 STALE
192.168.10.2 dev eth0 lladdr 00:1c:23:cf:0b:6a ref 3 used 33/28/0 probes 1 REACHABLE
192.168.10.1 dev eth0 lladdr 00:17:c5:d8:90:a4 ref 219 used 275/4/121 probes 1 REACHABLE

当处于如上所示的STALE状态时,如果我ping 192.168.42.1,它将立即将数据包发送到00:25:90:7d:7e:cd。大约一秒钟后,它通常会发送一个ARP请求,其中包含192.168.42.1,以便将其缓存更新回REACHABLE状态。但是,为了使问题更加混乱,内核有时会根据更高级协议的正反馈更改超时值。这意味着如果我ping 192.168.42.1并且它回复,那么内核可能不会打扰发送ARP请求,因为它假设pong意味着它的ARP缓存条目有效。如果条目处于STALE状态,它也会被它碰巧看到的未经请求的ARP回复更新。

现在,对于大多数情况,您需要担心的是处于STALE状态的条目。为什么需要完全从缓存中删除条目?内核通过更改缓存条目的状态而不是实际删除并将它们一直添加到缓存中而花费大量精力来不破坏内存。

如果你真的坚持它不仅会被标记为STALE,而且实际上会从邻居缓存使用的hashmap中删除,你必须要注意一些事情。首先,如果条目尚未使用且对于gc_stale_time秒是陈旧的,则应该有资格删除它。如果gc_stale_time传递并将条目标记为可以删除,则在垃圾收集器运行时(通常在gc_interval秒之后)将删除它。

现在的问题是,如果正在引用邻居条目,则不会删除邻居条目。你将遇到问题的主要问题是来自ipv4 routing table的参考。有很多复杂的垃圾收集内容,但需要注意的重要一点是,路由缓存的垃圾收集器只会在很多内核上每隔5分钟(/ proc / sys / net / ipv4 / route / gc_timeout秒)到达条目。这意味着邻居条目必须被标记为陈旧(可能是30秒,具体取决于base_reachable_time),然后在路由缓存停止引用条目之前必须经过5分钟(如果幸运的话),然后是一些组合gc_stale_time和gc_interval在实际被清理之前传递(因此,整体而言,在5-10分钟之间将会通过)。

简介:您可以尝试将/ proc / sys / net / ipv4 / route / gc_timeout减少到更短的值,但是有很多变量并且很难控制它们。通过不过早删除缓存中的条目(而只是将它们标记为STALE甚至FAILED),已经投入了大量精力来使事情表现良好。


3
投票
ip link set arp off dev eth0
ip link set arp on dev eth0

0
投票

完全清理arp缓存的最简单方法是将接口关闭然后重新启动。显然,这有很多含义,例如,可能打破正在进行的TCP连接,暂时无法访问等等。但这似乎是在最新内核中从arp缓存中真正删除条目的唯一方法:(

© www.soinside.com 2019 - 2024. All rights reserved.