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 。

39e8eb24ec1b4067b3833a2a2564732e.png

用户模式网络非常适合允许访问网络资源,包括 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 范围内的地址。

 8cf5021f8a804a6889e3441c8e2cd728.png

6d9d4ebc6cd044e18f1582648c79283c.png

 

 

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

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

 

 

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

f22532cea9d5419fbd12e11be0d544a0.png

 

但如果你在 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进程,由下图也可知:

50f24eb8c66d4830bc7e4c583da9cec0.png

 root用户在id为0的组。

 70999e0367e3429e9f0ec724bbc5f8e5.png

则执行如下命令

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

6a0abfe27b4d49d0b3763d7e99c317dc.png

 则guest机可以ping到外网了。

c463d92bc73048d1b31655ff5b3aab92.png

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

d74d4cd15c964f819861384505d1baf6.png

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

1b0ceaa5f26a444d91261815f5015bb2.png

原理应该是有点类似于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端口

cd19d50606bc4035b9a452565881c48a.png

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

71134343ab394f2c80c5b8dcb5750c41.png

host机成功接收到消息。

0ef60e21e7d6404487a05b92fe99d5a0.png

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值