这是我的问题。我在Linux上运行了3个虚拟机和三个桥 每个都有两个接口(每个桥接一个) 例如:
以下是条件: - VM1和VM3必须通过VM2在它们之间进行通信 - 从VM1到VM3的数据包通过br0和br1 - 但是从VM3到VM1的数据包只能通过br2
<-------
---------------------br2-------------------
| |
**VM1**----br0-----**VM2**-----br1--------**VM3**
------> -------->
我的第一个想法是使用NAT感谢iptables规则,但我不确定它会起作用,因为数据包必须采取两种不同的方式(br0-br1和br2)
我的第二个是使用python脚本和scappy
你有什么想法吗?
抱歉我的英语不好。如您所见,我根本不熟练使用英语:)
答案 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缓存条目。