修改虚拟网络之间的 libvirt 防火墙规则

修改虚拟网络之间的 libvirt 防火墙规则

在我的 VM 主机上,我有两个 libvirt 虚拟网络:

  • virbr0:192.168.122.1/255.255.255.0
  • virbr1:192.168.130.1/255.255.255.0

我在每个虚拟网络后面都有一个虚拟机。机器可以看到主机,也可以看到互联网。但是,当我尝试从一个网络连接到另一个网络时,即使我连接到我知道是开放的端口,也会收到“连接被拒绝”的信息。

我已禁用 UFW(主机是 Ubuntu),但仍然失败。没有记录任何内容,因此我不确定是哪条规则阻止了它。我的 FORWARD 块(我假设由 virtlib 创建)是:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             192.168.130.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.130.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

如果我清楚全部防火墙规则,那么不同虚拟网络上的虚拟机可以相互通信,但它们当然不能通过虚拟机主机进行通信。

我发现如果我摆脱这些规则:

-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -o virbr1 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr1 -j REJECT --reject-with icmp-port-unreachable

然后虚拟机就可以互相通信了。这很好,但是我该如何指示 libvirt 修改其创建转发规则的方式,以便它不会禁止虚拟网络之间的流量?

感谢任何提示、指示或 URL!

答案1

发生这种情况是因为您已将虚拟网络配置为“nat”网络。

设置这样的网络以便它只能访问:

  • 同一虚拟网络上的其他虚拟机
  • 主人
  • 外部网络(通常是互联网)

特别是,正如您所发现的,对主机上任何其他虚拟网络的访问都被阻止。


解决这个问题需要两个步骤:

  1. 将每个虚拟网络重新配置为“路由”网络,不带 NAT。在这种情况下,libvirtd 不会尝试将虚拟网络彼此隔离,但也不会执行任何 NAT。

    您需要通过编辑 XML 来执行此操作(使用virsh net-edit networkname;virt-manager GUI 无法进行此更改):

      <forward mode='nat'/>
    

    应改为:

      <forward mode='route'/>
    

    当您关闭所有使用网络的虚拟机、停止网络(virsh net-stop networkname)、重新启动网络(virsh net-start networkname)以及重新启动所有使用网络的虚拟机时,此更改才会生效。

  2. 如果您希望虚拟机访问互联网,您还必须插入您自己的伪装规则。

    例如,在nat 表部分/etc/ufw/before.rules

    -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE
    -A POSTROUTING -s 192.168.130.0/24 -o eth0 -j MASQUERADE
    

或者,你可以忘记所有这些,并创建一个新的虚拟网络,孤立,并为每个虚拟机分配第二个虚拟网卡,连接到隔离网络。然后虚拟机就可以通过这个网络进行通信。

相关内容