这个问题和这个问题很相似:
主要问题- Ubuntu服务器发送ARP请求,请求在不同子网上的主机的MAC地址。
一个路由器有四个不同的C类网络物理连接。没有VLAN或任何其他分离。
路由器在四个C类子网的每个子网中都有一个IP地址。这就是允许在这四个子网之间进行路由的原因。
Ubuntu服务器具有IP地址x.x.250.2。
当对一个不同的子网(x.x.249.x)执行ping时,有些请求是成功的,而另一些则不成功。如果不是,Wireshark (在Ubuntu服务器上运行的数据包嗅探器)显示它正在发送ARP数据包(“谁有IP x.x.249.x?")
为什么会发生这种事?不应该从服务器发送ARP数据包,这些数据包的目的地不是同一子网上的某个东西。
服务器上的网络配置是x.x.250.2。子网掩码为255.255.255.0。网关是x.x.250.1。静态设置。
路由表没有被修改,这只是默认的:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 x.x.250.1 0.0.0.0 UG 0 0 0 eth0
x.x.250.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0Linux服务器上的arp缓存显示x.x.249.x和x.x.250.x网络中系统的许多MAC地址。同样,这种情况不应该发生。
现在-一台Windows计算机被用于测试目的。放入与Linux服务器相同的子网中。它可以在x.x.249.x子网中平那些Linux服务器不能的地址。
Ubuntu/Linux的TCP堆栈中肯定存在某种潜在的错误。向其他网络/子网发送ARP数据包不应该发生。
发布于 2015-11-26 05:56:43
这个问题已经解决了。
很明显,Linux并不像Windows机器那样完全按照TCP堆栈的规则进行操作。
我重新启动了Linux服务器。对有问题的IP地址执行ping操作(x.x.249.76)。
从路由器(x.x.250.1)收到一个ICMP重定向,它说:“嘿,你可以直接和x.x.249.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服务器完全忽略任何ICMP重定向。
服务器重新启动。启动pingx.249.76和重定向通知仍被接收,但被忽略,服务器继续成功地平分IP地址。
https://serverfault.com/questions/739065
复制相似问题