我在现实世界和 KVM VM 客户机之间有一个标准桥接设置。
桥接看起来不错:
[root@t ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.40f2e9c6033d no eno2
vnet0
virbr0 8000.000000000000 no
主机上的默认网关是 br0。
我可以从主机 ping 通虚拟机,也可以从虚拟机 ping 通主机。
如果我从虚拟机或主机本身对外部的任何内容进行 ping 操作,我会看到间歇性数据包丢失:
[root@locoxen2 ~]# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=4.59 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=4.59 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=4.67 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=55 time=4.75 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=55 time=4.69 ms
64 bytes from 8.8.8.8: icmp_seq=15 ttl=55 time=1224 ms
64 bytes from 8.8.8.8: icmp_seq=16 ttl=55 time=224 ms
64 bytes from 8.8.8.8: icmp_seq=17 ttl=55 time=4.49 ms
64 bytes from 8.8.8.8: icmp_seq=18 ttl=55 time=4.48 ms
64 bytes from 8.8.8.8: icmp_seq=19 ttl=55 time=4.54 ms
64 bytes from 8.8.8.8: icmp_seq=20 ttl=55 time=4.52 ms
64 bytes from 8.8.8.8: icmp_seq=21 ttl=55 time=4.55 ms
64 bytes from 8.8.8.8: icmp_seq=22 ttl=55 time=4.70 ms
64 bytes from 8.8.8.8: icmp_seq=23 ttl=55 time=4.57 ms
64 bytes from 8.8.8.8: icmp_seq=24 ttl=55 time=4.88 ms
64 bytes from 8.8.8.8: icmp_seq=25 ttl=55 time=4.65 ms
64 bytes from 8.8.8.8: icmp_seq=26 ttl=55 time=4.53 ms
64 bytes from 8.8.8.8: icmp_seq=36 ttl=55 time=1430 ms
64 bytes from 8.8.8.8: icmp_seq=37 ttl=55 time=430 ms
64 bytes from 8.8.8.8: icmp_seq=38 ttl=55 time=4.57 ms
64 bytes from 8.8.8.8: icmp_seq=39 ttl=55 time=4.53 ms
当流量同时离开虚拟机和主机时,尤其会发生这种情况。
如果我关闭虚拟机(即确保桥接器此侧没有流量),则当我从主机 ping 时不会看到数据包丢失,如上所述。
在主机的物理端口 (eno2) 上运行 tcpdump 并同时从主机和虚拟机执行 ping 操作时,会显示如下内容(40:f2 是主机,52:54 是虚拟机):
17:53:26.382679 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 23, length 64
17:53:27.200397 52:54:00:16:f5:f4 > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.221 > 8.8.8.8: ICMP echo request, id 11460, seq 2, length 64
17:53:27.382244 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 24, length 64
17:53:28.200304 52:54:00:16:f5:f4 > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.221 > 8.8.8.8: ICMP echo request, id 11460, seq 3, length 64
即数据包出去了,但是却收不到回复。
相同,但没有来自虚拟机的流量,或者虚拟机已关闭:
17:53:05.346226 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 2, length 64
17:53:05.350936 e8:f7:24:49:49:ee > 40:f2:e9:c6:03:3d, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.191: ICMP echo reply, id 27485, seq 2, length 64
17:53:06.348159 40:f2:e9:c6:03:3d > e8:f7:24:49:49:ee, ethertype IPv4 (0x0800), length 98: 192.168.0.191 > 8.8.8.8: ICMP echo request, id 27485, seq 3, length 64
17:53:06.352855 e8:f7:24:49:49:ee > 40:f2:e9:c6:03:3d, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.191: ICMP echo reply, id 27485, seq 3, length 64
iptables 和 ebtables 没有显示任何规则 - 所有内容都设置为“接受”。我已关闭端口上的所有卸载功能。未使用绑定。MAC 地址是唯一的 - 我感觉不到任何重叠。
请注意,我在 CentOS6 和 7 主机安装中都看到了这一点。
我忽略了什么?
答案1
我遇到了同样的问题,但根本问题不同。我在尝试诊断问题时遇到了这个问题,并决定留下另一个可能的罪魁祸首的答案,特别是当从命令行运行 KVM/qemu 时,以便其他可能从此信息中受益的人。
如果您没有明确设置虚拟网络接口的 MAC 地址,qemu 将为其分配一个默认 MAC 地址。如果您正在运行多个虚拟机,但尚未在其网络接口上设置 MAC 地址,qemu 几乎肯定会为它们分配相同的 MAC 地址。(请注意,大多数 GUI KVM 包装器(如 virt-manager)将为您分配一个随机 MAC 地址。)
显然,这会对虚拟机之间的第 2 层路由造成严重破坏,并且它们会争夺地址所有权。
为每个主机提供不同的 MAC 地址解决了这个问题。
答案2
最终,我的设置没有任何问题。
问题在于上游网络交换机未设置为在相关交换机端口上使用静态 VLAN。它所看到的多个 MAC 地址导致人们搞不清楚应该将哪些 VLAN 分配给端口。
真烦人啊!