使用 libvirt/qemu/kvm,您可以定义一个(或更多)桥接器供来宾计算机使用。 libvirt 机器应该负责桥接的创建 - 通常调用virbr0
(virbr0-nic
以解决一些怪癖) - 并且通常还会注意插入防火墙规则 - 通过iptables
- 以确保连接(转发、接受来宾之间的流量、有时完全拒绝出站/入站流量virbr0
)。
现在,我正在迁移到nftables
,我喜欢增加的灵活性和强大的语法,对于我的所有用例来说,这都超越了我过去使用iptables
/ip6tables
和 的经验ipset
。我可以表达inet
与整个家庭有关的某些规则,而不是单独的 IPv4 和 IPv6,这一事实本身就值得了。
唉,libvirt官方只支持iptables
或者 firewalld
。
现在我的问题是这样的:有处理这种情况的规范方法吗?它是什么?
以下是我考虑过的一些场景(全部没有firewalld
):
- 使用
nftables
但使用update-alternatives
机器来确保 libvirt 会找到一个iptables
(等等)来调用 - 将桥创建从 libvirt 移至
netplan
,然后使用其他方法动态插入必要的规则 - 使用
nftables
但保持iptables
活动状态——据我所知,这可能是最糟糕的主意,因为它们在某些边缘情况或一般情况下必然会发生冲突
答案1
我的方法如下。不确定是否规范,这是一个相当高的标准,但似乎与当前的工具配合得很好。在注意到我的 Fedora 34 主机上的两个新 Qemu/KVM Windows 10 来宾访问互联网的问题后,我采用了这种方法 - DHCP 似乎不适用于来宾 W10 接口,并且iptables
在某些随机虚拟机管理器(VMM)中标记了缺失)错误消息(现在不记得了!)。
主机:在 Fedora 34 5.13.12-200.fc34.x86_64 上 a) 使用nftables
(已迁移)和 snat 进行访客 Internet 访问,firewalld
并且iptables
已处于非活动状态 b) 使用 iproute2 在启动时使用 IP 地址创建桥接口
来宾:a) 对于两个 Windows 10 Qemu/KVM 映像,指定使用 VMM 在主机上创建的桥接接口,b) 在来宾的 Windows 10 设置中为 Windows 10 接口使用静态 IP 地址
请注意,桥接接口是在启动时创建的。 Windows 10 启动时会创建隧道接口并连接到网桥。
一个网桥的一些相关主机配置片段
- iproute2 语句
/usr/sbin/ip link add name virbr1 type bridge
/usr/sbin/ip link set virbr1 up
/usr/sbin/ip address add dev virbr1 192.168.123.1/24 broadcast 192.168.123.255
- nft snat
table nat {
chain nat {
type nat hook postrouting priority 100;
policy accept;
ip saddr 192.168.123.0/24 counter snat to *myipaddr*;
}
}
VMM 视图中一个桥的 XML 详细信息。
<interface type="bridge">
<mac address="52:54:00:xx:xx:xx"/>
<source bridge="virbr1"/>
<target dev="vnet0"/>
<model type="e1000e"/>
<alias name="net0"/>
<address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
</interface>