您的位置:首页 > 理论基础 > 计算机网络

wpa_supplicant无线网络配置

2015-08-27 15:04 483 查看
wifi连接有一些阶段:但是还没了解他们的具体协议内容。

        1、AP定期发送beacon数据包,使无线终端更新自己的无线网络列表。
  ‍‍2、无线终端在每个信道(1-13)广播ProbeRequest(非隐藏类型的WiFi含ESSID,隐藏类型的WiFi不含ESSID)。‍‍

  ‍‍3、每个信道的AP回应,ProbeResponse,包含ESSID,及RSN信息。‍‍

  ‍‍4、无线终端给目标AP发送AUTH包。AUTH认证类型有两种,0为开放式、1为共享式(WPA/WPA2必须是开放式)。‍‍

  ‍‍5、AP回应网卡AUTH包。‍‍

  ‍‍6、无线终端给AP发送关联请求包associationrequest数据包。‍‍

  ‍‍7、AP给无线终端发送关联响应包associationresponse数据包。‍‍

  ‍‍8、EAPOL四次握手进行认证(握手包是破解的关键)。‍‍

  ‍‍9、完成认证可以上网。

4次握手如下:
1、当一个无线客户端与一个无线AP连接时,先发出连接认证请求(握手申请:你好!)

2、无线AP收到请求以后,将一段随机信息发送给无线客户端(你是?)AP发送一个随机数组给AP

3、无线客户端将接收到的这段随机信息进行加密之后再发送给无线AP (这是我的名片)STA用PSK将数据进行加密发送给STA。PSK通过AP的SSID和PASSWORD生成的。

4、无线AP检查加密的结果是否正确,如果正确则同意连接 (哦~ 原来是自己人呀!)AP判断加密是否正确。

关于wpa_supplicant的P2P功能:http://w1.fi/wpa_supplicant/devel/p2p.html

wpa_supplicant就是用来扫面AP和连接AP的。

参考:http://blog.sina.com.cn/s/blog_55465b470100l73l.html

启动服务器:

/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -O /var/run/wpa_supplicant

源码有解析:-B后台运行,-P将pid(进程ID)写到指定文件,-u启动DBus控制接口,-s将log写到syslog,-O通讯文件/var/run/wpa_supplicant,目录有个wlan0。-i指定网卡。

/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -iwlan0 -c/var/run/wpa_supplicant/con.conf
-c指定配置文件。配置文件:

#这里等于-O /var/run/wpa_supplicant,wpa_cli需要用到,ctrl_interface=/var/run/wpa_supplicant是一个目录,然后wpa_supplicant_add_iface调用wpa_supplicant_init_iface调用wpa_supplicant_ctrl_iface_init调用wpas_ctrl_iface_open_sock,将会组合/var/run/wpa_supplicant/wlan0.wlan0是-i参数。/var/run/wpa_supplicant/wlan0用来与wpa_cli通讯SOCKET用的。

ctrl_interface=/var/run/wpa_supplicant/

update_config=1

WPA_SUPPLICANT简单理解:源码main.c是入口,假设用epoll,其实一般用的是select。

1.wpa_supplicant_init将运行时的参数配置进全局structor中,并调用eloop_init>>epoll_create1。

2.wpa_supplicant_add_iface添加interface,如wlan0数据。调用wpa_supplicant_init_iface-》wpa_config_read读取-c文件内容,->wpa_supplicant_ctrl_iface_init->wpas_ctrl_iface_open_sock->wpa_supplicant_ctrl_iface_path(获得通讯地址文件)建立unix socket(/var/run/wpa_supplicant/wlan0),eloop_register_read_sock调用epoll_ctrl注册通讯的读取事件。并注册回调函数wpa_supplicant_ctrl_iface_receive用以接收wpa_cli命令。wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);注册回调函数,用以发送msg到wpa_cli。

3. wpa_supplicant_run->eloop_run处理超时/读写/信号。其中 epoll_wait接收wpa_ctrl通讯(写事件),通过eloop_sock_table_dispatch回调函数wpa_supplicant_ctrl_iface_receive处理。最终处理函数一般进wpa_supplicant_ctrl_iface_process

启动客服端:

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant

-p指定与wpa_supplicant通讯的文件。UNIX_SOCK.

1.扫描AP

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan

