通过另一个虚拟机在两个虚拟机之间进行通信

时间:2016-06-24 15:12:55

标签: python virtual-machine iptables kvm bridge

这是我的问题。我在Linux上运行了3个虚拟机和三个桥 每个都有两个接口(每个桥接一个) 例如:

  • VM1:i0代表br0,i2代表br2
  • VM2:i1代表br1,i0代表br0
  • VM3:i1代表br1,i2代表br2

以下是条件:   - VM1和VM3必须通过VM2在它们之间进行通信   - 从VM1到VM3的数据包通过br0和br1   - 但是从VM3到VM1的数据包只能通过br2

                      <-------
   ---------------------br2-------------------
   |                                         |
**VM1**----br0-----**VM2**-----br1--------**VM3**
         ------>              -------->

我的第一个想法是使用NAT感谢iptables规则,但我不确定它会起作用,因为数据包必须采取两种不同的方式(br0-br1和br2)

我的第二个是使用python脚本和scappy

你有什么想法吗?

抱歉我的英语不好。如您所见,我根本不熟练使用英语:)

1 个答案:

答案 0 :(得分:0)

假设所有虚拟机都在同一个IP子网中,他们会尝试直接相互访问。

现在,例如,您希望强制VM1通过VM2与VM3通信。如果让VM1弄清楚如何到达VM3,它将广播一个arp请求,VM3将响应“嘿,就是我!这是我的mac地址”。因此,VM1将直接将IP数据包发送到VM3。

但是......你可以愚弄 VM1,在它的arp缓存中添加一个与VM2 mac地址关联的VM3 IP地址的条目。在linux中,您可以使用:

arp -s <IP address> <mac address>

所以,现在当VM1必须与VM3通信时,它将执行arp请求,因为它已经知道目的地的mac地址。它会很乐意将VM3的IP数据包发送到VM2的NIC。此时,假设VM2接受进行某些数据包转发并且没有iptables规则禁止此类事件,则它会将数据包重新发送到 real VM3。

也许你甚至不需要所有这些桥梁,除非你出于其他原因需要它们。

如果此解决方案适合您,则可以通过在文件/etc/network/interfaces中添加一行来使arp缓存条目永久

up arp -s <IP address> <mac address>

这样,每次启动NIC时(即机器启动时)都会设置arp缓存条目。