我有一台连接到无线路由器的 VM 主机 (KVM)。我希望虚拟客户机与主机位于同一广播域中;即从路由器的 DHCP 接收其 IP。(=第 2 层桥接)
根据KVM 文档这是不可能的:(Important Note: Unfortunately, wireless interfaces cannot be attached to a Linux host bridge, so if your connection to the external network is via a wireless interface ("wlanX"), you will not be able to use this mode of networking for your guests.
无论如何我都尝试过了,事实上,它不起作用:))
互联网上有一些资源建议如何创建路由接口,对我来说很管用。但它是第 3 层,而客户机位于不同的 IP 子网中。
不过,我以前用过 VirtualBox,无线桥接工程那里。
我发现超级用户问题关于VirtualBox,解释如下:Many virtual machine programs come with a special "bridge" or "filter" driver which attaches to existing network interfaces and allows the program to send and receive packets (Ethernet frames) directly
。
这正是我想要的结果 - 具有以太网桥接(第 2 层)的 KVM 虚拟化。遗憾的是,libvirt/KVM 似乎不包含这样的驱动程序。但我认为可以使用其他一些 Unix 工具来实现。
答案1
它不是不支持桥接的“无线适配器”。它是接入点和 WiFi 主机到 AP 协议。建立连接时,您需要验证适配器的 MAC。该协议有三个 MAC 空间:直接经过验证的参与者和第三个 - 用于 AP 后面的任何端点。因此,WiFi 移动站可以向任何 MAC 发送数据包,但只能使用自己的 MAC 作为源地址。您不能发送任何带有经过验证的源 MAC 以外的其他源 MAC 的数据包 - AP 将拒绝该数据包。
还有一种真正能够桥接的 WiFi 协议,称为 WDS。这是通过在数据包中允许四个 MAC 地址来实现的:两个是直接经过身份验证的参与者,即桥接 AP,两个是数据包通过 WiFi 桥接传输的端点(源和目标)。
点击阅读http://wiki.mikrotik.com/wiki/Manual:Wireless_Station_Modes#802.11_limitations_for_L2_bridging对这个。
遗憾的是,WDS 标准化程度不高,每个供应商都以不兼容的方式自行评估。只有当 WiFi 联盟成为更......以用户为导向的组织时,他们才能更好地制定规范,我们才能在任意供应商解决方案之间,甚至在客户机和无线网络之间进行 wifi 桥接!
不过,Proxy-ARP 不是 L2 解决方案,而是 ROUTING 解决方案,即 L3。它欺骗了双方,因此您可以在这里和那里拥有相同的子网,但这仍然是路由,顺便说一句,这会稍微扰乱网络。查看任何机器上的 MAC 表以查看那里发生了什么:“那一侧”的所有 MAC 都是我们的代理 arp 路由器的 MAC。
对于真正的 L2 解决方案,您可以尝试使用 ebtables 实用程序配置的 Linux“MAC NAT”功能。由于这是我所知道的唯一真正的 L2 解决方案,我倾向于认为它由 VirtualBox 使用。但是,它基本上看起来像代理 arp。您当然应该能够使用 KVM 和 libvirt 实现这一点。
答案2
我和 Zvika 有完全相同的要求。顺便说一句,他关于这个主题的帖子非常精彩。我找到的替代方案是:在 KVM 中配置范围为 192.168.1.160/28 的路由网络(因此,第三个解决方案是“肮脏的黑客”),然后,我没有按照 Zvika 的方式创建 ARP 代理,而是使用了 parprouted,它在 Ubuntu/Mint 中以同名软件包的形式提供。使用 parprouted,您只需输入:
sudo parprouted virbr1 wlan0
由此可见,来宾 VM 与 192.168.1.0/24 网络中的其他设备之间的流量是双向的,如果该网络位于 NAT 后面,那么来宾 VM 与外部系统(例如 Internet 站点)之间的流量也是双向的。
这很难,无论如何,我花了几天时间搜索这个问题,但没有一个资料像 Zvika 的博客条目那样清晰!!
答案3
根据 KVM 的文档,无法使用无线网卡进行桥接。虽然我曾经在 VirtualBox 上桥接客户机,但我不知道原因是什么。
我花了几个小时才弄清楚如何将客户机连接到主机的无线网络,我发现最简单的方法是使用 TAP 设备。这种方法的唯一缺点是您不能在客户机上使用 DHCP,您必须手动从无线网络子网中为其指定 IP 地址(这可能会导致 IP 冲突或在部署大量虚拟机时造成不便)。
以下是使用 TAP 设备连接主机无线网络上的访客的步骤:
0/ 为 Linux 内核启用 IPv4 路由
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
1 / 创建一个名为 tap0 的 tap 设备,guest 用户(替换为您的用户名)无需 sudo 即可访问:
sudo ip tuntap add mode tap tap0 user guest
sudo ip link set tap0 up
2/ 为 tap0 设备分配一个 IP 地址(不必来自无线网络子网):
sudo ip addr add 10.10.10.10/24 dev tap0
3/ 使用parprouted
(您可能必须安装它)来实现代理 arp 桥接,它允许桥接主机无线网卡后面的客户以太网。
sudo parprouted wlan0 tap0
(将 wlan0 替换为你的主机的无线接口)
4/ 添加一些路由表条目以允许数据包通过 Tap 设备的末端:
sudo iptables -A INPUT -i tap0 -j ACCEPT
sudo iptables -A FORWARD -i tap0 -j ACCEPT
sudo iptables -A FORWARD -o tap0 -j ACCEPT
在客户机上分配主机无线网络子网中的静态 IP 地址。例如,如果您的 wlan0 位于 192.168.1.0/24,那么客户机可以配置为
sudo ip addr add 192.168.1.30/24 dev eth0
(eth0 是你的客户的 NIC)
或者永久地在 /etc/network/interfaces 中使用:
auto eth0
iface eth0 inet static
address 192.168.1.30
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.25
使用以下命令启动您的客户端:
kvm -hda guest.img -m 512 -net nic -net tap,ifname=tap0,script=no
现在,您无线网络上连接的所有机器和访客之间都可以进行 ping 操作了。