wpa_supplicant 是一个在 Linux 系统中广泛使用的开源 WLAN 客户端,负责连接和管理 Wi-Fi 网络。它支持 WPA、WPA2、WPA3 等多种安全协议,提供了从扫描网络到建立安全连接的完整功能栈。
核心功能
- 支持多种 Wi-Fi 安全协议:WPA/WPA2/WPA3、WEP、802.1X
- 支持多种身份验证方法:PSK、EAP-TLS、EAP-PEAP、EAP-TTLS 等
- 支持扫描和连接附近的 Wi-Fi 网络
- 支持通过配置文件管理多个网络
- 支持命令行和 D-Bus 接口进行控制
- 支持热点模式(AP 模式)
安装应用
Linux 系统
Ubuntu 系列
通过包管理器安装是最快捷的方式:
sudo apt-get update
sudo apt-get install wpasupplicant wireless-tools
编译安装
如果你想使用最新版本或进行定制化编译,可以下载源码进行安装:
# 下载源码
wget https://w1.fi/releases/wpa_supplicant-2.10.tar.gz
tar -zxvf wpa_supplicant-2.10.tar.gz
cd wpa_supplicant-2.10/wpa_supplicant
# 复制配置文件
cp defconfig .config
# 编译
make
# 安装
sudo make install
嵌入式系统
在嵌入式系统中,通常通过 Buildroot、Yocto 等构建系统集成 wpa_supplicant:
- Buildroot:在
make menuconfig 中启用 BR2_PACKAGE_WPA_SUPPLICANT
- Yocto:在 recipe 中添加
wpa-supplicant 依赖
配置文件详解
wpa_supplicant 使用文本配置文件来定义网络连接参数,默认路径通常是 /etc/wpa_supplicant/wpa_supplicant.conf。理解其结构对于管理复杂的无线网络环境至关重要。
基本结构
配置文件分为全局配置和网络配置块,一个典型的配置文件如下所示:
# 全局配置
ctrl_interface=/var/run/wpa_supplicant
update_config=1
country=CN
# 网络配置1:WPA2-PSK 网络
network={
ssid="MyWiFi"
psk="MyPassword123"
priority=1
}
# 网络配置2:开放网络
network={
ssid="OpenWiFi"
key_mgmt=NONE
priority=2
}
# 网络配置3:WPA3 网络
network={
ssid="WPA3WiFi"
psk="MyWPA3Password"
key_mgmt=SAE
priority=3
}
全局配置参数
| 参数 |
说明 |
示例 |
ctrl_interface |
控制接口路径,用于 wpa_cli 通信 |
/var/run/wpa_supplicant |
update_config |
是否允许通过 wpa_cli 修改配置 |
1(允许) |
country |
国家代码,影响可用信道 |
CN |
ap_scan |
扫描模式,0=不扫描,1=主动扫描,2=先被动后主动 |
1 |
网络配置参数
| 参数 |
说明 |
常用值 |
ssid |
网络名称 |
"MyWiFi" |
psk |
预共享密钥(明文或哈希值) |
"Password123" 或哈希值 |
key_mgmt |
密钥管理协议 |
WPA-PSK、WPA-EAP、SAE、NONE |
priority |
连接优先级,数值越大优先级越高 |
1、5、10 |
scan_ssid |
是否扫描隐藏网络 |
1(是)、0(否) |
proto |
支持的 WPA 协议版本 |
WPA、RSN(WPA2)、WPA RSN |
pairwise |
pairwise 加密算法 |
CCMP、TKIP |
group |
组加密算法 |
CCMP、TKIP、WEP104、WEP40 |
常用命令
启动 wpa_supplicant
与守护进程交互前,需要先启动 wpa_supplicant 服务。
# 基本启动方式
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
# 后台运行
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
# 使用系统日志
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B -f /var/log/wpa_supplicant.log
使用 wpa_cli 管理连接
wpa_cli 是一个强大的交互式命令行工具,用于实时管理和监控连接状态。
# 进入交互式模式
sudo wpa_cli -i wlan0
# 扫描网络
scan
scan_results
# 查看当前状态
status
# 连接到指定网络
add_network
set_network 0 ssid “MyWiFi”
set_network 0 psk “MyPassword”
enable_network 0
# 保存配置
save_config
# 断开连接
disable_network 0
# 删除网络
remove_network 0
生成 PSK 哈希值
为了安全起见,配置文件中的密码可以使用哈希值而非明文。wpa_passphrase 命令可以帮你生成。
wpa_passphrase “MyWiFi” “MyPassword”
输出示例:
network={
ssid="MyWiFi"
#psk="MyPassword"
psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
}
你可以将输出的 network 块直接复制到配置文件中,并删除明文密码的那一行注释。
工作流程
基本连接流程
- 初始化:加载配置文件,初始化无线网卡驱动。
- 扫描:根据
ap_scan 设置扫描可用的 Wi-Fi 网络。
- 选择网络:根据配置文件中的
ssid 和 priority 选择目标网络。
- 认证与关联:执行对应的安全协议握手(如 WPA2 的 4次握手)与接入点关联。
- 获取IP:关联成功后,通常由 DHCP 客户端获取 IP 地址(此步骤非 wpa_supplicant 负责)。
WPA2-PSK 4次握手流程
这是 WPA2-PSK 模式的核心安全流程:
- 接入点(AP)发送一个随机数(ANonce)给客户端。
- 客户端计算 PMK(由预共享密钥和SSID生成),并生成 SNonce 和 PTK,将 SNonce 发送给 AP。
- AP 收到 SNonce 后,计算 PTK,并将 GTK 加密后发送给客户端,并安装密钥。
- 客户端确认安装密钥,握手完成。
网络切换流程
当信号减弱或有更高优先级的网络可用时:
- 持续监控当前连接质量。
- 触发重新扫描或根据已有扫描结果评估其他网络。
- 断开当前连接,尝试连接新网络。
- 重新进行认证、关联和获取 IP 的流程。
常见问题处理
常见问题
| 问题 |
可能原因 |
解决方案 |
| 无法扫描到网络 |
无线接口未启用 |
运行 sudo ip link set wlan0 up |
| 无法连接到 WPA3 网络 |
设备或 wpa_supplicant 版本不支持 WPA3 |
升级 wpa_supplicant 版本或使用 WPA2 |
| 连接后无法获取 IP |
DHCP 服务问题 |
手动配置静态 IP 或检查 DHCP 服务器 |
| 连接经常断开 |
信号不稳定 |
调整天线位置、更换信道或检查干扰源 |
| 隐藏网络无法连接 |
未设置 scan_ssid=1 |
在对应网络配置中添加 scan_ssid=1 |
日志查看
当遇到连接问题时,查看日志是首要的排查手段。
# 查看系统日志中的 wpa_supplicant 日志
sudo journalctl -u wpa_supplicant.service
# 或查看自定义日志文件
tail -f /var/log/wpa_supplicant.log
# 调试模式启动(输出详细日志到控制台)
sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -d
调试命令
除了 wpa_supplicant 自身的日志,以下系统命令也能帮助你定位网络层问题:
# 查看无线接口状态
iwconfig
# 查看接口信息
ip addr show wlan0
# 查看路由表
ip route show
# 测试网络连通性
ping -c 4 8.8.8.8