基于ubuntu的wpa_supplicant工具的安装与使用
wpa_supplicant是WPA Supplicant组件的一个实现,即在客户站中运行的部分。它实现了WPA密钥与WPA认证者进行协商并使用EAP进行身份验证认证服务器。另外,它控制着漫游和IEEE802.11认证/关联的WLAN驱动程序。
wpa_supplicant被设计成一个运行在后台的守护进程,并充当控制无线连接的后端组件。wpa_supplicant包含一个支持单独的前端程序和一个示例基于文本的前端wpa_cli
使用WPA与AP关联时,使用以下步骤:
- wpa_supplicant请求内核驱动程序扫描相邻的BSS
- wpa_supplicant根据配置选择BSS
- wpa_supplicant请求内核驱动程序关联所选内容
BSS
- 如果WPA-EAP:集成IEEE 802.1X请求者完成EAP
认证服务器认证(由代理服务器代理)
AP中的身份验证器)
- 如果从IEEE 802.1X请求者收到WPA-EAP:主密钥
- 如果WPA-PSK:wpa_supplicant使用PSK作为主会话密钥
- wpa_supplicant完成WPA 4次握手和组密钥握手
与认证者(AP)
- wpa_supplicant为单播和广播配置加密密钥
- 可以发送和接收正常的数据包
第一章 安装
Wpa_supplicant的安装方法有两种:
第一种是在ubuntu中使用命令:
Sudo apt-get install wpasupplicant
该命令可将wpa_supplicant、wpa_cli、wpa_passphrase直接安装。十分方便
第二种是直接在官网下载源代码,编译、安装
1.1 使用命令安装
在终端输入sudo apt-get installwpasupplicant
1.2 源码编译安装
下载wpa_supplicant和openssl
由于wpa_supplicant需要使用openssl库,所以需要下载openssl库
下载源码
http://hostap.epitest.fi/wpa_supplicant/
下载wpa_supplicant-0.7.3.tar.gz (openssl用到0.7.3提供的补丁)
#tar xvfz wpa_supplicant-0.7.3.tar.gz
下载www.openssl.org/source/openssl-1.0.1c.tar.gz
#tar zxvf openssl-1.0.1c.tar.gz
编译openssl库
1、首先openssl需要用到wpa_supplicant中的补丁(可能不需要)
把wpa_supplicant里面的patches文件夹下的openssl-0.9.8e-tls-extensions.patch文件拷贝到openssl-0.9.8za目录下
运行:
patch -p1 < openssl-0.9.8e-tls-extensions.patch
2、如果需要交叉编译,需要在makefile中修改以下三个变量。如下以arm为例
makefile修改 (-为去掉设置, +为新加的设置)
#vi makefile
- CC= cc
+ CC= arm-none-linux-gnueabi-gcc
- AR= ar $(ARFLAGS) r
+ AR= arm-none-linux-gnueabi-ar $(ARFLAGS)r
- RANLIB= /usr/bin/ranlib
+ RANLIB= arm-none-linux-gnueabi-ranlib
Makefile修改完毕
3、编译
#./config
#make
#make install
编译需要root权限
编译过程可能出现错误:
PODdocument had syntax errors at /usr/bin/pod2man
原因分析:这是由于OpenSSL 1.0.1e 与 perl5.18 不兼容。
解决方法:
1、有人验证 安装perl 5.16 可以兼容,安排低版本perl 5.16可以解决问题。
2、删除 pod2man文件:
sudo rm /usr/bin/pod2man
结果:
在/usr/local/ssl目录下安装了ssl库
Openssl安装即完成。
4、拷贝下面文件驱动到目标系统/usr/lib
libssl.a
libcrypto.a
openssl 移植完成.
编译wpa_supplicant
1、交叉编译
进入wpa_supplicant-0.7.3.tar.gz解压生成的wpa_supplicant-0.7.3/wpa_supplicant目录中:同样如果需要交叉编译,以arm为例,如果不需要则不用改变
#cp defconfig .config //首先创建配置文件
#vim .config //需要交叉编译,修改配置文件
CC=arm-linux-gcc -L/usr/local/ssl/lib/
#CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
CFLAGS +=-I/usr/local/ssl/include
#CPPFLAGS +=-I../src/include -I../../src/router/openssl/include
LIBS += -L/usr/local/ssl/lib
#make
错误1:
../src/drivers/driver_nl80211.c:25:31:fatal error: netlink/genl/genl.h: No such file or directory
compilation terminated.
make: *** [../src/drivers/driver_nl80211.o] Error 1
安装libnl-dev 和libpopt-dev后,编译成功。
错误2:
Has no member named ‘ssl’
是由于编译找不到ssl模块。安装openssl-devel,即解决
Redhat在封装openssl的时候,把openssl分成了几个部分,执行码部分就是 openssl-1.0.0-27.el6.x86_64 这种包。openssl-devel-1.0.0-27.el6.x86_64这个就是包含了头文件,头文件参考,某些库文件等跟开发相关的东西。mod_ssl-2.2.15-26.el6.x86_64这个不是open ssl 本身的东西,是apache的模块。你在http://www.openssl.org/source/上下载的源码编译安装后得到的东西就是openssl-1.0.0-27.el6.x86_64和openssl-devel-1.0.0-27.el6.x86_64这两个包加在一起的内容。
另外,OpenSSL是分系列的,每个系列下再分版本 a b c d e…… 目前常用的是 0.9.8 1.0.0 1.0.1 三个系列。
RHEL 6.4 是openssl 1.0.0 系列的版本。RHEL 6.5 是 openssl 1.0.1 系列的版本。
Redhat 提供的openssl升级包的版本一般是openssl-1.0.0-27.el6.X.x86_64.rpm 这种。 Redhat 会把OpenSSL发布的补丁整合到现有版本中去,叫做backport。
例如,RHEL 6.4 目前的最新的OpenSSL就是2014-06-05发布的openssl-1.0.0-27.el6_4.4.x86_64.rpm 和openssl-devel-1.0.0-27.el6_4.4.x86_64.rpm
RHEL 6.5 则是2014-08-13发布的openssl-1.0.1e-16.el6_5.15.x86_64.rpm 和openssl-devel-1.0.1e-16.el6_5.15.x86_64.rpm。因为不同系列的OpenSSL,存在的安全漏洞或者BUG不一定相同,所以版本要根据系列来判断。当然,如果你愿意手动编译安装openssl,那么也可以,只是注意相关软件的依赖。
经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:
wpa_supplicant和wpa_cli。
wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,
wpa_cli用来搜索、设置、和连接网络。
wpa_passphrase:网络配置可以使用wpa_passphrase工具自动生成并添加到配置文件中。
将这三个可执行文件,copy到/usr/local/bin目录下,就可以在全局使用。
工具安装成功
第二章 使用
3.1 命令
https://wiki.archlinux.org/index.php/WPA_supplicant#Troubleshooting
该网页有整个使用过程的介绍
3.1.1 wpa_supplicant
用法
wpa_supplicant [-BddfhKLqqtuvW] [-P<pid file>] [-g<globalctrl>] \
[-G<group>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>][-p<driver_param>] \
[-b<br_ifname> [-MN -i<ifname> -c<conf>[-C<ctrl>] [-D<driver>] \
[-p<driver_param>] [-b<br_ifname>] [-m<P2P Device configfile>] ...
选项
-b= 可选的桥接接口名称
-B= 后台运行
-c= 配置文件路径
-C= ctrl_interface 参数(仅在-c不使用的时候使用)
-i= 接口名称
-d= 增加调试信息详细程度(-dd显示更多)
-D= 驱动名称
-f= 将日志输出到默认日志位置(通常为/ tmp)
-g= 全局ctrl_interface
-G= 全局 ctrl_interface group
-K= 包括密钥信息在调试中输出
-t= 调试信息添加时间戳
-h= 显示帮助文档
-L= 显示许可证
-p= 驱动程序参数
-P= PID 文件
-q= 减少调试信息详细程度(-qq更少)
-u= 驱动 DBus control interface
-v= 显示版本
-W= 在启动之前等待control interface monitor
-M= 开始描述匹配接口
-N= 开始描述新接口
-m= P2P Device的配置文件
驱动
nl80211 = Linux nl80211/cfg80211
wext = Linux wireless extensions (generic)
wired = wpa_supplicant wired Ethernet driver
roboswitch = wpa_supplicant Broadcom switch driver
bsd= BSD 802.11 support (Atheros, etc.)
ndis = Windows NDIS driver
通常示例
wpa_supplicant -Dnl80211,wext-c/etc/wpa_supplicant.conf -iwlan0 -B
3.1.2 wpa_cli
wpa_cli是一个基于文本的前端程序,用于与wpa_supplicant 进行交互。它用于查询当前状态,更改配置,触发事件并请求交互式用户输入。
wpa_cli支持两种模式:交互式和命令行。
wpa_cli命令:
status = 获取当前WPA/EAPOL/EAP 状态
mib= 获取MIB变量
help = 显示帮助文档
interface [ifname] = 连接接口
level <debug level> = 改变debug等级
license = 显示wpa_cli证书
logoff = IEEE 802.1X EAPOL state machine logoff
logon = IEEE 802.1X EAPOL state machine logon
set= 设置变量
pmksa = 显示PMKSA缓存
reassociate= 强制重新连接
reconfigure =强制wpa_supplicant重新读取配置文件
preauthenticate <BSSID> = 强制预先认证
identity <network id> <identity> = 为SSID配置身份
password <network id> <password> =为SSID配置密码
pin<network id> <pin> = 为SSID配置引脚
otp<network id> <password> = 为SSID配置临时密钥
passphrase <network id> <passphrase> =为SSID配置私钥
bssid <network id> <BSSID> = 为SSID设置首选BSSID
list_networks = 列举已经配置的网络
select_network <network id> = 选择网络(关闭其他)
enable_network <network id> = 启用网络
disable_network <network id> = 禁用网络
add_network = 添加网络
remove_network <network id> = 删除网络
set_network <network id> <variable> <value> =设置网络变量
get_network<network id> <variable> = 获取网络变量
save_config = 保存当前配置
disconnect = 断开连接,等待重新连接命令
scan = 扫描
scan_results = 扫描结果
get_capability <eap/pairwise/group/key_mgmt/proto/auth_alg> = 获取能力
terminate = 终止wpa_supplicant
quit = 退出wpa_cli
wpa_cli命令行选项
wpa_cli [-p<path to ctrl sockets>][-i<ifname>] [-hvB] [-a<action file>] \
[-P<pid file>] [-g<global ctrl>] [command..]
-h= 显示使用文档
-v=显示版本信息
-a= 以守护进程方式运行
-B= 后台运行
默认套接字路径: /var/run/wpa_supplicant
默认接口:在套接字路径中找到的第一个接口
3.1.3 wpa_passphrase
使用wpa_passphrase快速连接到其SSID已知的网络,wpa_passphrase是一种命令行工具,可生成wpa_supplicant所需的最小配置。
$ wpa_passphrase MYSSID 密码
3.2 运行
根据这两篇博文:
https://jingyan.baidu.com/article/ac6a9a5e4f411a2b653eace8.html
https://www.linuxidc.com/Linux/2011-04/34871.htm
运行wpa_supplicant需要注意,在ubuntu中的Networkmanager会影响wpa_supplicant的工作。
注意:很多操作需要root权限
第一步:
apt-get removeNetworkManager
第二步:
创建wpa_supplicant的配置文件。
Vi /etc/wpa_supplicant.conf
内容如下:
ctrl_interface=/var/run/wpa_supplicant //此意为与wpa_cli通信的套接字的位置
update_config=1 //允许wpa_cli的save_config命令保存配置文件
这是最简单的配置文件
第三步:
终端执行/etc/init.d/networking restart
重启网卡
注意:由于之前卸载networkmanager,所以此时的无线网卡应该是关闭状态
第四步:
Wpa_supplicant -B -Dnl80211 -c/etc/wpa_supplicant.conf -iwlan0 -d
第五步:
终端输入Wpa_cli。然后使用wpa_cli的交互模式,添加网络。
注意:wpa_supplicant和wpa_cli必须为同一用户。否则连接不上
第六步:
此时已经连接网络,但是由于dhcp未获取IP地址。所以没有IP地址。
终端dhclient命令,获取IP地址
第七步:(可能不需要)
可能此时没有DNS功能,无法解析域名
解决办法
修改 /etc/resolv.conf 添加内容 nameserver8.8.8.8 增加 DNS。
但是,上述方法会在重启后被清除,导致再次开机时需要重新配置,经过查阅网上资料,方法很多种,比较有效的就是,直接卸载掉开机重写该文件的 resolvconf。
执行命令:sudo apt-get autoremove resolvconf
如果仍需要使用 resolvconf ,则可在卸载后,对 /etc/resolv.conf 加锁后再重新安装该软件,这样 resolvconf 就不会在开机时重写该文件。
# 文件加锁 不可写
sudo chattr +i /etc/resolv.conf
# 文件解锁 可写
sudo chattr -i /etc/resolv.conf
3.3 常见问题
错误1 ioctl
Successfully initializedwpa_supplicant
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
原来在命令中
sudo wpa_supplicant -B -D n180211,wext -iwlo1 -c /home/wpa_supplicant.cfg
错把nl80211写成n180211,注意是数字1与字母l的区别。
错误2 current AP
wpa supplicant: No network configurationfound for current AP
说明配置文件写的不对,尤其从网上复制过来时常有看不见的tab字符等。
解决办法:从Archlinux文档上复制了一份格式正确的配置,再改一改就OK了
Archlinux文档
错误3 delete
ctrl_iface exists and seems to be in use -cannot override it
Delete ‘/var/run/wpa_supplicant/wlo1’ manually if it is not used anymore
Failed to initialize control interface ‘/var/run/wpa_supplicant’.
You may have another wpa_supplicant process already running or the filewas
left by an unclean termination of wpa_supplicant in which case you willneed
to manually remove this file before starting wpa_supplicant again.
系统已经存在打开的多个wpa_supplicant实例,执行一下sudo killall wpa_supplicant杀死所有wpa_supplicant即可。
错误4 PF_UNIX failed
ctrl_iface bind(PF_UNIX)failed
不知道原因,但是将wpa_supplicant的配置文件中wpa_supplicant.conf中的:
ctrl_interface=/var/run/wpa_supplicant
注释掉,此时无法与wpa_cli连接,但是wpa_supplicant可以工作。
所以肯定是在于wpa_cli通信的套接字处失败。但是具体原因不清楚
原博客地址:
http://bbs.chinaunix.net/thread-3588469-1-1.html
错误5:wpa_cli:re-trying
wpa_cli的用法:
运行时可能会出现如下的错误:
Could not connect to wpa_supplicant - re-trying
这个错误可能是因为你的wpa_supplicant进程没有启动起来造成的。
请参见如下的命令:
1、修改wpa_supplicant.conf文件
将所有的内容都注释掉,只留下这一行语句:
# /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
#
2、启动wpa_supplicant进程:
wpa_supplicant -Dwext -iwlan0-c/etc/wpa_supplicant.conf &
或
wpa_supplicant -B -Dwext -iwlan0-c/etc/wpa_supplicant.conf
3、然后ps -aux查看一下,是不是已经启动完成。
4、如果存在此进程,则你可以用wpa_cli命令进行进一步的配置。
wpa_cli -iwlan0
此时就不会再出现“Could not connect towpa_supplicant - re-trying" 的错误信息了。
而且会得到一个新的提示符" > "
错误5: wpa_cli:re-trying
如果wpa_supplicant是使用root用户启动,那么wpa_cli也要使用root用户。
即wpa_cli和wpa_supplicant需要同一用户下启动