无线网卡通常无法桥接,或者有些支持WDS模式的无线网卡可用常规步骤实现桥接。通过查阅资料,找到一种另类方式实现桥接。
Intro
通常装完虚拟机后,会自动创建一个NAT网络用于虚拟系统联网。但实际使用中,此联网方式会使一些功能受限,例如windows虚拟机安装微信后,还原备份内容,就需要手机和PC版软件在同一局域网内而不是NAT。所以我们需要手动创建一个桥接网络,来实现宿主机和虚拟系统的局域网访问。
常规方法即:
- 创建网桥接口br0
- 将有线网卡(以太网卡)加入br0的控制
- 给br0赋IP(和局域网相同网段)
- 添加br0相关的route rule
- 虚拟机配置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 | net.ipv4.conf.wlp2s0.proxy_arp = 1 |
取文章中的arp proxy相关配置,在无线网卡wlp3s0(我pc是这个接口名)和创建的网桥接口br0目录中有proxy_arp
文件,修改为1并且禁用和启用一下接口,再添加路由规则,就可以愉快的将虚拟机加入宿主机的局域网啦。
1 | ip link add name br0 type bridge |
之后虚拟机就可以ping通局域网任何一台机了。