1. 前言
目前wifi調(diào)試,最重要的工具有兩個(gè):
- wpa_supplicant: WiFi Protected Access,網(wǎng)絡(luò)安全訪(fǎng)問(wèn)
- wireless-tools:
wpa_supplicant是一個(gè) 獨(dú)立運(yùn)行的 守護(hù)進(jìn)程,其核心是一個(gè)消息循環(huán),在消息循環(huán)中處理WPA狀態(tài)機(jī)、控制命令、驅(qū)動(dòng)事件、配置信息等。
wpa_supplicant 重要包括兩個(gè)可執(zhí)行工具:
| 工具 | 說(shuō)明 | 備注 |
|---|---|---|
| wpa_supplicant | wifi服務(wù)器 | 連接wifi,斷開(kāi)wifi,啟動(dòng)熱點(diǎn)等 |
| wpa_cli | wifi客戶(hù)端 | 通過(guò)本地socket連接wpa_supplicant,發(fā)送命令 |
本博主要講解wpa_supplicant的用法!
2. wpa_supplicant
2.1 配置文件
指令:cat /etc/wifi/wpa_supplicant.conf
更換wifi可手動(dòng)修改該配置文件
root@TinaLinux:/usr# cat /etc/wifi/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1
ap_scan=1
network={
ssid="ZZ"
key_mgmt=WPA-PSK
psk="officeworking"
priority=2 ##加了優(yōu)先級(jí),貌似并沒(méi)有什么卵用
}
network={
ssid="Jimmy"
key_mgmt=WPA-PSK
psk="12345678"
priority=1
}
Notice:詳情可參考以下連接
| 選項(xiàng) | 說(shuō)明 | 備注 |
|---|---|---|
| ssid | 連接的wifi名稱(chēng) | |
| key_mgmt | 加密級(jí)別 | 無(wú)密碼為NONE |
| psk | wifi密碼 | 無(wú)密碼則無(wú)此項(xiàng) |
| ctrl_interface | 控制接口 | 外部程序打開(kāi)該控制接口; 從而管理wpa_supplicant; 默認(rèn)為 /var/run/wpa_supplicant
|
| ctrl_interface_group | 可控制wpa_supplicant的群組ID | 默認(rèn)為root,ID=0 |
| update_config | 是否允許外部更新/覆蓋該配置文件 | 默認(rèn)是允許的 不允許只需要注釋掉(加#) |
| ap_scan | 接入點(diǎn)的掃描和選擇 | |
| network | 連接的路由器信息 | 可設(shè)置多個(gè),按順序連接; 第一個(gè)連接失敗,會(huì)嘗試第二個(gè) |
2.2 wpa_supplicant 參數(shù)信息
| 選項(xiàng) | 說(shuō)明 |
|---|---|
| -b | optional bridge interface name |
| -B | run daemon in the background |
| -c | Configuration file |
| -C | ctrl_interface parameter (only used if -c is not) |
| -d | increase debugging verbosity (-dd even more) |
| -D | driver name (can be multiple drivers: nl80211,wext) |
| -e | entropy file |
| -g | global ctrl_interface |
| -G | global ctrl_interface group |
| -h | show this help text |
| -i | interface name |
| -I | additional configuration file |
| -K | include keys (passwords, etc.) in debug output |
| -L | show license (BSD) |
| -N | start describing new interface |
| -o | override driver parameter for new interfaces |
| -O | override ctrl_interface parameter for new interfaces |
| -p | driver parameters |
| -P | PID file |
| -q | decrease debugging verbosity (-qq even less) |
| -t | include timestamp in debug messages |
| -v | show version |
| -W | wait for a control interface monitor before starting |
最常用的指令有如下幾個(gè):
- i:指定端口
- c:指定配置文件
- D:指定使用的wifi驅(qū)動(dòng)
如我的系統(tǒng)配置:
eg.
wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
驅(qū)動(dòng)解釋?zhuān)?/strong>
- nl80211 = Linux nl80211/cfg80211
- wext = Linux wireless extensions (generic)
- wired = Wired Ethernet driver
接口解釋
| 接口 | IP | 說(shuō)明 |
|---|---|---|
| Lo | 127.0.0.1 | Local Loopback,虛擬回環(huán)接口; 在系統(tǒng)內(nèi)部接收和發(fā)送數(shù)據(jù)包; 無(wú)需驅(qū)動(dòng)程序 |
| br0 | None | 網(wǎng)橋接口 可以將兩個(gè)接口進(jìn)行連接 對(duì)幀進(jìn)行轉(zhuǎn)發(fā) |
| eth0 | ABC類(lèi)網(wǎng)址內(nèi)網(wǎng)地址 | 以太網(wǎng)接口與網(wǎng)卡對(duì)應(yīng) 每個(gè)MAC對(duì)應(yīng)一個(gè)以太網(wǎng)接口 其工作完全由網(wǎng)卡相應(yīng)的驅(qū)動(dòng)程序控制 |
| WLAN0 | 同上 | 無(wú)線(xiàn)網(wǎng)卡對(duì)應(yīng)的接口 無(wú)線(xiàn)網(wǎng)卡需要對(duì)應(yīng)的驅(qū)動(dòng)程序才能工作 |
Notice
啟動(dòng)wpa_supplicant之前wifi必須先啟動(dòng),wpa_supplicnat使用在wifi client端口上
wifi啟動(dòng)命令:ifconfig wlan0 up
2.3 wpa_cli 參數(shù)信息
shell中鍵入 wpa_cli后,進(jìn)入一個(gè)交互界面,可輸入如下指令進(jìn)行對(duì)應(yīng)的操作!
Notice:如果不想進(jìn)入交互界面,可采用 wpa_cli [command]
| 指令 | 縮寫(xiě) | 說(shuō)明 |
|---|---|---|
| status | stat | displays the current connection status |
| disconnect | disc | prevents wpa_supplicant from connecting to any access point |
| quit | q | exits wpa_cli |
| terminate | term | kills wpa_supplicant |
| reconfigure | recon | reloads wpa_supplicant with the configuration file supplied (-c parameter) |
| scan | scan | scans for available access points (only scans it, doesn't display anything) |
| scan_result | scan_r | displays the results of the last scan |
| list_networks | list_n | displays a list of configured networks and their status (active or not, enabled or disabled) |
| select_network | select_n | select a network among those defined to initiate a connection (ie select_network 0) |
| enable_network | enable_n | makes a configured network available for selection (ie enable_network 0) |
| disable_network | disable_n | makes a configured network unavailable for selection (ie disable_network 0) |
| remove_network | remove_n | removes a network and its configuration from the list (ie remove_network 0) |
| add_network | add_n | adds a new network to the list. Its id will be created automatically |
| set_network | set_n | shows a very short list of available options to configure a network when supplied with no parameters. |
| get_network | get_n | displays the required parameter for the specified network. See next section for a list of parameters |
| save_config | save_c | saves the configuration |
2.4 手動(dòng)連接流程
現(xiàn)在演示以下一個(gè)完整的聯(lián)網(wǎng)過(guò)程:
0. 前提:?jiǎn)?dòng)wpa_supplicant
root@TinaLinux:/# wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf -B
Successfully initialized wpa_supplicant
1. 啟動(dòng)wpa_cli
root@TinaLinux:/usr/ty# wpa_cli
wpa_cli v2.6
Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.
Selected interface 'wlan0'
Interactive mode
2. 掃描附近的網(wǎng)絡(luò)
> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-NETWORK-NOT-FOUND
3. 列出掃描到的網(wǎng)絡(luò)
> scan_result
bssid / frequency / signal level / flags / ssid
30:23:03:d3:3f:bf 2452 -44 [WPA2-PSK-CCMP][WPS][ESS] SJoy Games
64:09:80:7a:49:05 2427 -48 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS] Xiaomi_4904
30:23:03:d3:46:03 2422 -43 [WPA2-PSK-CCMP][ESS] SJoy Games
4c:ed:fb:82:27:c0 2422 -46 [WPA2-PSK-CCMP][WPS][ESS] AC1900-106
30:23:03:d3:3f:97 2422 -52 [WPA2-PSK-CCMP][WPS][ESS] SJoy Games
b2:52:16:c9:06:d9 2462 -56 [WPA2-PSK-CCMP][WPS][ESS] DIRECT-d9-HP M227f LaserJet
4. 列出當(dāng)前的配置文件wpa_supplicant.conf中的配置網(wǎng)絡(luò)
我的配置中沒(méi)有任何信息
> list_network
network id / ssid / bssid / flags
5. 增加一個(gè)network
此處因?yàn)闆](méi)有網(wǎng)絡(luò)配置,所以從0開(kāi)始加
> add_network 0
0
> set_network 0 ssid "APP-TEST1" 【設(shè)置SSID】
OK
> list_network 【列出當(dāng)前網(wǎng)絡(luò)】
network id / ssid / bssid / flags
0 APP-TEST1 any [DISABLED]
> set_network 0 psk "SetPwdYourself" 【設(shè)置密碼】
OK
> get_network 0 psk
*
6. 使能添加的網(wǎng)絡(luò)
> enable_network 0
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
> list_network
network id / ssid / bssid / flags
0 APP-TEST1 any [CURRENT]
7. 將剛配置的信息寫(xiě)入到配置文件
> save_config
OK
8. 查看配置文件信息

