Gentoo使用wpa_supplicant连接无线网络
我在很多Linux发行版中使用过 使用wpa_supplicant连接无线网络 配置无线网络,非常简洁的 wpa_supplicant
工具提供了诸如 wpa_passphase
来生成密码配置,使用起来非常顺手,甚至不需要 NetworkManager 这样大而全的管理工具。
我在 Gentoo Linux在MacBook Pro配置Wifi 实践中折腾了很久,最终通过替换 MacBook Pro 15" Late 2013 无线模块 BCM943602CS蓝牙无线模块 来解决NVIDIA私有无线驱动的问题。硬件升级之后,我发现一个很奇怪的问题,有一部分Wifi始终无法连接:
最顺利稳定连接的是我通过 VPN Hotspot 共享Android给运行在 MacBook Pro 15" Late 2013 上的Gentoo使用,可以看到 无线模块 BCM943602CS蓝牙无线模块 工作稳定
但是我发现我自己家里新安装的移动公司的宽带Wifi无法连接,并且我发现外出旅行,有些酒店的wifi不能连接,有的酒店wifi却能够正常连接
最初我以为是我的 BCM943602CS蓝牙无线模块 无线模块存在硬件兼容性问题(难道和某些Wifi不兼容?),但是我发现同一个 MacBook Pro 15" Late 2013 笔记本上安装的双启动 macOS 却完全正常工作。这说明硬件是好的,软件存在问题。
我初步估计是配置问题,但是我仔细对比了 wpa_supplicant.conf
配置,发现这个配置其实不需要复杂配置,只需要通过 wpa_passphase
自动生成密码配置就可以驱动。一些辅助配置也只是设置是否扫描隐藏AP,是否连接WiFi 5的 country
设置。
archlinux: wpa_supplicant 介绍了debug方法,给我启发:
wpa_supplicant
的debug ( -d
参数)/usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlp3s0 -d
此时就可以看到了关键的报错信息:
wpa_supplicant
的debug ( -d
参数) 输出wpa_supplicant v2.10
...
Reading configuration file '/etc/wpa_supplicant/wpa_supplicant.conf'
ctrl_interface='/run/wpa_supplicant'
update_config=1
ap_scan=1
country='CN'
Priority group 0
id=0 ssid='MY_SSID'
...
wlp3s0: Selecting BSS from priority group 0
wlp3s0: 0: xx:xx:xx:xx:xx:xx ssid='MY_SSID' wpa_ie_len=26 rsn_ie_len=24 caps=0x1031 level=-57 freq=5785
wpa_parse_wpa_ie_rsn: invalid group cipher 0x8 (000fac02)
wpa_parse_wpa_ie_rsn: invalid group cipher 0x8 (000fac02)
wlp3s0: skip RSN IE - parse failed
wlp3s0: skip WPA IE - GTK cipher mismatch
wlp3s0: reject due to mismatch with WPA/WPA2
...
invalid group cipher 0x8 (000fac02)
在Gentoo论坛和bugzilla平台可以找到,对应的是无线路由器使用了 TKIP
不安全的 WPA2-TKIP
Wi-Fi Protected Access(WPA) 标准,默认情况下Gentoo编译 net-wireless/wpa_supplicant
是关闭了 tkip
这个USE flag导致的。
解决方法很简单: 配置 /etc/portage/package.use/wpa_supplicant
内容如下:
/etc/portage/package.use/wpa_supplicant
激活 WPA2-TKIP
(不安全)无线加密支持net-wireless/wpa_supplicant tkip
然后重新 Gentoo emerge :
emerge --ask net-wireless/wpa_supplicant
这样,只需要保持原有 /etc/wpa_supplicant/wpa_supplicant.conf
不变:
wpa_supplicant.conf
ctrl_interface=/run/wpa_supplicant
update_config=0
ap_scan=1
country=CN
network={
ssid="MY_SSID"
#psk="MY_PSK"
psk=xxxxxxxxxxxxxxxxxxx
}
系统idle休眠导致无线网卡不工作问题
在解决了 wpa_supplicant
支持 WPA-TKIP
Wi-Fi Protected Access(WPA) 协议之后,确实驱动了 BCM943602CS蓝牙无线模块 正常工作,但是我接着发现,一旦系统idle休眠无线网卡就不工作了,此时IP丢失,没有数据包进出无线网卡:
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 98:01:a7:97:e2:c3 txqueuelen 1000 (Ethernet)
RX packets 2913 bytes 217943 (212.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1613 bytes 202396 (197.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
而且,只有笔记本电脑完全断电关机再重启才能正常工作(不断电而是 shutdown -r now
则无线网卡无法恢复)。看起来似乎和休眠有关,我检查了一下系统日志:
brcmf_inetaddr_changed
存在错误[Sat Sep 21 09:29:11 2024] ieee80211 phy0: brcmf_inetaddr_changed: fail to get arp ip table err:-52
如果系统不进入休眠(一直在使用),则上述系统日志有这条错误记录也没有关系,就是一休眠无线网卡就不工作。
参考 ieee80211 phy0: brcmf_inetaddr_changed: fail to get arp ip table err:-52, AFTER boot completes 有人提到了禁止 MAC address randomization
(随机MAC地址) 功能可以解决这个问题。我参考 wpa_supplicant.conf 配置样例 配置:
ctrl_interface=/run/wpa_supplicant
update_config=1
ap_scan=1
country=CN
#Mac spoof
#mac_addr=1
#preassoc_mac_addr=1
#gas_rand_mac_addr=1
#disable random MAC address
mac_addr=0
network={
ssid="MY_SSID"
psk="MY_PASSWD"
}
似乎有效,继续观察