在我的 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”网络。
设置这样的网络以便它只能访问:
- 同一虚拟网络上的其他虚拟机
- 主人
- 外部网络(通常是互联网)
特别是,正如您所发现的,对主机上任何其他虚拟网络的访问都被阻止。
解决这个问题需要两个步骤:
将每个虚拟网络重新配置为“路由”网络,不带 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
)以及重新启动所有使用网络的虚拟机时,此更改才会生效。如果您希望虚拟机访问互联网,您还必须插入您自己的伪装规则。
例如,在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
或者,你可以忘记所有这些,并创建一个新的虚拟网络,孤立,并为每个虚拟机分配第二个虚拟网卡,连接到隔离网络。然后虚拟机就可以通过这个网络进行通信。