为两台虚拟机创建专用网络

为两台虚拟机创建专用网络

我正在尝试创建两个连接到同一专用网络的虚拟机。我使用的是带有 qemu-kvm 1.0 的 Linux。

我的攻击计划是这样的:

brctl 添加br桥
ifconfig 桥接
tunctl -t tap1
tunctl -t tap2
ifconfig tap1 启动
ifconfig tap2 启动
brctl addif 桥接 tap1
brctl addif 桥接 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,给第二台机器的 IP 地址为 192.168.100.10。

此时,当我尝试从另一台虚拟机 ping 一台虚拟机时,没有 ping 响应。但是,使用 Wireshark,我看到 ARP 请求已发送并得到响应,并且我验证了 ARP 缓存确实包含有关其他虚拟机的信息。但是没有生成 ping 回复(通过 Wireshark 看到)。

接下来,我尝试为网桥指定一个 IP 地址 192.168.100.1。完成此操作后,虚拟机之间的 ping 操作可以正常工作,但仍然存在一个问题:现在所有请求似乎都来自网桥本身。例如,如果我从一台虚拟机连接到另一台虚拟机的 FTP 服务器,则在装有 FTP 服务器的虚拟机上运行 netstat 会显示 192.168.100.1 是源。连接工作方式与跨 NAT 一样,但与 NAT 一样,源地址不是原始机器的地址。我尝试过打开和关闭 net.ipv4.ip_forward,并尝试打开和关闭伪装 (iptables -t nat -A POSTROUTING -j MASQUERADE),结果相同。

我真正想要的是让我的虚拟机像插入交换机一样运行:它应该是透明的。我更关心源地址看起来像桥接器,而不是桥接器需要 IP。后者有点烦人,但前者对我来说是个障碍。

答案1

我以前见过 iptables 干扰桥接流量(尽管据我所知不应该)。您肯定不想要任何与 NAT 相关的规则,但我认为 FORWARD 链需要接受数据包。我建议在不使用 iptables 规则的情况下测试这一点,并在 FORWARD 链上使用默认 ACCEPT 策略。

还有几件事需要检查:

  • 是否brctl show验证tap1tap2bridge
  • 是否brctl showmacs bridge显示两个虚拟机的 MAC 地址?

答案2

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

ifconfig tap1 promisc up
ifconfig tap2 promisc up

答案3

ARP 也需要路由才能工作。

一个常见的问题是,您在两个接口上都分配了一个 IP 地址相同的子网,在主机系统的内核上。如果这样做,ARP 回复将会中断 - 因为只有一个接口会收到回复。确保您有一条干净的、单一的路由返回子网。

在上面的例子中,如果tap1tap2接口在 Linux 主机的内核中都有 IP 地址——在相同的子网 (192.168.100.0/24) ARP 回复会中断。如果虚拟机不需要连接到主机,则两者都不需要主机内核中的 IP。

相关内容