2.打印扫描结果:6c:b0:ce:bd:d0:b3(mac)    2462(frequency)    -43(signal)    [WPS][ESS](加密方式)    Ocean-2.4G(ssid)

加密方式有:open和[WPS][ESS]都可以用key_mgmt NONE来连接,

[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP].PSK:Pre-Shared Key (clear or encrypted)预共享秘钥。设置key_mgmt为WPA-PSK,pairwise(Pairwise ciphers for WPA)配置为CCMP TKIP

[WPA-EAP-CCMP+TKIP][WPA2-EAP-CCMP+TKIP][ESS].EAP扩展认证协议

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result

3.添加网络接口。

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network

4.向网络接口0添加AP的SSID,用于连接。

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Ocean-2.4G"'  ###注意'""'

5.key_mgmt秘钥类型管理。

如果是OPEN:秘钥([WPS][ESS]    Ocean-2.4G)。

WEP:模式key_mgmt NONE,有wep_key0设置密码。

WPA-PSK:就要key_mgmt WPA-PSK设置psk密码,

WPA-EAP:就要key_mgmt WPA-EAP可能还要选择加密类型eap(MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS),EAP identity string和password.EAP用的比较少。

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt NONE

6.启动接口0,去连接AP。

sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0

7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status

查看状态结果:

bssid=6c:b0:ce:bd:d0:b3

ssid=Ocean-2.4G

id=0

mode=station

pairwise_cipher=NONE

group_cipher=NONE

key_mgmt=NONE

wpa_state=COMPLETED

ip_address=192.168.6.103

address=c4:85:08:8f:66:23

uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410

8.sudo udhcpc -iwlan0

去AP网络dhcp服务器取得动态IP。

注:udhcpc分配IP成功了,该进程就没用了,可以kill掉。更多关于udhcpc用法参考:http://blog.csdn.net/hxchuan000/article/details/47810229

Sending discover...如果失败会一直discover。

Sending select for 192.168.43.180...成功分配IP。。。。

--------------sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant select_network 0

切换本地网络接口。

连接WPA_PSK网络:

1.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status

状态结果:

wpa_state=INTERFACE_DISABLED

ip_address=192.168.6.103

address=c4:85:08:8f:66:23

uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410

2.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan

OK

3.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result

查看要连接的AP

76:04:2b:60:43:74    2442    -32    [WPA2-PSK-CCMP][WPS][ESS]    Lenovo K50-T5

4.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network

添加网络接口。

5.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Lenovo K50-T5"'        ###注意'""'

添加AP的SSID

6.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt WPA-PSK

加密方式WPA_PSK

7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 psk '"4da886c21a9c"'

添加psk密码。

8.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0

使能网络。

9.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status

结果:

bssid=76:04:2b:60:43:74

ssid=Lenovo K50-T5

id=0

mode=station

pairwise_cipher=CCMP

group_cipher=CCMP

key_mgmt=WPA2-PSK

wpa_state=COMPLETED

address=c4:85:08:8f:66:23

uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410

10.sudo udhcpc -iwlan0

去AP网络dhcp服务器取得动态IP。

Sending discover...如果失败会一直discover。

Sending select for 192.168.43.180...成功分配IP。。。。

这样就链接到AP了,可以通过他来连接到外网。udhcpc的用法之前有说过,用自己的脚本来实现ip配置。

而我们一般都是将这些配置写到wap_supplicant的配置文件里面:

ctrl_interface=DIR=/data/system/wpa_supplicant

GROUP=system

update_config=1

network={

ssid="AP ssid"

proto=WPA

key_mgmt=WPA-PSK

#psk="ap password"

psk=f161f2018e3b0f5dbe055360ea89eba0c0c014840b1e0091a99774222a61fa60

#psk是通过wpa_passphrase使用SSID和PASSWORD共同生成的

pairwise=CCMP TKIP(如果有的话,CCMP TKIP都是加密算法)

group=CCMP TKIP

}

启动wpa_supplicant就运行起来了。

=============================================================================

=============================================================================

分割线,参考资料:

=============================================================================

=============================================================================

目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。

wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。

经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

如何用wpa_supplicant使能一个wifi连接?

Stepby step:

1、运行wpa_supplicant程序;

执行:/system/bin/wpa_supplicant-d
-Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf

