我刚刚从 VirtualBox 切换到带有 KVM 的 Virt Manager,我对这次切换非常满意(我最初的动机是放弃 Virtualbox 和 vanilla Proxmox 转而使用 libvirt,从而对桌面虚拟机和服务器虚拟机使用相同的虚拟化)。话虽如此,我真的不知道我在做什么,所以我需要一些帮助。
我在 Debian 主机上运行 Debian VM。我在主机上定义了一个简单的网桥(在 /etc/network/interfaces 中),并将我的所有 VM 放在上面。主机运行 UFW 默认配置。一切都很顺利,直到我尝试使用 nwfilters。
我定义了一个过滤器(virsh nwfilter-define)并将其添加到虚拟机“my-vm1”(又名 my-vm1 的网络设备中的 reffilter filter='my-vm1-filter')。“my-vm1” 的流量按预期被过滤,但其他虚拟机却令人烦恼地失去连接:
- 重新启动这些其他虚拟机没有帮助:看起来它们无法执行 DHCP
- 停止 my-vm1 没有帮助
- 需要重新启动主机而不是启动 my-vm1 才能恢复其他虚拟机上的网络
- 我尝试理解启动 my-vm1 后对 iptables -L 所做的更改,但结果令人困惑。但我对 iptables 一无所知。
第一个问题:使用 nwfilters 时是否存在一个众所周知的问题、步骤或限制,而我却严重忽视了?
如果没有,请问下一步该尝试什么?很高兴学到一些与我的问题相关的新东西。
答案1
如果有人到达这里,以下是一些进展:
- 我意识到 nft 比 iptables 更能给我提供更好的信息,iptables 是旧帖子中引用的。据我了解,libvirt 现在使用 nftables
- 事实证明,ufw 与 libvirt 配合不佳:如果我禁用它,那么我的问题就会消失,并且没有任何 nwfilter 的其他虚拟机可以正常工作。
- 读到过一些文章说,firewalld 可能与 libvirt 配合得更好,但我还没有尝试过
编辑:对于像我这样的新手来说,firewalld 至少在我的简单用例中确实运行得更好:
- 将主机桥放在“libvirt”区域中
- 该区域的服务、端口等仅适用于主机传入流量(而不是可以依赖其自己的 nwfilter 的虚拟机)
- libvirt 区域的目标必须保持“接受”(不丢弃也不拒绝):有点违反直觉,服务/端口未覆盖的数据包不会被主机接受,但“接受”对于虚拟机流量来说是必要的。