这个问题与这个问题非常相似:
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地址。