将 qemu/kvm 与 nftables 一起使用? (没有防火墙!)

将 qemu/kvm 与 nftables 一起使用? (没有防火墙!)

使用 libvirt/qemu/kvm,您可以定义一个(或更多)桥接器供来宾计算机使用。 libvirt 机器应该负责桥接的创建 - 通常调用virbr0virbr0-nic以解决一些怪癖) - 并且通常还会注意插入防火墙规则 - 通过iptables- 以确保连接(转发、接受来宾之间的流量、有时完全拒绝出站/入站流量virbr0)。

现在,我正在迁移到nftables,我喜欢增加的灵活性和强大的语法,对于我的所有用例来说,这都超越了我过去使用iptables/ip6tables和 的经验ipset。我可以表达inet与整个家庭有关的某些规则,而不是单独的 IPv4 和 IPv6,这一事实本身就值得了。

唉,libvirt官方只支持iptables 或者 firewalld

现在我的问题是这样的:有处理这种情况的规范方法吗?它是什么?

以下是我考虑过的一些场景(全部没有firewalld):

  1. 使用nftables但使用update-alternatives机器来确保 libvirt 会找到一个iptables(等等)来调用
  2. 将桥创建从 libvirt 移至netplan,然后使用其他方法动态插入必要的规则
  3. 使用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 启动时会创建隧道接口并连接到网桥。

一个网桥的一些相关主机配置片段

  1. 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
  1. 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>

相关内容