在至少一种实施方式中,对ARP表的容量有硬限制。如果ARP缓存已满,并且提供的数据包带有未缓存的目的地(或下一跳),会发生什么情况?到底发生了什么,对服务质量有什么影响?例如,Brocade NetIron XMR和Brocade MLX路由器最多可配置ip-arp系统。在这种情况下,默认值为8192。 / 19子网的大小。从文档中尚不清楚这是针对每个接口还是针对整个路由器,但是出于这个问题的目的,我们可以假定是针对每个接口。

很少有网络人员会配置/ 19子网在故意的界面上,但事实并非如此。我们正在将核心路由器从Cisco型号迁移到Brocade。 Cisco和Brocade之间的众多差异之一是Cisco接受通过出站接口和下一跳地址定义的静态路由,但是Brocade坚持使用另一种。我们删除了下一跳地址并保留了接口。后来,我们了解了我们的方法的错误,并从接口更改为下一跳地址,但一切似乎都在最初开始起作用。

是Cisco,并且具有以下路由。

+----+ iface0    +----+
| R1 |-----------| R2 |---> (10.1.0.0/16 this way)
+----+.1       .2+----+
      10.0.0.0/30



ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2


R2是Cisco路由器,并且Cisco路由器默认执行代理ARP。这是生产中的(错误)配置,为后来的ARP缓存溢出奠定了基础。


R1接收发往10.1.0.0/16网络的数据包。
基于静态接口路由,iface0上用于目的地的R1 ARP
R2识别出它可以到达目的地,并用自己的MAC响应ARP。 /> R1缓存将远程网络中的IP与R2的MAC相结合的ARP结果。

在10.1.0.0/16中的每个不同的目的地都会发生这种情况。因此,即使/ 16已正确地划分为R2以外的子网,并且在链接R1和R2的链路上只有两个节点,R1也会遭受ARP缓存过载,因为R1会导致R2的行为就像直接连接所有65k地址一样。 br />
之所以问这个问题,是因为我希望它能帮助我理解网络服务故障报告(几天后),这些报告最终导致了我们的ARP缓存溢出。本着StackExchange模型的精神,我试图将其提炼为我认为是一个可以客观回答的明确而具体的问题。数据链路层(第2层)和网络(第3层)之间的连接层,而不是数据链路层内的MAC转发表。主机或路由器将前者构建为将IP地址映射到MAC地址,而交换机将后者构建为将IP地址映射为端口。为什么某些实现不受ARP缓存溢出的困扰,我认为解决这个问题很重要,对于这个问题。问题是“什么时候会发生”,而不是“供应商X容易受到影响”。现在,我通过描述一个具体示例来完成自己的工作。

编辑3这不是另一个问题,即“如何防止ARP缓存溢出?”

评论

您是否在寻找有关mac地址表或ARP表溢出的信息?

您能否详细说明一下arp表将如何溢出?这与一个真正的问题有关,还是纯粹是假设的?无论哪种方式,我们都需要详细了解我们要应对的确切情况

@MikePennington这是一个真正的问题。例如,如果单个链接上存在大量IP,或者它们的行为就好像ARP缓存可能会溢出。

除非ARP来自路由器上配置的子网,否则Cisco IOS不会在路由器上缓存ARP。当我说“真正的问题”时,我的意思是您遇到的问题...不是您想象的问题可能发生的

感谢您改写这个问题,因为当我想到交换机(第2层)时,您没有ARP表。 ARP与TCP / IP有关,而第2层交换机则没有这样的想法,但是当您进入第3层交换机时,您可能会有ARP表。但是,如果我没记错的话,第3层交换机上的接口必须具有IP地址才能显示在ARP表中。起初我真的不明白您在说什么,清晨的客人对我很刻薄。我的程序员认为,一旦ARP表已满,它将崩溃,覆盖或删除任何新的ARP条目pro

#1 楼

编辑2:

正如你提到的...好像它直接连接到iface0一样。这样做,您可以防止Brocade对所有10.1.0.0/16的ARP进行ARP寻址(请注意,您可能需要将R1和R2之间的链接重新编号为在10.1.0.0/16之外,具体取决于Brocade对事物的实现。)


原始答案:即使是所有实施,ARP表的容量也有硬限制。


Cisco IOS CPU路由器仅受路由器中DRAM数量的限制,但这通常是不会成为限制因素。某些交换机(例如Catalyst 6500)对邻接表(与ARP表相关)有严格的限制。 Sup2T具有1百万个邻接。



