两个 NAT 网络之间的 Libvirt 路由

两个 NAT 网络之间的 Libvirt 路由

我有以下两个网络,

<network>
  <name>subsys-network</name>
  <bridge name="virbr1"/>
  <forward mode="nat"/>
  <ip address="192.168.72.1" netmask="255.255.255.128">
    <dhcp>
      <range start='192.168.72.2' end='192.168.72.126'/>
    </dhcp>
  </ip>
</network>
<network>
  <name>gw-frontend-network</name>
  <bridge name="virbr2"/>
  <forward mode="nat"/>
  <ip address="172.22.10.1" netmask="255.255.255.128">
    <dhcp>
      <range start='172.22.10.2' end='172.22.10.126'/>
    </dhcp>
  </ip>
</network>

cat /proc/sys/net/ipv4/ip_forward返回1

我可以找到使用路由网络但这样就无法通过 NAT 来访问外部网络了。

如何配置路由以便两个网络上的虚拟机可以相互通信?

目前正在尝试 ping 操作,172.22.10.64结果192.168.72.56如下:

PING 172.22.10.64 (172.22.10.64) 56(84) bytes of data.
From 192.168.72.1 icmp_seq=1 Destination Port Unreachable
From 192.168.72.1 icmp_seq=2 Destination Port Unreachable
From 192.168.72.1 icmp_seq=3 Destination Port Unreachable
From 192.168.72.1 icmp_seq=4 Destination Port Unreachable

答案1

您可以手动添加必要的防火墙规则以允许这两个网络之间的通信。您需要进行两项更改:

  1. 禁用两个网络之间的伪装,并且
  2. 允许两个网络之间的转发

为了修复 (1),我们需要向该链添加一对规则nat POSTROUTING(在调用LIBVIRT_PRT链之前)。所以也许:

iptables -t nat -I POSTROUTING 1 -s 192.168.72.0/25 -d 172.22.10.0/25 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -s 172.22.10.0/25 -d 192.168.72.0/25 -j ACCEPT

为了修复(2),我们需要在filter FORWARD调用LIBVIRT_FWILIBVIRT_FWO链之前在链中添加规则:

iptables -I FORWARD 1 -s 172.22.10.0/25 -d 192.168.72.0/25 -j ACCEPT
iptables -I FORWARD 1 -s 192.168.72.0/25 -d 172.22.10.0/25 -j ACCEPT

使这些规则持久化留作一项练习,因为具体如何做到这一点因发行版和防火墙管理工具而异。

答案2

您可以删除阻止 ICMP 回显(导致“目标端口不可达”响应)的规则,如下所示:

iptables -D LIBVIRT_FWI 2
iptables -D LIBVIRT_FWO 2

没有任何迹象表明您的路由存在问题,只是 libvirt 出于某种原因默认阻止了 ICMP 数据包。在我的计算机上,它看起来像这样:

Chain LIBVIRT_FWI (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             172.16.0.0/16        ctstate RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain LIBVIRT_FWO (1 references)
target     prot opt source               destination         
ACCEPT     all  --  172.16.0.0/16        anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

上述两个命令只会删除这两个链。larsks 的解决方案可能更为优雅,因为它将修改链以允许转发,但直接删除它们也是一个选择。

相关内容