1. 背景
尝试将笔记本电脑的 WiFi 网络在二层共享给qemu虚拟机,想当然地就执行了以下命令:
1 2 3 |
$ sudo brctl addbr br0 $ sudo brctl addif br0 wlan0 can't add wlan0 to bridge br0: Operation not supported |
2. 一些发现
2.1 wifi 标准限定 Station 模式下的接口不能与其他接口直接桥接
参考:https://superuser.com/questions/597834/bridging-wifi-to-ethernet-on-ubuntu-not-working/658143#658143
2.2 4-address 模式
4-address 指的是802.11包头部里面的4个MAC地址字段,设计的目的在于支持 WDS 桥接,多余的两个MAC地址用来表示以太网帧的 Source 和 Destination,参考 What is needed for WDS
- sender of the ethernet frame
- receiver of the ethernet frame
- sender of the WLAN frame
- receiver of the WLAN frame
使用 iw dev wlan0 set 4addr on 会开启4addr模式,然后可以通过 brctl 将其添加到桥接接口中;
但是此时网卡是无法作为 Station 正常工作的,因为AP并没有启用这种模式,也就会忽略来自 Staion 的 4-addr 模式的包;参考:Bridging: Loosing WLAN network connection with 4addr on option - Why
另外,使用这种 WDS 很大概率会和其他厂家的WDS方案不兼容;
总结: 4-addr 确实是无线网络桥接(Wlan to Ether)的解决方案,但是要求该 AP 下的所有 Station 同时使用这一模式,具体实施较不方便。
(有一个繁琐的解决措施, AP 或者 Station 建立两个虚拟的无线网络接口,4-addr 模式分别为 on 和 off.....
2.3 其他方案
-
2.3.1 VirtualBox
实际上 VirtualBox 是能够直接桥接到宿主机的wifi接口上的,可以发现其使用了一个内核模块,这里猜测也就是所谓的 “spoof MAC”,因为在AP侧看到宿主机、虚拟机IP所对应的MAC地址相同;
Ps: 如果 AP 做了一些安全加固,可能不允许一个 associated 设备出现多个MAC或IP地址;
Pss: 具体 VirtualBox 的代码实现并没有查阅, 以上为个人猜测;12345678910111213root@XXXXX:~/ # dmesg | grep VBoxNetFlt[42706.661956] VBoxNetFlt: attached to 'wlo1' / e4:f8:9c:00:00:00root@XXXXX:~/ # modinfo vboxnetfltfilename: /lib/modules/4.9.0-8-amd64/misc/vboxnetflt.koversion: 5.2.6 r120293 ((0xA2CDe001U))license: GPLdescription: Oracle VM VirtualBox Network Filter Driverauthor: Oracle Corporationsrcversion: BB20500B0B118D3871FEA6Bdepends: vboxdrvretpoline: Yvermagic: 4.9.0-8-amd64 SMP mod_unload modversions -
2.3.2 TP-Link 等路由厂家的WDS方案
实际上在多年以前,笔者就通过 TP-Link 路由器的WDS桥接功能,将其作为“ WLAN to Ether ”这样一个特殊的设备在用;因为两个路由器桥接之后,二层打通了,因此通过网线连接电脑也是同处一个二层网络的(ARP正常工作,未共享MAC地址?)。
实际上这两个路由器之间有没有悄悄地使用 4-address 的方式建立桥接,或者是其他办法实现的 WDS 协议,暂时还没有作更深入研究。
备注:
TP-Link (VxWorks) 桥接 TP-Link (VxWorkd) ==> 成功
TP-Link (VxWorks) 桥接 OpenWRT(hostapd 未配置 wds_sta=1) ==> 成功
TP-Link (VxWorks) 桥接 Padavan ==> 失败 => TP-Link 和 Padavan 互通,但是 TP-Link 下的 Wifi 客户端仅能和 TP 联通,无法到达 padavan 以及 padavan 下的其他设备 -
2.3.3 使用 ARP Proxy 方案
参考:Bridging Network Connections with Proxy ARP -
2.3.4 libpcap
一些奇奇怪怪的模拟器,使用 libpcap 的方案,实现一个虚拟的“网卡”,对所有数据包进行监听处理,响应ARP请求等,对外部表现为一个正常的具有独立MAC、IP 的设备。
3. 参考链接
- https://openwrt.org/docs/guide-user/network/wifi/atheroswds
- http://madwifi-project.org/wiki/AboutWDS#WhatisneededforWDS
- https://wireless.wiki.kernel.org/en/users/documentation/iw#using_4-address_for_ap_and_client_mode
- http://80211notes.blogspot.com/2013/09/understanding-address-fields-in-80211.html
- https://askubuntu.com/questions/155041/bridging-loosing-wlan-network-connection-with-4addr-on-option-why
- https://wiki.debian.org/BridgeNetworkConnectionsProxyArp
- https://superuser.com/questions/597834/bridging-wifi-to-ethernet-on-ubuntu-not-working/658143#658143
- http://lists.infradead.org/pipermail/hostap/2016-May/035670.html
博主,你的博客在看“下一页”时,报 404 错误。
这么刺激的吗? 估计是缓存插件导致的吧,我看下
感谢反馈:)