我有以下两个网络,
<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),我们需要向该链添加一对规则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_FWI
或LIBVIRT_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 的解决方案可能更为优雅,因为它将修改链以允许转发,但直接删除它们也是一个选择。