天天看点

QEMU--用户模式网络

https://en.wikibooks.org/wiki/QEMU/Networking

如果未指定网络选项,QEMU 将默认模拟一个 Intel e1000 PCI 网卡,该网卡具有桥接到主机网络的用户模式网络堆栈。 以下三个命令行是等效的:

qemu -m 256 -hda disk.img &

qemu -m 256 -hda disk.img -net nic -net user & #使用 -net user 必须同 -net nic配合

qemu-system-i386 -m 256 -hda disk.img -netdev user,id=network0 -device e1000,netdev=network0,mac=52:54:00:12:34:56 &

要在 Linux 内核中使用此网络设置,您必须在编译时设置配置选项 CONFIG_E1000=y。(?)

-net 选项在较新的 QEMU 版本中被 -netdev 取代。

GuestOS将看到一张E1000 NIC网卡,并且虚拟 DHCP 服务器在ip 10.0.2.2 上,并将分配一个从 10.0.2.15 开始的地址给GuestOS。 虚拟 DNS 服务器在ip 10.0.2.3 上,虚拟 SAMBA 文件服务器在 10.0.2.4 上(如果存在),从而允许您通过 SAMBA 文件共享访问主机host上的文件。启用内置的 TFTP 服务器时,TFTP 服务器也在10.0.2.2 。

QEMU--用户模式网络

用户模式网络非常适合允许访问网络资源,包括 Internet。 特别是,它允许从guest到主机的 ssh流量。 但是,默认情况下,它充当防火墙,不允许任何传入流量。 它也不支持 TCP 和 UDP 以外的协议 - 例如,ping 和其他 ICMP 程序将不起作用。

但是host机无法直接访问到guest机,因为host上没有新增对应10.0.2.2的网卡,只能通过端口转发来间接访问到guest机。因此,如果您同时启动多个虚拟机,则虚拟机将无法在外部网络上直接看到,虚拟机也将无法相互通信。

In order to check that the user mode network is working, you can ping the address 10.0.2.2 and verify that you got an address in the range 10.0.2.x from the QEMU virtual DHCP server.

为了检查用户模式网络是否正常工作,您可以 ping 10.0.2.2 并验证您是否从 QEMU 虚拟 DHCP 服务器获得了 10.0.2.x 范围内的地址。

QEMU--用户模式网络
QEMU--用户模式网络

 You can use a DHCP client to automatically configure the network in the QEMU VM

您可以使用 DHCP 客户端在 QEMU VM 中自动配置网络。

如下可以看到,guestOS中能访问到外网,但是,无法进行ping操作,因为ping reply数据包被拦截了。

QEMU--用户模式网络

但如果你在 Linux >= 3.0 上使用 QEMU,它可以使用非特权 ICMP ping 套接字来允许 ping 到 Internet。 host管理员必须设置 ping_group_range 才能授予对这些套接字的访问权限。 例如允许 ping GID 100(通常是users组):

echo 100 100 > /proc/sys/net/ipv4/ping_group_range

因为前面是使用sudo命令来启动qemu的,因此是root用户在执行qemu进程,由下图也可知:

QEMU--用户模式网络

 root用户在id为0的组。

QEMU--用户模式网络

则执行如下命令

echo 0 0 > /proc/sys/net/ipv4/ping_group_range

QEMU--用户模式网络

 则guest机可以ping到外网了。

QEMU--用户模式网络

 host ip为192.168.150.158,从guest ssh连接到host(但是没法host主动连接guest),如下:

QEMU--用户模式网络

 查看路由表,默认网关是10.0.2.2,即虚拟DHCP服务器。

QEMU--用户模式网络

原理应该是有点类似于VMware NAT模式。(还是有挺多区别,比如虚拟机直接无法直接通信)

在默认情况下,用户模式的guestOS能够通过10.0.2.2这个IP访问到host。任何运行于host上的服务端程序都可以通过这个地址被guest访问到,比如说我们可以通过这个IP访问到host上的SSH服务器或SMB服务器。因此在这种情况下,guestOS能够挂载host通过SMB or NFS暴露出来的目录,也可以访问host上的HTTP服务器等。 默认情况下host无法访问guestOS上的服务。

如下,host监听6666端口

QEMU--用户模式网络

guestOS通过10.0.2.2来连接host的6666端口。

QEMU--用户模式网络

host机成功接收到消息。

QEMU--用户模式网络