配置ARP时效超时

时间:2013-03-12 20:59:52

标签: linux linux-kernel arp

我正在尝试配置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缓存的到期时间?

4 个答案:

答案 0 :(得分:88)

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),已经投入了大量精力来使事情表现良好。

答案 1 :(得分:3)

ip link set arp off dev eth0
ip link set arp on dev eth0

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是我设置的:

sudo -s then enter:

echo 30 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 175 > /proc/sys/net/ipv4/route/gc_timeout
echo 20000 > /proc/sys/net/ipv4/neigh/default/base_reachable_time_ms
echo 30 > /proc/sys/net/ipv4/route/gc_interval