libvirt:“无法初始化有效的防火墙后端”

libvirt:“无法初始化有效的防火墙后端”

我正在尝试在 Arch Linux 主机上为 libvirt 设置没有 DHCP 的虚拟 NAT 网络设备。

我已尝试过:

# virsh net-define network.xml 
Network default defined from network.xml

[ network.xml]:

<network>
  <name>default</name>
  <bridge name="maas0" />
  <forward mode="nat" />
  <ip address="10.137.0.1" netmask="255.255.255.0" />
</network>

我的笔记本电脑在启动时输出以下内容:

# virsh net-start default
error: Failed to start network default
error: internal error: Failed to initialize a valid firewall backend

与该主题有关的所有其他帖子都在谈论升级软件——我正在使用最新版本:

$ pacman -Q ebtables dnsmasq libvirt iptables
ebtables 2.0.10_4-5
dnsmasq 2.75-1
libvirt 1.3.3-1
iptables 1.4.21-3

这可能是什么原因造成的internal error?我该怎么做?

答案1

安装ebtablesdnsmasq似乎可以解决问题。别忘了重启libvirtd服务。

命令:

sudo pacman -Syu ebtables dnsmasq
sudo systemctl restart libvirtd

注意:不要忘记关闭并重新打开您的virt-managerGUI(如果您正在使用)。

编辑:原始答案建议也安装firewalld。这对许多用户来说似乎没有必要,并且可能会给您的系统添加额外的不需要的防火墙。但是,如果您想尝试一下,您也可以添加以下命令:

sudo pacman -Syu firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl restart libvirtd

答案2

如果 libvirtd 是开始未安装ebtables和/或dnsmasq。如果您已安装它们但仍然遇到此问题,则可能需要重新启动服务libvirtd

sudo systemctl restart libvirtd.service

归功于 评论另一个答案来阐明这一点。我将其作为对原始问题的新的和单独的答案提交,因为安装和启动firewalld以解决原始问题可能会引发新问题:一旦防火墙守护程序运行,虚拟机中所需的大多数服务,包括 DHCP,将默认被阻止,这意味着您的虚拟机在初始化时将无法访问网络。

我花了一个多小时来解决这个问题,并追溯到我刚刚启用的防火墙是我遇到过的最愚蠢的 bug 源之一。不要让它从你的

答案3

由于我还无法对获得最多支持的答案添加额外的评论,所以我不得不将此解决方案添加为新答案。

在某些情况下,用户可能不想替换,iptables因为iptables-nft它可能会破坏现有规则。

旧版iptables包包含 的ebtables-nft符号链接xtables-nft-multi

您可以使用文件进行检查:

$ file $(which ebtables-nft)
/usr/bin/iptables: symbolic link to xtables-nft-multi

一个简单的解决方案是创建丢失的符号链接,因此libvirt/virt-manager无需触及系统上现有的包就可以找到它。

$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables
$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables-save
$ ln -s /usr/bin/xtables-nft-multi /usr/bin/ebtables-restore

随后重新启动libvirt守护进程/套接字(无论使用什么),网络应该可以启动,而无需防火墙后端错误。

相关内容