Linux 配置ARP年龄超时

Linux 配置ARP年龄超时,linux,linux-kernel,arp,Linux,Linux Kernel,Arp,我正在尝试配置ARP年龄超时。我想我应该将/proc/sys/net/ipv4/neigh/default/base\u reachable\u time\u ms设置为所需的超时。但是,尽管我将其设置为30000ms(30秒),但从ARP缓存中删除一个条目仍然需要将近10分钟。阅读了几篇文章后,我发现影响超时的设置很少: /proc/sys/net/ipv4/neigh/default/gc_interval /proc/sys/net/ipv4/neigh/default/gc_stale_

我正在尝试配置ARP年龄超时。我想我应该将
/proc/sys/net/ipv4/neigh/default/base\u reachable\u time\u ms
设置为所需的超时。但是,尽管我将其设置为30000ms(30秒),但从ARP缓存中删除一个条目仍然需要将近10分钟。阅读了几篇文章后,我发现影响超时的设置很少:

/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\u超时默认为5分钟。我将其更改为30秒,但仍然没有看到条目在
base\u reachable\u time/2
3*base\u reachable\u time/2
内被删除


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

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

实际上完全从缓存中掉出来的相邻缓存项与被标记为过时/无效的相邻缓存项之间存在细微的区别。在base\u reachable\u time/2和3*base\u reachable\u time/2之间的某个时间点,条目仍将在缓存中,但它将被标记为过时状态。您应该能够通过“ip-s邻居秀”查看状态

当处于如上所示的陈旧状态时,如果我ping 192.168.42.1,它将立即将数据包发送到00:25:90:7d:7e:cd。一秒钟左右之后,它通常会向拥有192.168.42.1的用户发送ARP请求,以便将其缓存更新回可访问状态。但是,为了让事情变得更加混乱,内核有时会根据来自更高级别协议的正反馈更改超时值。这意味着,如果我ping 192.168.42.1,它会回复,那么内核可能不会麻烦发送ARP请求,因为它假设pong意味着它的ARP缓存条目是有效的。如果条目处于过时状态,它也会被它碰巧看到的未经请求的ARP回复更新

现在,对于大多数情况,您只需要担心处于过时状态的条目。为什么需要将该条目从缓存中完全删除?内核通过改变缓存项的状态,而不是一直将它们删除并添加到缓存中,从而尽了很大的努力来避免对内存的冲击

如果您真的坚持认为它不仅会被标记为过时,而且实际上会从邻居缓存使用的hashmap中删除,那么您必须注意几件事。首先,如果该条目未被使用且过期时间为gc\u stale\u time秒,则该条目应该可以被删除。如果通过了gc\u stale\u time并将条目标记为可以删除,则在垃圾收集器运行时(通常在gc\u interval秒之后)将删除该条目

现在的问题是,邻居条目在被引用时不会被删除。您将遇到的主要问题是来自的引用。有很多复杂的垃圾收集内容,但需要注意的重要一点是,路由缓存的垃圾收集器在很多内核上每5分钟(/proc/sys/net/ipv4/route/gc_timeout秒)只会使条目过期一次。这意味着必须将邻居条目标记为过时(可能需要30秒,取决于基本可访问时间),然后在路由缓存停止引用该条目之前需要5分钟(如果幸运的话),然后是gc\u stale\u时间gc\u间隔的组合,然后才真正清理干净(因此,总的来说,大约5-10分钟会过去)


小结:您可以尝试将/proc/sys/net/ipv4/route/gc_timeout减小到一个较短的值,但变量很多,很难控制所有变量。要想让事情顺利进行,需要付出大量的努力,不要过早地删除缓存中的条目(而只是将它们标记为过时甚至失败)。

彻底清理arp缓存的最简单方法是先关闭接口,然后再重新启动。显然,这会带来更多的影响,例如,可能会中断正在进行的TCP连接,暂时无法访问,等等。 但这似乎是在最新内核中真正从arp缓存中删除条目的唯一方法:(

这是我设置的:

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

这一切都很有趣,但我敢问:为什么没有办法手动强制执行缓存清理?我知道这会使系统性能变差,但通过手动清理,您已经做好了准备。相反,我所知道的清除arp缓存的唯一方法(
sudo ip-s-s neigh flush all
)会将条目标记为无效,但不会将其从缓存中删除。这非常违反直觉。在我看来,应该在某个地方有一个标志,告诉系统“真正清理缓存,从现在起我将对任何问题负责”.
arp-d如果您计划向下,然后向上打开接口-这是您连接到主机的接口,请确保在按Enter键之前将命令链接到同一行!(更好的是,从屏幕会话中执行此操作…)
ip link set arp off dev eth0; ip link set arp on dev eth0
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