我有一个客户端计算机 (Ubuntu 14.04.2 LTS) 配置,它直接连接到两台服务器计算机。服务器计算机(虽然位于同一子网)无法相互路由。数据包也不能在客户端和之间路由eth1
(eth2
即客户端不是路由器),并且由于涉及发现操作,因此无法使用 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
)没有收到数据包?我如何才能追踪数据的去向?一切似乎直到数据包被传送到应用程序为止都能正常运行。