A.19.4. Guest Can Reach Outside Network,但在使用 macvtap 界面时可能会重新访问主机
- 症状
- 客户机虚拟机可以与其他虚拟客户机通信,但在配置为使用 macvtap(也称为
type='direct 的
)网络接口后无法连接到主机。 - 正在调查
- 即使没有连接到虚拟以太网端口聚合器(VEPA)或 VN-Link 功能切换,但 macvtap 接口也很有用。将此类接口的模式设置为
网桥
可让客户机以非常简单的方式直接连接到物理网络,而无需设置问题(或 NetworkManager 不兼容),这些模式可以同时使用传统主机桥接设备。但是,当 guest 虚拟机配置为使用type='direct'
网络接口(如 macvtap)时,尽管能够与网络上的其他客户机和其他外部主机通信,但客户机无法与其自己的主机通信。这种情况实际上不是 error - 它是 macvtap 的定义行为。由于主机物理以太网连接到 macvtap 网桥的方式,从客户机的流量传输到物理接口,无法退回到主机的 IP 堆栈。另外,发送到物理接口的主机 IP 堆栈的流量无法退回到 macvtap 网桥,以转发到客户机。 - 解决方案
- 使用 libvirt 创建隔离网络,并为连接到此网络的每个客户机虚拟机创建第二个接口。然后,主机和客户机可以通过这个隔离网络直接进行通信,同时还可保持与 NetworkManager 的兼容性。
过程 A.8. 使用 libvirt创建隔离网络
- 在
/tmp/isolated.xml
文件中添加并保存以下 XML。如果 192.168.254.0/24 网络已在您的网络其他位置使用,您可以选择不同的网络。图 A.3. 隔离网络 XML
... <network> <name>isolated</name> <ip address='192.168.254.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.254.2' end='192.168.254.254'/> </dhcp> </ip> </network> ...
- 使用此选项创建网络: virsh net-define /tmp/isolated.xml
- 使用 virsh net-autostart 隔离 命令将网络设置为 autostart。
- 使用 virsh net-start isolated 命令启动网络。
- 使用 virsh edit name_of_guest,编辑每个使用 macvtap 进行网络连接的客户机配置,并在
<devices>
部分中添加新接口,类似于以下内容(请注意<模型 type='virtio'/>
行为 include 可选):<>
图 A.4. 接口设备 XML
... <interface type='network' trustGuestRxFilters='yes'> <source network='isolated'/> <model type='virtio'/> </interface>
- 关闭,然后重启每个虚拟机。
现在,客户机可以通过地址 192.168.254.1 访问主机,主机则能够通过从 DHCP 获取的 IP 地址(此外,您可以手动配置客户机的 IP 地址)。由于此新网络仅隔离到主机和客户机,来自客户机的所有其他通信都将使用 macvtap 界面。如需更多信息,请参阅 第 23.17.8 节 “网络接口”。