2026-03-14 08:09
最近在使用virt-manager创建KVM虚拟机时,遇到了一个让人头疼的问题:虚拟机使用默认的NAT网络模式,却无法访问外网,宿主机也无法正常访问虚拟机,但是虚拟机可以访问宿主机。
经过排查,发现问题出在Docker与libvirt的防火墙规则冲突上。
nftables作为防火墙后端,而Docker仍使用传统的iptables。当Docker修改iptables时,不会感知libvirt的规则,导致libvirt规则丢失。最直接有效的方法是将libvirt的防火墙后端强制切换为iptables,让libvirt和Docker使用同一套规则管理工具,避免冲突。
编辑libvirt网络配置文件(如不存在则新建):
sudo nano /etc/libvirt/network.conf添加以下配置:
firewall_backend = "iptables"重启libvirtd服务:
sudo systemctl restart libvirtd验证修复:
LIBVIRT_INPUT、LIBVIRT_FORWARD等链,并且FORWARD链规则中包含了允许virbr0流量的条目。切换后端后,iptables规则恢复如下(部分):
Chain FORWARD (policy ACCEPT)
target prot opt source destination
LIBVIRT_FORWARD all -- anywhere anywhere
...
Chain LIBVIRT_FORWARD (1 references)
target prot opt source destination
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere 192.168.122.0/24
FORWARD链策略变回ACCEPT,LIBVIRT规则出现,虚拟机网络恢复正常。
网络这块还是得学啊。