为两台虚拟机创build一个专用networking

我正在尝试创build两个都连接到同一个专用networking的虚拟机。 我用qemu-kvm 1.0使用Linux。

我的攻击计划是这样的:

 brctl addbr桥
 ifconfig桥接起来
 tunctl -t tap1
 tunctl -t tap2
 ifconfig tap1向上
 ifconfig tap2 up
 brctl addif bridge tap1
 brctl addif bridge tap2
 qemu-kvm -net nic,macaddr = 52:54:00:11:22:33 -net tap,ifname = tap1 disk1.img
 qemu-kvm -net nic,macaddr = 52:54:00:44:55:66 -net tap,ifname = tap2 disk2.img

一旦启动,我给第一台机器的IP地址192.168.100.5,第二个192.168.100.10。

此时,当我尝试从另一个虚拟机中ping一个虚拟机时,没有ping响应。 但是,使用Wireshark,我发现ARP请求被发送和响应,并validation了ARPcaching包含其他VM上的信息。 然而,没有ping应答产生(通过Wireshark看到)。

接下来,我试着给这个网桥一个IP地址192.168.100.1。 这样做后,虚拟机之间ping,但仍然有一个问题:现在所有请求似乎来自桥本身。 例如,如果我从一个虚拟机连接到另一个虚拟机的FTP服务器上,在虚拟机上使用FTP服务器运行netstat会显示192.168.100.1是源虚拟机。 连接的工作方式与穿越NAT一样,但与NAT一样,源地址不是始发机器的源地址。 我试着用net.ipv4.ip_forward打开和closures,并用相同的结果来伪装(iptables -t nat -A POSTROUTING -j MASQUERADE)。

我真正想要的是我的虚拟机像插入交换机那样工作:它应该是透明的。 我更关心的是看起来像桥的源地址,而不是需要IP的网桥。 后者有点烦人,但前者是我的阻挡者。

我见过iptables干扰桥stream量(即使它不应该AFAIK)。 您当然不需要任何NAT相关的规则,但我认为FORWARD链需要接受数据包。 我会build议在FORWARD链上没有iptables规则和默认的ACCEPT策略来testing这个。

其他一些事情要检查:

  • brctl showvalidationtap1tap2bridge吗?
  • brctl showmacs bridge是否显示两个虚拟机的MAC地址?

将您的抽头接口设置为混杂模式。

 ifconfig tap1 promisc up ifconfig tap2 promisc up 

ARP也需要路由才能正常工作。

一个常见的问题是,在主机系统的内核中, 同一个子网中的两个接口都分配了一个IP地址。 如果你这样做的ARP答复将打破 – B / C只有一个接口将得到答复。 确保你有一个干净的单一路由回到子网。

在上面的例子中,如果tap1tap2接口在Linux主机的内核中都有IP地址 – 在相同的子网(192.168.100.0/24)中,ARP应答将会中断。 如果虚拟机不需要连接到主机,那么在主机内核中都不需要IP。