我有一个客户机(Ubuntu 14.04.2 LTS)的configuration,直接连接到两台服务器机器。 服务器机器 – 在同一个子网上 – 不能路由到对方。 数据包不能在客户端的eth1和eth2之间路由(也就是说,客户端不是路由器),并且由于涉及发现行为,路由表不能用serverX IP进行预编程。
下面是一个粗略的图表。 eth0不能路由到子网172.16.37.0/24 ,所以eth0不在此图中。 没有防火墙( iptables和ufw都是干净的哨子)。
客户端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, 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通会话时,它会不断重试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操作都按预期工作。 但是,我不能预先编程主机路由,因为我需要发现连接的机器 – 我拥有的是活动接口及其子网。
testingeth2时eth1上没有接收到数据包(我几乎观察到了所有的接口)。 同样值得注意的是,这个问题在eth1中不会发生。 它能够在没有主机路由条目的情况下正确地ping -I eth1 (并且由于路由sorting,在这种情况下-I选项是过度的,但是通常我不能依赖表的顺序)。
为什么不是应用程序(在一种情况下,ARPcaching;另一个ping )接收数据包? 我怎样才能追踪数据的走向? 一切似乎都运行正常,直到数据包应该交付给应用程序。