为了全面了解 QEMU/KVM 软件虚拟化环境中网络部分的工作原理,我决定尝试手动设置网络部分,或多或少模拟一下它的作用libvirt
。
我使用的是 Arch,所以没有ifupdown
。但无论如何,我首先使用 nmcli 在主机中创建了一个 tun/tap 接口。当我检查ip link
和时ip a
,tap0 接口就在那里。到目前为止:
主机(tap0)
然后我使用dnsmasq
该接口(打算稍后为虚拟机提供 DHCP)。到目前为止:
主机(tap0)[DHCP]
然后我把这个接口添加到了libvirt
。我觉得我应该使用现有的主机桥选项,因为我的接口已经准备好了。libvirt 的 xml 是:
# cat /etc/libvirt/qemu/networks/tap0.xml
<network>
<name>tap0</name>
<forward mode='bridge'/>
<bridge name='tap0'/>
</network>
然后我使用 virsh# net-define /etc/libvirt/qemu/networks/tap0.xml
启动了网络 tap0。到目前为止:
主机(tap0)[DHCP] --> libvirt(tap0)
我认为现在我可以将此接口添加到虚拟机中,并且虚拟机至少会从dnsmasq
我在主机上运行的 IP 地址中获取 IP 地址。我尝试通过编辑虚拟机并将virsh edit domain
以下行添加到机器来将接口添加到虚拟机中
<interface type='bridge'>
<mac address='52:54:00:55:ed:bf'/>
<source bridge='tap0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
我也试过
<interface type='network'>
<mac address='52:54:00:55:ed:bf'/>
<source network='tap0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
,我以为此时情况会是这样的:
主机(tap0)[DHCP] --> libvirt(tap0)<-- VM(eth0)
但是当我尝试启动我的虚拟机时,它给出了这个错误:
virsh # start VM
错误:无法启动域架构错误:无法添加桥接 tap0 端口 vnet0:不支持操作
我的最终目标是iptables
在我的虚拟机能够正确获取 IP 地址后,对其进行进出流量的 natting。
那么,我遗漏了什么?