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

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

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

我在每个虚拟networking背后都有一个虚拟机。 机器可以看到主机,并看到互联网。 但是,当我尝试从一个networking连接到另一个networking时,即使连接到我所知道的端口,我也会得到“拒绝连接”。

我禁用UFW(主机是Ubuntu),仍然失败。 没有logging,所以我不知道哪个规则阻止它。 我的FORWARD块(我假设由virtlib创build)是:

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 

如果我清除了所有防火墙规则,那么不同虚拟networking上的虚拟机可以相互通信,但是当然不能脱离虚拟机主机。

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

 -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修改它如何创build转发规则,以便它不禁止虚拟networking之间的stream量?

感谢您提供任何提示,指针或url!

发生这种情况是因为您已将虚拟networkingconfiguration为“nat”networking。

build立这样一个networking,只能访问:

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

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


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

  1. 将每个虚拟networking重新configuration为“路由”networking,而不使用NAT。 在这种情况下,libvirtd不会尝试将虚拟networking彼此隔离,但也不会执行任何NAT。

    您将需要通过编辑XML(使用virsh net-edit networkname ; virt-manager GUI不能进行此更改)来完成此操作:

      <forward mode='nat'/> 

    应改为:

      <forward mode='route'/> 

    当您使用networkingclosures所有虚拟机,停止networking( virsh net-stop networknamenetworking终止networkingvirsh net-stop networkname ),重新启动networking( virsh net-start networknamenetworkingvirsh net-start networkname )并使用networking重新启动所有虚拟机时,此更改将生效。

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

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

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

或者,你可以忘记所有这些,创build一个新的孤立的虚拟networking,并给每个虚拟网卡连接一个隔离的networking。 虚拟机可以通过这个networking进行通信。