首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QEMU中转发互联网连接?

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

Unix & Linux用户
提问于 2023-04-30 17:07:06
回答 1查看 132关注 0票数 4

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

代码语言:javascript
复制
qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256

但是,VM中没有internet连接:

代码语言:javascript
复制
root@(none):/# ping google.com
ping: bad address 'google.com'

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

编辑

正如注释中所建议的那样,ping将无法工作,因为它使用ICMP。但是,当使用wget时,会发生以下错误:

代码语言:javascript
复制
root@OpenWrt:~# wget http://google.com/
Downloading 'http://google.com/'
Failed to send request: Operation not permitted

网络配置如下所示:

代码语言:javascript
复制
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)
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-05-08 15:59:07

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

qemu-system-mips -kernel -kernel -nographic -m 256

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

QEMU内有两部分用于联网:

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

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

从VM的角度来看,用户模式网络是这样的:

客(10.0.2.15) <->防火墙/DHCP服务器<-> SMB服务器(10.0.2.4)

QEMU可以处理TCP、UDP和一些(但不太像DHCP和DNS服务器)。特别是,这不能处理ICMP:

注意-如果您使用的是(默认的) SLiRP用户网络,那么ping (ICMP)将无法工作,尽管TCP和UDP会。不要尝试使用ping测试您的QEMU网络配置!

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

由于VM的操作系统打算运行路由器,它不知道这一点,并遵循其默认设置,这显然是:

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

由于没有默认路由,VM不会尝试通信:它知道没有路由。

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

因此,在当前设置中使用适当的网关运行这样的默认路由所需的最小等效命令是:

代码语言:javascript
复制
ip route add default via 10.0.2.2 dev br-lan onlink

(onlink跳过将路由添加到10.0.2.2的步骤)。同样的事情也可以用eth0做,首先放弃br-lan:

代码语言:javascript
复制
ip link del br-lan

然后:

代码语言:javascript
复制
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看起来对此太有限了)。因此,此外:

代码语言:javascript
复制
echo nameserver 10.0.2.3 > /etc/resolv.conf

例如,现在允许这样做:

代码语言:javascript
复制
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'

不会有什么进展的。这将不允许测试路由器的功能。

更多的是,我们必须充分配置所有的网络部件,可能会为VM提供多个NIC以供适当使用。进一步阅读QEMU文档。它当然应该使用TAP网络后端。这需要理解如何进行配置:

有关使用TAP网络接口的命令行示例,请参见调用。

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

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

代码语言:javascript
复制
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

然后,可以将第二个网卡附加到主机上的现有桥上,例如,如果还在使用LXC,则可以将第二个网卡附加到lxcbr0:

代码语言:javascript
复制
ip link set tapn2 master lxcbr0

其他一些QEMU选项可能可以通过单个命令调用来实现这一点。同样,使用一些特权QEMU帮助程序可以允许再次以非根用户的身份运行该命令。

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

代码语言:javascript
复制
udhcpc -i eth1

然后,即使是像ping 8.8.8.8这样的东西也能工作,只要主机提供连接。DNS仍然必须手动配置,就像前面的示例一样。

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

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/744552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档