用两个接口ping相同的子网,直接连接到两个单独的主机

我有一个客户机(Ubuntu 14.04.2 LTS)的configuration,直接连接到两台服务器机器。 服务器机器 – 在同一个子网上 – 不能路由到对方。 数据包不能在客户端的eth1eth2之间路由(也就是说,客户端不是路由器),并且由于涉及发现行为,路由表不能用serverX IP进行预编程。

下面是一个粗略的图表。 eth0不能路由到子网172.16.37.0/24 ,所以eth0不在此图中。 没有防火墙( iptablesufw都是干净的哨子)。

     客户端server01
 + ------------------- + + ------------------- +
 |  172.16.37.53 eth1- | ---------- | -eth1 172.16.37.11 |
 |  |  + ------------------- +
 |  |  Server02上
 |  |  + ------------------- +
 |  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从不响应(并且arpcaching不更新)

如果我从客户端发送无偿ARP, arping -A -I eth2 172.16.37.54从客户端发出arping -A -I eth2 172.16.37.54 ,则观察结果是:

  • client:eth2发出ping请求
  • server02:eth1收到ping请求
  • server02:eth1发出ping-reply到客户端
  • client:eth2收到ping-reply
  • ping应用程序从不接收包

当我ping通会话时,它会不断重试recvmsg ; 什么都没有显示在sockets上。

这里是上述观察的路由表:

 $ route -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添加一个主机路由到路由表中,那么ARPparsing和ping操作都按预期工作。 但是,我不能预先编程主机路由,因为我需要发现连接的机器 – 我拥有的是活动接口及其子网。

testingeth2eth1上没有接收到数据包(我几乎观察到了所有的接口)。 同样值得注意的是,这个问题在eth1中不会发生。 它能够在没有主机路由条目的情况下正确地ping -I eth1 (并且由于路由sorting,在这种情况下-I选项是过度的,但是通常我不能依赖表的顺序)。

为什么不是应用程序(在一种情况下,ARPcaching;另一个ping )接收数据包? 我怎样才能追踪数据的走向? 一切似乎都运行正常,直到数据包应该交付给应用程序。