情况:服务器 A 正在接收从服务器 B 发送到服务器 C 的网络流量。服务器 B 和 C 通过 MySQL 转储发送。流量相当大。出于某种原因,服务器 A 上的接口正在测量此流量。但它没有对此做任何事情,只是看到它。
当我运行 tcpdump 时,我看到 mysql 数据包的源和目标是服务器 B 和服务器 C。从来不是服务器 A。
12:52:44.482026 IP $IP_server_B.3306 > $IP_server_A.38662:标志 [.],seq 15905879:15911671,ack 8910,win 62,选项 [nop,nop,TS val 237711415 ecr 331318504],长度 5792
我仔细检查了通过转储发送的脚本,服务器 A 的 IP 不在其中。我检查了是否存在 IP 冲突 - 没有。所有 3 台机器上的接口都有不同的 MAC 地址(只是想排除所有可能性)。我可以 10 次中有 10 次在这些机器上重现该行为。
所有 3 台机器都是虚拟 CentOS 6 x64 安装。服务器 A 和 B 位于同一子网中,服务器 C 位于完全不同的数据中心和网络中。注意:服务器 A 和 B 位于同一子网中,但不在同一个物理虚拟机管理程序上运行。
那么,问题是:服务器 A 究竟如何看到该流量?
答案1
如果服务器 A 和 B 连接到简单的集线器而不是更智能的交换机,则所有流量都将广播到所有连接的机器。然后由机器决定它们收到的流量是发给自己的还是应该忽略它。默认情况下,Tcpdump 会将您的接口置于混杂模式,这意味着它不会忽略任何流量,即使是没有发往它的流量。这就是为什么使用 Tcpdump 可以看到集线器上的所有流量。