KVM 虚拟机上的无线桥接

KVM 虚拟机上的无线桥接

我有一台连接到无线路由器的 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 操作了。

答案4

官方文档太悲观了。一如既往,聪明人已经找到了解决办法:你找到了(冗长的)说明来做到这一点这里。我试过了,很简单。

编辑:

我不确定为什么上述文章中发布的第一个解决方案对您不起作用,但对我来说却有效,而且您没有提供任何额外的信息。不过,您可能希望考虑另一种解决方案,这里,由 Bohdi Zazen 提供,使用代理地址解析协议 (proxy-arp)。我从未尝试过 (sol. n.1 对我来说有效,所以这有什么意义呢),但你可以试一试。

相关内容