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 wpa_supplicant
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丢失,没有数据包进出无线网卡:

系统休眠以后无线网卡上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 配置样例 配置:

禁止随机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"
}

似乎有效,继续观察

参考