0%

Bridge Wireless 桥接无线网卡的另一种方式

无线网卡通常无法桥接,或者有些支持WDS模式的无线网卡可用常规步骤实现桥接。通过查阅资料,找到一种另类方式实现桥接。

Intro

通常装完虚拟机后,会自动创建一个NAT网络用于虚拟系统联网。但实际使用中,此联网方式会使一些功能受限,例如windows虚拟机安装微信后,还原备份内容,就需要手机和PC版软件在同一局域网内而不是NAT。所以我们需要手动创建一个桥接网络,来实现宿主机和虚拟系统的局域网访问。
常规方法即:

  1. 创建网桥接口br0
  2. 将有线网卡(以太网卡)加入br0的控制
  3. 给br0赋IP(和局域网相同网段)
  4. 添加br0相关的route rule
  5. 虚拟机配置NIC部分将网卡选择桥接模式,桥接网卡选择br0

Analysis

以上步骤针对有线网卡可以正常操作,但是对无线网卡无效。桥接本质上是虚拟多个mac地址,每个mac地址分配IP,由于无线AP的认证方式,只能认证3地址,虚拟机虚拟出的第4个mac地址发出的包会被AP拒绝接受,所以无法完成桥接;若网卡支持文章开头提到的WDS模式,就是4地址模式(可同过iw dev wlp3s0 set 4addr on开启),原则上可以桥接。
既然无法使用第4个mac地址认证,那就使用PC主机无线网卡的mac地址来认证吧。网络很多解决方法原理都是使用类似arp欺骗,即将虚拟机发出的IP包的mac地址改为需主机的无线网卡的mac地址再发出去,这样无线路由器AP就能认证通过,实现网络的联通。

维基百科的无线网桥接1中,提供的解决方法有如下几种:

  • 如果网卡支持wds模式,使用iw开启4addr, 然后常规桥接
  • 利用arp proxy软件 parprouted, 使用tunctl创建tap0, 然后parprouted wlan0 tap0
  • 利用ebtables创建防火墙规则来修改流量的mac地址为无线网卡的mac地址

Workaround

再次查阅资料,发现一个比较简单且不用安装软件包,也不用修改防火墙规则的方法,只需要开启系统中创建的网卡proxy_arp特性
John Lewis的文章2中写道在/etc/sysctl.conf添加

1
2
net.ipv4.conf.wlp2s0.proxy_arp = 1
net.ipv4.conf.br0.proxy_arp = 1

取文章中的arp proxy相关配置,在无线网卡wlp3s0(我pc是这个接口名)和创建的网桥接口br0目录中有proxy_arp文件,修改为1并且禁用和启用一下接口,再添加路由规则,就可以愉快的将虚拟机加入宿主机的局域网啦。

1
2
3
4
5
6
7
8
9
10
ip link add name br0 type bridge
cd /proc/sys/net/ipv4/conf
echo 1 > wlp3s0/proxy_arp
echo 1 > br0/proxy_arp
##if wlp3s0 already up
#ip link set dev wlp3s0 down
ip link set dev wlp3s0 up
ip link set dev br0 up
##my LAN is 192.168.2.0/24 and my Window 10 virtual machine's static IP is 192.168.2.48/32
ip route add 192.168.2.48/32 dev br0

之后虚拟机就可以ping通局域网任何一台机了。

参考