那么,当ARP高速缓存已满并且提供了未缓存的目的地(或下一跳)数据包时,会发生什么? />

Cisco IOS CPU路由器不会在ARP表中用完空间,因为这些ARP存储在DRAM中。假设您正在谈论Sup2T。像这样想,假设您有一个Cat6500 + Sup2T并配置了所有Vlan,从技术上讲,这是

ip route 10.1.0.0 255.255.0.0 iface0


假设每个Vlan为/ 24(因此这是252种可能的ARP),并且您将每个Vlan都打包了...这就是一百万个ARP条目。 ARP表本身中的内存,以及IOS邻接表。我不知道这是什么,但可以说ARP总开销为10字节...

这意味着您现在已经消耗了10MB的ARP开销。它仍然不是很大的空间...如果您的内存不足,您会看到类似%SYS-2-MALLOCFAIL的内容。平均每秒将近70个ARP;维护100万个ARP条目很可能会耗尽路由器的CPU(可能是CPUHOG消息)。

此时,您可以开始退回路由协议邻接,并获得IP无法访问的IP。因为路由器CPU太忙,无法使用ARP来获取IP。

#2 楼

我只有这种情况的实际经验是在C3550交换机上(2-8k MAC限制,取决于sdm模板),它从表中删除了最早的条目。

评论


听起来您正在谈论的是MAC转发表,而不是ARP缓存。请看我的编辑。

–neirbowj
13年7月15日在14:09

我明白你的意思了。但是,在这种特殊情况下,其效果与这些交换机还是许多大型IP子网的L3终端相同。最终通过更换开关解决了。在L2上,交换机将无法为其缓存MAC,但在L3上,它必须丢弃较旧的ARP条目和/或ARP(对于每个数据包),这将使这些CPU迅速耗尽。

–user661
13年7月15日在19:02



#3 楼

幸运的是,对于IOS,JunOS和其他商用堆栈,这并不是很难。它们的行为源代码。

在Linux中,您需要检查'net / core / neighbour.c'(以'if(entries> = tbl-> gc_thresh3'||'行开始)和'net / ipv4 / arp.c'。
在Linux中,您似乎拥有三个完整级别。可以立即被击中
gc_thresh3-无法超过此大小

当gc_thresh3试图超过该大小时,它将尝试强制运行垃圾回收,除非最近已经运行过。删除不再引用的条目,因此并不意味着最旧或最新,但是gc_staletime超出似乎是取消引用条目的一种方法,这又转换为最旧的条目。
如果无法运行垃圾收集,请重新输入y根本不添加。所有这些gc_threshN和定期垃圾收集间隔都可以调整。
该代码与地址族(ipv4,ipv6)无关,因此IPv6 ND和IPv4 ARP表由完全相同的代码路径而非重复路径来处理。 />

#4 楼

IP地址会将它存储在表中,并且根据实现的不同而删除最旧的条目。对性能的影响取决于(如果这种情况很少发生)影响不大,但这是一种攻击媒介,因此有人可以发送大量会影响处理器利用率的arps

#5 楼

交换机将使用ARP来获取该目标IP的MAC地址(该MAC地址还将用响应填充CAM表)。 ARP请求广播到所有端口。这需要CPU并涉及ARP Input进程。如果ARP请求针对同一IP,则由于ARP表频繁溢出,交换机应将ARP速率限制为每两秒一次。如果请求足够频繁地随机分配IP,则ARP请求和响应中都会涉及该CPU,因此CPU可能会峰值。

评论


您在哪里找到“每两秒钟一次”的限制?

– Marco Marzetti
13年7月19日在21:00

“对同一IP地址的ARP请求每两秒钟限制为一个请求的速率” –cisco.com/en/US/products/hw/routers/ps359/…

–generalnetworkerror
13年7月20日在7:33

它不是C7500的特定值吗?例如,C6500可以使用“ mls qos协议arp Police ”命令或CoPP。

– Marco Marzetti
13年7月22日在7:44

#6 楼

从我在Cisco 3550、3560等交换机上了解到的攻击中,一旦MAC地址限制过载,您就可以将它们变成巨型集线器。交换机具有可以存储的设置的MAC地址限制(大约6000),一旦达到该限制,它将会将所有数据泛洪到其接口之外。不记得那是否适用于802.1q数据包,因为我已经很长时间没有这样做了。可能必须在家中启动我的网络实验室才能找到答案。

评论


听起来您在谈论的是MAC转发表,而不是ARP缓存。请看我的编辑。

–neirbowj
13年7月15日在14:10