QEMU运行Raspbian Buster Lite时Ping主机出现DUP响应问题咨询
调试Qemu Raspbian虚拟机Ping重复包问题
首先我注意到你的Qemu启动命令里重复使用了-net user参数:
qemu-system-arm -kernel kernel-qemu-4.19.50-buster -cpu arm1176 -m 256 -M versatilepb -dtb versatile-pb.dtb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -drive "file=2020-02-13-raspbian-buster-lite.img,index=0,media=disk,format=raw" -net user,hostfwd=tcp::5022-:22 -net nic -net user,smb=/dev/shm/
这种配置会创建两个独立的用户网络栈,这大概率是导致ping包重复(DUP!)的核心原因——数据包会从两个虚拟网络路径发送,主机回复后也会通过两个路径返回虚拟机,从而产生重复包。
下面是具体的调试和修复步骤:
1. 先修复Qemu网络配置
首先合并重复的-net user参数,把端口转发和SMB共享放到同一个用户网络配置里,修改后的命令应该是:
qemu-system-arm -kernel kernel-qemu-4.19.50-buster -cpu arm1176 -m 256 -M versatilepb -dtb versatile-pb.dtb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -drive "file=2020-02-13-raspbian-buster-lite.img,index=0,media=disk,format=raw" -net nic -net user,hostfwd=tcp::5022-:22,smb=/dev/shm/
注意顺序:先指定-net nic创建虚拟网卡,再用-net user绑定用户网络并配置所有参数,避免重复创建网络栈。重启虚拟机后测试ping是否还出现重复包。
2. 检查虚拟机内的网络接口
在虚拟机内执行以下命令,确认是否存在多个以太网接口:
ip addr show
如果看到eth0和eth1两个接口,说明之前的重复-net user确实创建了多个虚拟网卡,这会导致路由和数据包转发的冲突。修复配置后应该只剩一个eth0。
3. 抓包分析数据包流向
如果修复配置后问题仍存在,用抓包工具确认重复包的来源:
- 虚拟机内抓包:执行
tcpdump -i eth0 icmp,观察ping请求的发送次数和回复包的数量,看是否每个请求对应多个回复。 - 主机上抓包:在主机终端执行
tcpdump -i any host 10.0.0.138 and icmp,查看主机收到的ping请求数量,以及主机发送的回复数量,确认是否有重复的请求或回复被转发。
4. 检查ARP缓存表
在虚拟机内查看ARP缓存,确认目标网关的MAC地址是否唯一:
arp -a
如果同一个IP(10.0.0.138)对应多个MAC地址,可能是主机侧有多个网络接口响应了ARP请求,导致虚拟机收到多个回复。此时可以在主机上临时禁用多余的网络接口,测试是否解决问题。
5. 验证主机路由与防火墙
- 检查主机的路由表,确认是否有多个路由条目指向虚拟机所在的子网:
# Linux主机 ip route show # Windows主机 route print - 检查主机防火墙规则,确认是否有重复的转发规则导致数据包被多次处理:
# Linux主机 sudo iptables -L -n -v
6. 升级Qemu版本
部分旧版本的Qemu在多用户网络配置下存在数据包重复的bug,尝试升级到最新稳定版,再测试问题是否消失。
内容的提问来源于stack exchange,提问作者AutomatedOwl
相关产品推荐
相关产品推荐

