两个接口、同一子网、直接连接到两个独立主机时出现 Ping 问题

两个接口、同一子网、直接连接到两个独立主机时出现 Ping 问题

我有一个客户端计算机 (Ubuntu 14.04.2 LTS) 配置,它直接连接到两台服务器计算机。服务器计算机(虽然位于同一子网)无法相互路由。数据包也不能在客户端和之间路由eth1eth2即客户端不是路由器),并且由于涉及发现操作,因此无法使用 serverX IP 预先编程路由表。

下面是一个粗略的图表。eth0由于无法路由到子网,因此未包含在该图中172.16.37.0/24。 没有防火墙(iptables和都ufw干净整洁)。

     客户端服务器01
+-------------------+ +-------------------+
| 172.16.37.53 eth1-|----------|-eth1 172.16.37.11 |
| | +-------------------+
| | 服务器02
| | +-------------------+
| 172.16.37.54 eth2-|----------|-eth1 172.16.37.12 |
+----------------- + +-------------------+

我遇到的问题是ping -I eth2 172.16.37.12无法从客户端机器上运行。简而言之,我观察到的情况tcpdump是:

  • client:eth2发出 ping 请求
  • server02:eth1收到 ping 请求
  • server02:eth1发出 ARP 请求172.16.37.54
  • client:eth2收到 ARP 消息
  • ARP 从不响应(并且 arp 缓存未更新)

如果我从客户端发送免费 ARP arping -A -I eth2 172.16.37.54,则观察结果如下:

  • client:eth2发出 ping 请求
  • server02:eth1收到 ping 请求
  • server02:eth1向客户端发出 ping 回复
  • client:eth2收到 ping 回复
  • ping 应用程序从未收到数据包

当我strace结束 ping 会话时,它会不断重试recvmsg;套接字上没有显示任何内容。

以下是上述观察的路由表:

$ 路线-n
内核 IP 路由表
目标网关 Genmask 标志 指标参考使用 Iface
0.0.0.0 172.16.187.2 0.0.0.0 UG 0 0 0 eth0
172.16.37.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.16.37.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
172.16.187.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

如果我将主机路由添加到 的路由表中172.16.37.12 -> eth2,则 ARP 解析和 ping 操作都会按预期工作。但是,我无法预先编程主机路由,因为我需要发现连接的机器——我所拥有的只是活动接口及其子网。

eth1测试时未收到数据包eth2(我几乎监视了所有接口)。还值得注意的是,这个问题不会发生在 上eth1;它能够ping -I eth1在没有主机路由条目的情况下正确运行(并且由于路由排序,-I在这种情况下选项过多,但通常我不能依赖表的顺序)。

为什么应用程序(一种是 ARP 缓存;另一种是ping)没有收到数据包?我如何才能追踪数据的去向?一切似乎直到数据包被传送到应用程序为止都能正常运行。

相关内容