情况是,在 kvm/libvirt/qemu ( 10.202.7.128
) 下运行的 VM 通过虚拟机管理程序的桥接器 ping 另一个基于硬件的系统 ( 10.202.7.4
)。一切正常,但'tcpdump -neli any icmp and host 10.202.7.128'
每个请求显示三个条目:
14:42:39.921785 P 52:54:00:14:71:1b
ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 2485, seq 1, length 64
第二项与第一项完全相同,只是P
被 替换为"Out"
,第三项与第一项完全相同。接下来是来自同一 MAC 地址的三个回复,10.202.7.4
唯一的区别是P
、Out
、P
序列。
为什么每次 ping 都会有三个条目,P
方向中的 是什么意思?我在网上搜索无果,除非我搜索错了。
更新:
根据 Zoredache 的回答,我将接口规范调整为三个相关项:(vnet5
虚拟机管理程序上的客户虚拟机网卡)、br0
(虚拟机管理程序的桥接器)和eno1
(被标识为桥接器桥接端口的物理网卡),并在测试每个接口时为每个 ping 获得一个请求/回复,因此我(大胆地)猜测这就是三个条目使用“任何”的原因。我仍然对 、 、 的顺序感到困惑,P
有P
什么 见解吗?Out
P.
进一步更新(我要感谢 Anton 的研究,非常感谢。)
使用四个 tcpdump 规范再次运行测试,所有规范都'-neli <interface> icmp and host 10.202.7.128'
带有接口vnet5
、br0
和eno1
“ any
”。注意时间戳以确定哪个“ any
”条目与各个接口条目匹配。
“任何”结果(vnet5/10.202.7.128
是52:54:00:a2:bd:48
、10.202.7.4
是b0:00:b4:02:93:6e
)
00:06:57.775050 P 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775074 Out 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775050 P 52:54:00:a2:bd:48 ethertype IPv4 (0x0800), length 100: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 P b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
00:06:57.775956 Out b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
00:06:57.775940 P b0:00:b4:02:93:6e ethertype IPv4 (0x0800), length 100: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
vnet5 结果
00:06:57.775050 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775956 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
br0 结果
00:06:57.775050 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
eno1 结果
00:06:57.775074 52:54:00:a2:bd:48 > b0:00:b4:02:93:6e, ethertype IPv4 (0x0800), length 98: 10.202.7.128 > 10.202.7.4: ICMP echo request, id 27288, seq 1, length 64
00:06:57.775940 b0:00:b4:02:93:6e > 52:54:00:a2:bd:48, ethertype IPv4 (0x0800), length 98: 10.202.7.4 > 10.202.7.128: ICMP echo reply, id 27288, seq 1, length 64
时间戳775050
对应于vnet5
和br0
,即预期的第一个“跳跃”(vnet5
到br0
)。775074
对应于eno1
是预期的第二个“跳跃”(br0
到eno1
)。 我无法解释第二个775050
条目的重复,因为它仍然是一个请求。
时间戳775940
对应于eno1
和br0
,即回复(eno1
至br0
)的预期第一个“跳跃”。775956
时间戳对应于vnet5
,即回复(br0
至vnet5
)的预期第二个“跳跃”。同样,我无法解释第二个条目的重复,775940
因为它仍然是回复。
最后要注意的是,两个“ Out
”条目均指br0
传输到接口(eno1
出站、vnet5
入站)。
如果有人对这两条条目的重复有解释,请回复。
答案1
我看过了源代码的tcpdump
。
数据包类型字段含义:
In
- 数据包发往主机Out
- 传出数据包B
- 播送M
- 多播P
- 数据包发往其他主机
更新
由于选项tcpdump
导致输出中出现重复的数据包。-i any
当以太网帧通过 Linux 桥接器并使用-i any
tcpdump 选项时,您将多次看到此帧。第一次在输入接口上看到该帧(vnet5
),第二次在桥接器接口本身上看到该帧(br0
),第三次在输出接口上看到该帧(eno1
)。在桥接器接口上看到传输帧是 Linux 内核中以太网桥接实现的副作用。
此外,当桥接接口有多个端口(从属接口)时,在某些情况下,当以太网帧被淹没时,您会在每个端口上看到帧的副本。广播、多播和未知单播帧都会发生这种情况。
答案2
您的大部分重复都是由-i any
您传递的选项引起的。
当你这样做时,tcpdump 将在每个接口上进行捕获,如果是路由器、网桥或某些在接口之间转发数据包的设备,它将返回数据包的副本每一个它击中的界面。
我不太熟悉 KVM,但我相信如果您有 2 个通过桥接接口连接的虚拟机,则每个虚拟机都会有一个虚拟接口和桥接接口。
无论如何,如果您不想出现重复,请通过为选项提供特定接口的名称将 tcpdump 限制为单个接口-i
。尽管对于某些问题,您可能实际上想要所有接口,在这种情况下,您只需了解您将会看到重复。