一、前言
最近入手了一臺T450,順便在上面安裝了Windows和Debian 8。一般而言,在windows下的時候通過WiFi上網毫無壓力,當然,做為linuxer,我其實也很少在T450上啟動windows,那麼問題來了,如何在Debian 8下使用WiFi呢?
具體的場景是這樣的,我們家的網絡是通過ADSL進入internet,ADSL modem的網線連接到了臺式機,而臺式機經常被夫人霸佔,我的T450的乙太網口毫無用武之地。買個hub吧又想省點錢,好在在某些外事活動中被贈送了一個隨身WiFi的小東西,這樣臺式機就變成了一個AP。同時,夫人還丟下一句話:你不是搞IT的嗎,這麼能,用WiFi吧。
好吧,反正有線無線都一樣,只要能上網就OK了。本文主要記錄T450筆記本在Debian 8系統上如何通過WiFi上網的。
二、基本術語
由於WiFi有很多的術語,我們必須要先理解其相關的術語,否則通過man看幫助文檔都不是很容易看懂的。需要說明的是本文的術語不是定義,僅僅是為了方便那些沒有WiFi經驗讀者,用通俗的語言描述這些WiFi名詞而已,精準的定義請參考IEEE802.11的標準。
1、SSID、ESSID和BSSID
我們首先看看BSS是什麼意思。所謂BSS就是basic service set,一組STA連接到了一個AP上就形成了一個BSS,BSS內有若干的STA(AP中也有一個STA),這些STA已經取得了同步(大家在同一個物理頻道上,用同樣的節拍在工作)。BSSID是basic service set identifier的縮寫,用來表示一個BSS,實際中一般用BSS中的AP的MAC地址做為BSSID。
若干個互聯的BSS形成一個ESS(extended service set),而ESSID(Extended Service Set IDentifier),通俗的講就是用來標識無線網卡要接入的網絡的。需要注意的是:這裡沒有說接入的AP,因為實際上一個wifi網絡中可能有多個AP,這些AP可以形成一個個的BSS(Basic Service Set),多個BSS可以組成一個ESS(Extended Service Set),因此ESSID其實就是標識ESS的ID的。
SSID就是service set identifier的縮寫,是一個統稱。
2、WEP、WPA、WPA2和802.11i
無線區域網的基礎協議是IEEE 802.11,這個協議定義了Wireless LAN中MAC層和PHY層的規格。在這個WiFi基礎協議中,數據加密採用了WEP(Wired Equivalent Privacy)的算法。從它的名字也可以看出,其目的是為了獲取和有線區域網一樣的安全性。WEP使用了RC4這種stream cipher,加密key可以是64 bit或者128 bit(對於用戶而言,使用40bit或者104bit的WEP key,因此WEP key和24 bit的initialization vector共同組成了RC4的key)。配合WEP,有兩種鑑權方法:一種是Open System authentication(其實就是不鑑權,任何的STA都可以連接到AP,雖然可以連接到AP,但是無線傳輸的數據都是WEP加密的,因此,如果要讓STA正常工作,它也需要有和AP一樣的WEP key),另外一種是Shared Key authentication。Shared Key安全性好過Open System authentication(有總比沒有強嘛),其基本過程分四步:
(1)STA發起鑑權請求
(2)AP收到鑑權請求後,下發一段明文(challenge-text)給STA
(3)STA用自己的WEP key對challenge text進行加密並回送AP
(4)AP用自己的WEP key解密,如果和自己之前下發的challenge text一樣,那麼就通過鑑權,允許該STA連接到AP。
由於WEP的安全性不好,WiFi聯盟(Wi-Fi Alliance)開發了新的安全協議和安全認證的方法,也就是WPA(Wi-Fi Protected Access)以及WPA2,WPA2在2004年被批准成為IEEE802.11i。我們分成兩個部分來看新協議對通信安全的增強。首先是加密方面,WEP容易被攻破,wifi聯盟緊急提出了一個叫做TKIP (Temporal Key Integrity Protocol)的協議。這種方法沿用了WEP的RC4加密方法(可以兼容舊的硬體,畢竟廠商們已經賣了辣麼多的WiFi設備),密鑰的長度是128 bit。不過TKIP對key進行了改進,不再是固定的一個key,而是為每一個發送的package使用不同的key,從而增強了破解的難度。為了進一步增強安全性,在WPA2(802.11i)中,一種叫做CCMP (CTR mode with CBC-MAC Protocol)的協議被制定出來。這個協議是基於AES的,反正是安全性很好,具體如何好如果有興趣請自行網上查閱。其次,我們再來看看鑑權方面。STA接入網絡而獲取服務是需要認證的,在STA上發起認證請求的實體就是supplicant,而接收請求的就是Authenticator,對於WiFi而已,一般Authenticator實現在AP側,負責處理來自各個連接到AP的認證請求。還有一個實體叫做Authentication Server,該實體是真正校驗來自supplicant的證書,判斷持有該證書的STA是否允許接入網絡,並將結果反饋給AP中的Authenticator實體。在鑑權過程的初期階段(生成Pairwise Master Key,即PMK),WPA2支持兩種方法:
(1)PSK(pre-shared key)。PSK是一個密碼學上的術語,其實就是交互信息的雙方預先都知道的一個密鑰(PSK),這個密鑰是通過其他安全途徑進行共享,和wifi這個通信途徑無關。
(2)EAP(Extensible Authentication Protocol)。TODO
基本上,在個人環境或者微小企業環境下,PSK的方法(WPA-Personal)就OK了,因此,本文進行wifi實驗的時候就選擇了PSK的方法。PSK有寫陌生,其實大家熟悉的都是所謂接入網絡的密碼(password),其實也就是大家輸入對話框的一個ASCII字符串,這是用戶可見的。但是,實際上進行通信的時候需要的是256 bit的key(PSK),只要雙方持有的這個256bit的key是相同的,那麼就OK啦。不過使用PSK比較麻煩,因此為了用戶方便實際上雙方共享的PSK都是通過passphrase或者password加上SSID計算出來的,因此,實際上用戶配置wpa的passphrase就可以了,內部會有算法將passphrase轉換成PSK(Note:我們可以用wpa_passphrase這個工具來生成256 bit的key)。
具體各種複雜的安全相關的內容這裡就不介紹了(不要問為什麼,因為我也沒有搞懂,希望後續有機會能研究以下),大家自行補腦吧。
三、軟體準備
通過WiFi上網主要是通過一個叫做wpa supplicant的軟體,本章描述了兩種方面獲取該軟體。第一種是通過Debian自己的包管理工作來安裝WiFi軟體,另外一種是自己動手,豐衣足食。
1、利用apt-get來獲取wpa supplicant軟體。命令如下:
sudo apt-get install wpasupplicant
安裝了該wifi軟體包之後,其實就是在系統中增加了下面相關的文件,羅列如下:
文件名描述/var/cache/apt/archives/wpasupplicant*.debwpasupplicant的安裝包文件/var/lib/dpkg/info/wpasupplicant.*這裡保存了關於wpasupplicant安裝包的一些信息。例如該安裝包的MD5文件、該安裝包的安裝文件列表等等。/usr/share/man/man5/wap_supplicant.conf.5.gz關於如何配置wpa_supplicant的manual信息。
2、手動編譯wpa supplicant
要想自己編譯wpa supplicant,當然需要source code,可以通過下面的命令獲取:
git clone git://w1.fi/srv/git/hostap.git
當然,這個git倉庫中不僅僅有wpa supplicant,還有hostap程序,不過這個程序和本文無關,略過。wpa supplicant是依賴libnl(netlink lib)和libssl(open ssl lib)這兩個庫的,因此我們首先要安裝libnl和libssl的開發包:
sudo apt-get install libnl-3-dev
sudo apt-get install libssl-dev
安裝完畢libnl和libssl的庫文件以及必要的頭文件之後,下面我們準備為wpa supplicant選擇feature(wpa supplicant功能太多,你只需要選擇你需要的功能)。配置文件是hostap/wpa_supplicant/目錄下的.config文件,我們可以從預設的配置文件開始,命令如下:
cp defconfig .config
defconfig是wap supplicant原始碼自己帶的配置文件,我們以它為起點,對.config文件進行編輯。當然,其配置項目很多,我們簡單描述其中幾個:
CONFIG_DRIVER_NL80211=y --------------(1)
CONFIG_CTRL_IFACE=y-----------------(2)
CONFIG_WPS=y
CONFIG_P2P=y---------------------(3)
CONFIG_AP=y
(1)wap supplicant是用戶空間的程序,那麼它是通過什麼樣子的接口和內核態的wifi網卡驅動進行通信呢?早期的接口叫做Linux wireless extension(對應CONFIG_DRIVER_WEXT),是一種ioctl type的接口。當netlink這種簡單又好用的接口出現的時候,nl80211這樣新的接口定義也隨之而來。這個選項是用來配置wpa supplicant是否支持nl80211類型的driver。還有若干CONFIG_DRIVER_*的配置項,大家自行閱讀注釋就OK了。
(2)wap supplicant是一個daemon,可以提供各種服務,而wpa cli是一個客戶端程序,可以通過命令行的方式來和wpa supplicant daemon進行交互,交互的管道是什麼呢?CONFIG_CTRL_IFACE就是用來配置這個通信用的管道,具體的術語叫做control interface。
(3)是否支持WiFi直連(Wi-Fi Direct)。這是一個很有意思的功能,後續可以另起一篇文章專門描述之。
大概的概念就是類似,大家可以自己試著進行配置。選擇了feature list之後,還需要修改一些庫和頭文件的路徑,其實主要就是配置libnl和libssl的路徑,如下:
CFLAGS += -I/usr/include/libnl3------------for libnl
LIBS += -L/lib/x86-64-linux-gnueabihf
CONFIG_LIBNL32=y-------配置libnl的版本
CFLAGS += -I/usr/include/openssl----------for libssl
LIBS += -L/lib/x86-64-linux-gnueabihf
具體的路徑大家可以根據實際情況修改。最後,來一個make就可以編譯啦。
四、連接AP
1、關於wpa_supplicant程序。
wpa_supplicant其實就是實現了WPA的客戶端操作以及IEEE802.1X supplicant端(即提出鑑權請求的那一端)的操作。該命令相關的命令行參數如下:
命令行參數描述-D driverwpa_supplicant應用程式使用哪一種接口和wifi driver進行溝通?對於比較新的linux內核,nl80211是必然的選擇。-B在後臺運行wpa_supplicant-C指明control interface參數-c設定配置文件-d -dd加大列印日誌的力度,-dd會進一步增加日誌信息。主要用於調試-f將列印信息log到指定的文件中,預設log會輸出到stdout-g配置全局的control interface的路徑。如果使用了-g參數,那麼各個interface的-C參數就無效了。-i指明wpa supplicant監聽的無線網卡的名字,一般是wlanx(x是一個數字,例如wlan0)。可以指明多個interface name,不過要用-N分隔-K在debug信息中輸出敏感的password信息-P指明保存該daemon的pid的文件-pdriver參數,優先級高於配置文件-s通過syslog輸出日誌。預設是輸出到stdout-q -qq和-d -dd是相反的操作-T通過Linux tracing系統輸出日誌。預設是輸出到stdout-tdebug信息中增加timestamp-u使能DBus control interface
2、配置文件
除了命令行參數可以控制wpa_supplicant的運行,配置文件也能影響其行為,具體如下:
配置項描述update_config是否允許wpa_supplicant程序修改配置文件。ctrl_interface對於linux或者unix而言,可以採用domain socket做為控制接口。/var/run/wpa_supplicant是一個推薦的配置。ap_scan配置scan AP的行為。上表只羅列出部分的配置項,其他的可以參考wpa_supplicant目錄下wpa_supplicant.conf文件中的注釋。
3、實際動手
首先編輯一個/etc/wpa_supplicant/home.conf文件,內容如下:
network={
ssid="your AP SSID"
key_mgmt=WPA-PSK
psk="your AP password"
}
為了不暴露我們家wifi的信息,這裡隱去了部分關鍵信息,^_^。
啟動wpa supplicant程序,命令如下:
Sudo wpa_suplicant –B –iwlan0 –Dnl80211 –c/etc/wpa_supplicant/home.conf
完成該命令後,可以iw dev wlan0 link查看連接信息,通過列印可以看出來,T450的無線網卡wlan0已經連接到了我們家的隨身WiFi的AP上了,不過還沒有IP位址,這也簡單,動態分配一個,命令如下:
sudo dhclient wlan0
通過ifconfig可以看到wlan0已經有了IP位址,至此,T450可以愉快的上網了。