2.5 自動(dòng)連接流程
自動(dòng)連接需要提前配置wpa_supplicant.conf文件,具體配置方式見(jiàn) 2.1節(jié)
此處采用shell腳本的形式,避免一條條的手動(dòng)輸入,麻煩?。?/p>
#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
#Autor: Jimmy
#Date: 2020-11-06
#Version: v1.0
start_sta() {
echo 0 > /sys/module/bcmdhd/parameters/op_mode
echo /lib/firmware/fw_bcm43438a0.bin > /sys/module/bcmdhd/parameters/firmware_path
ifconfig wlan0 up
if [[ -e "/var/run/wpa_supplicant/wlan0" ]]; then
rm "/var/run/wpa_supplicant/wlan0"
fi
wpa_supplicant -i wlan0 -c /etc/wifi/wpa_supplicant.conf -B
udhcpc -i wlan0 &
}
stop_sta() {
killall wpa_supplicant
killall hostapd
killall udhcpc
killall dnsmasq
ifconfig wlan0 down
}
restart_sta() {
stop_sta
sleep 1s
start_sta
}
start_ap() {
if [[ -z "$1" ]]; then
mac_addr=$(ifconfig wlan0|awk '{print $5}'|cut -c 13-|tr -d ' :\n')
ap_name="SmartLife-$mac_addr"
softap_up $ap_name
else
softap_up $1
fi
}
stop_ap() {
softap_down
}
restart_ap() {
stop_ap
sleep 1s
start_ap $1
}
case $1 in
start_sta)
start_sta
;;
stop_sta)
stop_sta
;;
restart_sta)
restart_sta
;;
start_ap)
start_ap $2
;;
stop_ap)
stop_ap
;;
restart_ap)
restart_ap $2
;;
*)
echo "Input option: $1 was error"
;;
esac
3. udhcpc
DHCP (Dynamic Host Configuration Protocol) ,目的就是方便管理區(qū)域網(wǎng)絡(luò)內(nèi)的裝置,當(dāng)一臺(tái) PC 連接到區(qū)域網(wǎng)絡(luò)時(shí),可向 DHCP Server 自動(dòng)獲取可用的 IP,并取得 subnet mask,gateway。
既然是網(wǎng)絡(luò)通信,肯定是要用DHCP的,網(wǎng)絡(luò)通信方式一般包括如下三種:
- 接入已有網(wǎng)絡(luò):即作為STA方式,此時(shí)DHCP為客戶(hù)端
- 做AP熱點(diǎn):即AP模式,DHCP此時(shí)為服務(wù)端
- 固定IP:DHCP不工作
DHCP的參數(shù)如下:
root@TinaLinux:/usr/ty# udhcpc -h
udhcpc: option requires an argument: h
BusyBox v1.24.1 () multi-call binary.
Usage: udhcpc [-fbqRB] [-t N] [-T SEC] [-A SEC/-n]
[-i IFACE] [-s PROG] [-p PIDFILE]
[-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... [-O OPT]...
-i,--interface IFACE Interface to use (default eth0)
-s,--script PROG Run PROG at DHCP events (default /usr/share/udhcpc/default.script)
-p,--pidfile FILE Create pidfile
-B,--broadcast Request broadcast replies
-t,--retries N Send up to N discover packets (default 3)
-T,--timeout SEC Pause between packets (default 3)
-A,--tryagain SEC Wait if lease is not obtained (default 20)
-n,--now Exit if lease is not obtained
-q,--quit Exit after obtaining lease
-R,--release Release IP on exit
-f,--foreground Run in foreground
-b,--background Background if lease is not obtained
-S,--syslog Log to syslog too
-r,--request IP Request this IP address
-o,--no-default-options Don't request any options (unless -O is given)
-O,--request-option OPT Request option OPT from server (cumulative)
-x OPT:VAL Include option OPT in sent packets (cumulative)
Examples of string, numeric, and hex byte opts:
-x hostname:bbox - option 12
-x lease:3600 - option 51 (lease time)
-x 0x3d:0100BEEFC0FFEE - option 61 (client id)
-F,--fqdn NAME Ask server to update DNS mapping for NAME
-V,--vendorclass VENDOR Vendor identifier (default 'udhcp VERSION')
-C,--clientid-none Don't send MAC as client identifier
Signals:
USR1 Renew lease
USR2 Release lease