我正在尝试创建两个连接到同一专用网络的虚拟机。我使用的是带有 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
验证tap1
和tap2
在bridge
? - 是否
brctl showmacs bridge
显示两个虚拟机的 MAC 地址?
答案2
将您的分接接口设置为混杂模式。
ifconfig tap1 promisc up
ifconfig tap2 promisc up
答案3
ARP 也需要路由才能工作。
一个常见的问题是,您在两个接口上都分配了一个 IP 地址相同的子网,在主机系统的内核上。如果这样做,ARP 回复将会中断 - 因为只有一个接口会收到回复。确保您有一条干净的、单一的路由返回子网。
在上面的例子中,如果tap1
和tap2
接口在 Linux 主机的内核中都有 IP 地址——在相同的子网 (192.168.100.0/24) ARP 回复会中断。如果虚拟机不需要连接到主机,则两者都不需要主机内核中的 IP。