ARP请求从Ubuntu Linux发送到不同的子网

这个问题与这个问题非常相似:

Linux正在向其他子网中的主机发送ARP请求?

主要问题 – Ubuntu Linux服务器正在发送ARP请求,要求在不同子网上的主机的MAC地址。

一台路由器有四个不同的C类物理networking。 没有VLAN或任何其他分离。

路由器在四个C类子网的每一个中都有一个IP地址。 这就是允许四个子网之间的路由。

Ubuntu Linux服务器的IP地址为xx250.2。

当对不同的子网(xx249.x)之一进行ping时,有一些请求是成功的,而另一些请求是不成功的。 Wireshark(在Ubuntu Linux服务器上运行的数据包嗅探器)显示它正在发送ARP数据包(“谁有IP xx249.x?”)

为什么会发生? 不应该从服务器发送的ARP数据包发往不在同一子网上的东西。

networkingconfiguration在服务器上是xx250.2。 子网掩码是255.255.255.0。 网关是xx250.1。 静态设置。

路由表尚未被修改,只是这个的默认值:

Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 xx250.1 0.0.0.0 UG 0 0 0 eth0 xx250.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 

Linux服务器上的arpcaching显示了xx249.x中的系统以及xx250.xnetworking的许多MAC地址。 再次,这不应该发生。

现在 – 一台Windows XP电脑被用于testing目的。 放入与Linux服务器相同的子网中。 它可以ping那些Linux服务器不能的xx249.x子网中的地址。

Ubuntu / Linux的TCP堆栈中肯定存在某种潜在的错误。 发送到其他networking/子网的ARP数据包不应该发生。

这已经解决了。

Linux显然并不像Windows机器那样通过TCP栈的常规规则发挥作用。

我重新启动了Linux服务器。 ping了一个有问题的IP地址(xx249.76)。

从路由器(xx250.1)收到一个ICMPredirect,他说:“嘿,你可以直接和xx249.76对话,你不需要经过我。”一旦收到,ping响应超时并退出。

路由器是一个MicroTik路由器,我敢打赌它也是基于Linux的。

由于这四个子网都在同一个路由器上,MikroTik设备认为它不需要中继这些消息。 错误。

解决方法是更新/etc/sysctl.d/10-network-security.conf文件,并添加这些行:

 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 

这告诉我的Linux服务器完全忽略任何ICMPredirect。

服务器已重新启动。 开始ping xx249.76和redirect通知仍然收到,但被忽略,服务器继续成功ping IP地址。