其中:

-d:增加调试信息

-Dwext:wext,驱动名称

-iwlan0:wlan0,网络接口名称

/system/bin/wpa_supplicant:wpa_supplicant可执行程序path

/data/misc/wifi/wpa_supplicant.conf:wpa_supplicant的配置文件path

2、运行命令行工具wpa_cli;

执行:wpa_cli-iwlan0
-p/data/system/wpa_supplicant

注,-p/data/system/wpa_supplicant中的wpa_supplicant并不是可执行程序,而是个控制套接字。

此时会进入交互模式。其中交互模式的命令如下表:
Fullcommand
Shortcommand
Description
status
stat
displaysthe current connection status
disconnect
disc
preventswpa_supplicant from connecting to any access point
quit
q
exitswpa_cli
terminate
term
killswpa_supplicant
reconfigure
recon
reloadswpa_supplicant with the configuration file supplied (-c parameter)
scan
scan
scansfor available access points (only scans it, doesn't displayanything)
scan_result
scan_r
displaysthe results of the last scan
list_networks
list_n
displaysa list of configured networks and their status (active or not,enabled or disabled)
select_network
select_n
selecta network among those defined to initiate a connection (ieselect_network 0)
enable_network
enable_n
makesa configured network available for selection (ie enable_network 0)
disable_network
disable_n
makesa configured network unavailable for selection (ie disable_network0)
remove_network
remove_n
removesa network and its configuration from the list (ie remove_network0)
add_network
add_n
addsa new network to the list. Its id will be created automatically
set_network
set_n
showsa very short list of available options to configure a network whensupplied with no parameters.
Seenext section for a list of extremely useful parameters to be usedwith set_network and get_network.
get_network
get_n
displaysthe required parameter for the specified network. See next sectionfor a list of parameters
save_config
save_c
savesthe configuration
设置网络的基本格式:set_network<network
id> <key> <parameter> [<parameter>]

显示网络信息的基本格式:get_network<network
id> <key>

相应的参数如下表:
Key
Description
Parameters
ssid
Accesspoint name
string
id_str
Stringidentifying the network
string
priority
Connectionpriority over other APs
number(0 being the default low priority)
bssid
Macaddress of the access point
macaddress
scan_ssid
Enable/disbalessid scan
0,1, 2
key_mgmt
Typeof key management
WPA-PSK,WPA_EAP, None
pairwise
Pairwiseciphers for WPA
CCMP,TKIP
group=TKIP
Groupciphers for WPA
CCMP,TKIP, WEP104, WEP40
psk
Pre-SharedKey (clear or encrypted)
string
wep_key0
WEPkey (up to 4: wep_key[0123])
string
eap
ExtensibleAuthentication Protocol
MD5,MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS
identity
EAPidentity string
string
password
EAPpassword
string
ca_cert
Pathnameto CA certificate file
/full/path/to/certificate
client_cert
Pathnameto client certificate
/full/path/to/certificate(PEM/DER)
private_key
Pathnameto a client private key file
/full/path/to/private_key(PEM/DER/PFX)
eg.1、连接无加密的AP

>add_network(It will display a network id for you, assume it returns 0)

>set_network0 ssid "666"

>set_network0 key_mgmt NONE

>enable_network0

>quit

eg.2、连接WEP加密AP

>add_network(assume return 1)

>set_network1 ssid "666"

>set_network1 key_mgmt NONE

>set_network1 wep_key0 "your ap password"

>enable_network1

eg.3、连接WPA-PSK/WPA2-PSK加密的AP

>add_network(assume return 2)

>set_network2 ssid "666"

>set_network2 psk "your pre-shared key"

>enable_network2

到此,wifi模块就能连接上AP了。

3、以上是通过命令行工具wpa_cli来实现wifi网络的连接。当然,也可以通过wpa_supplicant的配置文件来实现连接。

再回顾下运行wpa_supplicant时执行的命令:

/system/bin/wpa_supplicant-d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf

我们在执行时加上了-c/data/misc/wifi/wpa_supplicant.conf,我们可以将我们要连接的AP的设置以一定的格式写入wpa_supplicant.conf配置文件中即可。

eg.

ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=system update_config=1

network={

ssid="myaccess point"

proto=WPA

key_mgmt=WPA-PSK

psk="youpass words"

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: