如何在 QEMU 中转发互联网连接?

如何在 QEMU 中转发互联网连接?

按照有关如何启动的描述带有 QEMU 的 OpenWrt 虚拟机,我下载了MIPS内核并使用以下命令启动它:

qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256

但是虚拟机中没有互联网连接:

root@(none):/# ping google.com
ping: bad address 'google.com'

如何在 QEMU 中使用主机互联网连接?

编辑

正如评论中所建议的,ping不会工作,因为它使用 ICMP。但使用时wget出现如下错误:

root@OpenWrt:~# wget http://google.com/
Downloading 'http://google.com/'
Failed to send request: Operation not permitted

网络配置如下所示:

root@OpenWrt:~# ifconfig
br-lan    Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
          inet6 addr: fd02:a553:49cb::1/60 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1248 (1.2 KiB)  TX bytes:2822 (2.7 KiB)

eth0      Link encap:Ethernet  HWaddr 52:54:00:12:34:56
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1290 (1.2 KiB)  TX bytes:2822 (2.7 KiB)
          Interrupt:10 Base address:0x1060

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:528 errors:0 dropped:0 overruns:0 frame:0
          TX packets:528 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:40288 (39.3 KiB)  TX bytes:40288 (39.3 KiB)

答案1

由于OP没有提供任何网络设置:

qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256

这将选择最小用户模式,如中所述QEMU 的网络基础知识:

QEMU 内的网络有两个部分:

  • 提供给来宾的虚拟网络设备(例如 PCI 网卡)。
  • 与模拟 NIC 交互的网络后端(例如将数据包放入主机网络)。

每个部分都有一系列选项。默认情况下,QEMU 将为来宾创建一个 SLiRP 用户网络后端和一个适当的虚拟网络设备(例如,为大多数 x86 PC 来宾提供 E1000 PCI 卡),就像您-net nic -net user在命令行中键入一样。

用户态网络从VM的角度来看是这样的:

guest (10.0.2.15)  <------>  Firewall/DHCP server <-----> Internet
                      |          (10.0.2.2)
                      |
                      ---->  DNS server (10.0.2.3)
                      |
                      ---->  SMB server (10.0.2.4)

QEMU 可以处理 TCP、UDP 和一些,但与 DHCP 和 DNS 服务器不同。特别是这不处理 ICMP:

注意 - 如果您使用(默认)SLiRP 用户网络,则ping (ICMP) 将不起作用,但 TCP 和 UDP 可以。不要尝试用来ping 测试您的 QEMU 网络配置

它通过跟踪数据包并使用主机上的套接字来模拟虚拟机的行为来实现这一点:当虚拟机发送数据包时,QEMU 打开一个套接字来发送相同的数据包(当然更复杂,尤其是 TCP)。实际上虚拟机的源IP地址大多被忽略。

由于虚拟机的操作系统旨在运行路由器,因此它不知道这一点,并遵循其默认设置,这显然是:

  • 不使用 DHCP
  • 设置eth0为桥接端口br-vlan
  • 分配静态 IP 地址到br-vlan:192.168.1.1/24

由于没有默认路由,虚拟机不会尝试进行通信:它知道没有可用的路由。

如果它使用 DHCP,它将在 10.0.2.15/24 上收到此地址,eth0并使用 10.0.2.2 作为网关的默认路由:这些是用户模式网络堆栈模拟使用的默认值。

因此,要在当前设置中使用正确的网关来运行此类默认路由的最小等效命令是:

ip route add default via 10.0.2.2 dev br-lan onlink

onlink先跳过添加到10.0.2.2的路由的步骤)。通过首先放弃 eth0 也可以完成同样的事情br-lan

ip link del br-lan

进而:

root@OpenWrt:/# udhcpc -i eth0
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
udhcpc: ip addr add 10.0.2.15/255.255.255.0 broadcast + dev eth0
udhcpc: setting default routers: 10.0.2.2

这不会配置 DNS(udhcpc对此来说似乎太有限了)。所以另外:

echo nameserver 10.0.2.3 > /etc/resolv.conf

现在允许执行以下操作:

root@OpenWrt:/# wget http://google.com/
Downloading 'http://google.com/'
Connecting to 142.250.76.110:80
Redirected to / on www.google.com
Writing to 'index.html'

这不会走太远。这将不允许测试路由器功能。


更重要的是,必须充分配置所有网络部分,可能为虚拟机提供多个网卡以供充分使用。进一步阅读 QEMU 文档。它肯定应该使用TAP 网络后端。这个需要明白如何进行配置:

祈求获取使用 TAP 网络接口的命令行示例。

这要求运行虚拟机的管理程序系统本身已经配置了正确的网络,因此它可以向虚拟机提供(具有足够的网络选项)其中一些资源。

例如,以 root 身份运行此命令将在虚拟机中提供 2 个 NIC:

qemu-system-mips \
    -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf \
    -netdev tap,id=n1,ifname=tapn1 -device pcnet,netdev=n1 \
    -netdev tap,id=n2,ifname=tapn2 -device pcnet,netdev=n2 \
    -nographic -m 256

然后,可以将第二个 NIC 连接到主机上的现有网桥,例如,如果也使用 LXC,则可以lxcbr0

ip link set tapn2 master lxcbr0

其他一些 QEMU 选项可能可以通过单个命令调用来完成此操作。同样,使用一些特权 QEMU 帮助程序可以允许再次以非 root 身份运行该命令。

由于 LXC 已经在 上提供了 DHCP(和 DNS)lxcbr0,因此允许在 VM 中使用 DHCP:

udhcpc -i eth1

ping 8.8.8.8只要主机提供连接,即使是类似的东西也可以工作。 DNS 仍然需要像前面的示例一样手动配置。

当然应该使用OpenWRT自己的配置方法。

相关内容