[wpa_supplicant]基於ubuntu的wpa_supplicant工具的安裝與使用

                                               基於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,即解決

openssl-devel和openssl 是什麼具體關係

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需要同一用戶下啓動

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章