我在笔记本电脑上使用 GNOME Boxes。每当笔记本电脑在网络(以太网、不同位置的 Wi-Fi 或作为 USB 调制解调器的手机)之间移动时,访客计算机会自动使用默认设置获得 Internet 连接。
来宾计算机未与主机桥接,并且在主机的 LAN 上不可见,这意味着访客的 MAC 地址被覆盖在将帧传递到主机的 LAN 之前。
默认情况下,QEMU 将创建一个 SLiRP 用户网络后端和适合访客的虚拟网络设备......
用户网络使用“slirp”实现,它在 QEMU 内提供完整的 TCP/IP 堆栈,并使用该堆栈来实现虚拟 NAT 网络。
QEMU 最后也是最奇怪的网络选项也是它的默认选项。它的作用是连接一个“用户模式网络堆栈“到 vlan。该网络堆栈是 ip、tcp、udp、dhcp 和 tftp(等)协议的独立实现。它可以通过例如响应具有有效地址的 dhcp 请求、响应 tftp 来处理来自 vlan 的帧使用来自主机文件系统的文件或通过创建可以转发数据包数据的 udp/tcp 套接字来请求。
请注意,该网络堆栈在 qemu 进程本身内运行。例如,没有单独的 dhcp 或 tftp 进程来处理这些请求。此外,堆栈通过从 udp/tcp 数据包解压应用程序数据并通过连接 qemu 进程和目标进程的套接字转发它们,有效地充当代理。
请注意,在上面的上下文中,“vlan”代表“模拟”LAN,它并不意味着 IEEE 802.1Q VLAN ID。
默认情况下,来宾在 10.0.2.0/24 网络上拥有 10.0.2.15 IP 地址。网关是10.0.2.2。 DNS服务器是10.0.2.3。访客可以通过连接 10.0.2.2 网关 IP 来访问主机。
在特定的 Wi-Fi 网络中,所有访客计算机都无法访问互联网。我发现另一个关于缺乏互联网的问题在 QEMU 下的来宾中,它发现 DNS 在某些设置下可能无法开箱即用。所以,我检查了我的。我可以通过访客的 IP 访问网站。此外,如果我手动配置 IPv4 连接,并且除了默认的 10.0.2.3 之外,添加另一个已知解析器(例如 8.8.8.8)作为备份,解析也会恢复。
据当地管理员介绍,该 Wi-Fi 网络启用了 VLAN 标记,可将本地计算机与访客计算机分开。显然,如果 VLAN 是一个问题,它会导致互联网访问完全丧失,而不仅仅是解决问题。
该网络的另一个特殊性是第一个 DNS 解析器被配置为拒绝大多数请求。提供了第二个解析器 8.8.8.8,但显然 QEMU 没有使用。
该问题在不同设备上仍然存在。我尝试了两台完全不同的配备英特尔无线技术的笔记本电脑。至少自 10.4 起,Debian“Buster”、“Bullseye”和“Sid”中就发现了该问题。
答案1
在默认的“用户模式”网络中,QEMU 仅使用主机中的第一个 DNS 名称服务器。因此,如果该名称服务器无法正确解析,QEMU 将不会回退到可能在主机上配置为辅助名称服务器的任何其他名称服务器。这会导致访客明显失去互联网连接,而主机仍然可以使用其后备名称服务器“隐藏”问题。
这是已知的 QEMU 行为,预计不会在 QEMU 中修复。这是来自一个人的引用2011 年的 Debian Bug 报告日志#625689:
不,该限制尚未记录在案,而且也很难修复,或者可能真的不值得麻烦。有两个原因。首先,用户模式网络不适合任何严肃的事情,您确实需要使用网桥进行分流网络,这大约快 100 倍并且实际上有效(例如 ICMP)。其次,实现相当简单 - 对于 DNS,它仅将数据包从来宾转发(如 NAT 盒)从主机 /resolv.conf 到名称服务器 - 只有一个名称服务器,因为您无法同时 NAT 到两个目的地。因此,为了解决这个问题,qemu 必须成为 DNS 的应用程序级代理,而不是简单的 NAT“设备”。
通过在主机上nameserver
首先添加一些垃圾,可以很容易地重现该问题。/etc/resolv.conf
客人立即停止解决。
对于 Debian 客户机,要恢复网络,只需将另一个已知解析器(例如 8.8.8.8)添加到 即可/etc/resolv.conf
。此类配置更改在客户机重新启动后不会保留。