前言:
Linux系统下,可以配置无线网卡的工具和方法有很多,比如,nmcli,iw,wap_supplicant,hostapd 或者直接安装桌面,图形化配置等等
这些工具比较多,但基本都是一个共同的流程:先利用工具扫描到AP,然后设置无线网卡的连接方式,最后无线网卡连接无线路由,完成WiFi连接
那么在最近的无线网卡安装学习中,感觉有一些地方自己还是比较糊涂,对于wap_supplicant这个工具的了解也不是太深,因此,本文对该工具的使用做一个总结,也算是给自己留一个笔记吧。
一,
wpa_supplicant是什么工具?有什么特点?哪里获取该工具?
网络配置管理工具wpa_supplicant,该工具更多的用在无线网络配置管理上,虽然此工具也支持有线网络的配置和管理
其次,wpa_supplicant这个工具并不是所有的驱动都支持,最后wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP
wpa_supplicant 被设计成一个“守护程序”,在后台运行充当控制无线连接的后端,主要实现与WPA 身份验证器的秘钥协商,并控制wlan驱动程序的漫游和IEEE802.11身份验证/关联
wpa_supplicant 具体支持哪些功能?
WPA-PSK (“WPA-Personal”)
带有 EAP 的 WPA(例如,使用 RADIUS 身份验证服务器)(“WPA-Enterprise”)
CCMP、TKIP、WEP104、WEP40 的密钥管理
WPA 和完整的 IEEE 802.11i/RSN/WPA2
RSN:PMKSA 缓存、预身份验证
IEEE 802.11r
IEEE 802.11w
Wi-Fi 保护设置 (WPS)
wpa_supplicant主要是以下三个命令构成,依次是客户端,密码管理,服务端
[root@centos10 network-scripts]# wpa_
wpa_cli wpa_passphrase wpa_supplicant
例如,我已经配置好的无线网卡使用iwlist扫描到的WiFi:
无线网卡的名称是wls35u2, ESSID 就是AP 名称是mywife,验证方式是WPA2-PSK
[root@centos10 ~]# iwlist wls35u2 scan
wls35u2 Scan completed :
Cell 01 - Address: 50:33:F0:CD:21:D9
ESSID:"mywifi"
Protocol:IEEE 802.11bgn
Mode:Master
Frequency:2.432 GHz (Channel 5)
Encryption key:on
Bit Rates:867 Mb/s
Extra:rsn_ie=30140100000fac040100000fac040100000fac020000
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : PSK
IE: Unknown: DD9F0050F204104A0001101044000102103B00010310470010BC329E001DD811B286015033F0CD21D81021001852616C696E6B20546563686E6F6C6F67792C20436F72702E1023001C52616C696E6B20576972656C6573732041636365737320506F696E74102400065254323836301042000831323334353637381054000800060050F20400011011000B52616C696E6B4150535F3010080002008C103C000101
Quality=96/100 Signal level=34/100
Extra:fm=0003
一般的Linux发行版都有wpa_supplicant这个工具,无需编译安装,例如centos,本地仓库配置好后,直接yum就可以安装了:
下面是在本地仓库找这个wpa_supplicant,可以看到介绍WPA/WPA2/IEEE 802.1X Supplicant,说明这个软件主要是无线网络用的
[root@centos10 ~]# yum search wpa_supplicant
Loaded plugins: fastestmirror
Repository 'local' is missing name in configuration, using id
Loading mirror speeds from cached hostfile
================================================================================================================ N/S matched: wpa_supplicant ================================================================================================================
wpa_supplicant.x86_64 : WPA/WPA2/IEEE 802.1X Supplicant
Name and summary matches only, use "search all" for everything.
二,
wpa_supplicant配置无线网络的步骤
1,
无线和蓝牙内核是否禁用
[root@centos10 ~]# rfkill list
5: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
7: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
内核禁用WiFi和启用WiFi
[root@centos10 network-scripts]# rfkill block wifi
[root@centos10 network-scripts]# rfkill list
5: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
7: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no
[root@centos10 network-scripts]# rfkill unblock wifi
2,
wpa_supplicant扫描WiFi热点
严重注意:wpa_cli 运行需要有服务端,也就是wpa_supplicant -D nl80211 -i wls35u2 -c /etc/wpa_supplicant/wpa_supplicant.conf ,该命令必须先运行,不管是在前台还是在后台(后台运行是加参数 -B),否则
wpa_cli 将会报错,这里说的no such file通常指的是/var/run/wpa_supplicant/wls35u2
[root@centos10 ~]# wpa_cli -i wls35u2 status
Failed to connect to non-global ctrl_ifname: wls35u2 error: No such file or directory
wpa_supplicant 前台运行后,如下输出:
[root@centos10 ~]# wpa_supplicant -D nl80211 -i wls35u2 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant
wls35u2: Trying to associate with 50:33:f0:cd:21:d9 (SSID='mywifi' freq=2432 MHz)
wls35u2: Associated with 50:33:f0:cd:21:d9
wls35u2: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wls35u2: CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=CN
wls35u2: WPA: Key negotiation completed with 50:33:f0:cd:21:d9 [PTK=CCMP GTK=CCMP]
wls35u2: CTRL-EVENT-CONNECTED - Connection to 50:33:f0:cd:21:d9 completed [id=0 id_str=]
看到有Connection后,才可以执行下面的扫描:
[root@centos10 ~]# wpa_cli -i wls35u2 scan
OK
[root@centos10 ~]# wpa_cli -i wls35u2 scan_result
bssid / frequency / signal level / flags / ssid
50:33:f0:cd:21:d9 2432 -65 [WPA2-PSK-CCMP][WPS][ESS] mywifi
52:33:f0:2d:21:d9 2432 -64 [WPA2-PSK-CCMP][WPS][ESS] mywifi-WiFi5
52:33:f0:7d:21:d9 2432 -65 [WPA2-PSK-CCMP][WPS][ESS]
f8:cd:c8:90:bc:32 2432 -76 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS] ChinaNet-gTUm
74:05:a5:dc:86:c2 2412 -77 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] YBJ
7c:b5:9b:82:f6:8b 2462 -83 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] KaiHome_2.4
7e:b5:9b:92:f6:8b 2462 -84 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS] TPGuest_F68B
f4:32:3d:98:9a:39 2412 -80 [WPA-PSK-CCMP+TKIP][ESS] ChinaNet-6b4R
0a:10:7b:70:7e:21 2447 -81 [WPA2-PSK-CCMP][ESS]
52:a0:30:bd:d3:f8 2412 -86 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]
56:ae:86:7a:bc:0e 2412 -87 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]
52:33:f0:7d:21:a5 2422 -87 [WPA2-PSK-CCMP][WPS][ESS]
52:33:f0:7c:1f:11 2422 -87 [WPA2-PSK-CCMP][WPS][ESS]
08:10:7b:f0:7e:21 2447 -83 [WPA2-PSK-CCMP][WPS][ESS] zhwww
58:c6:7e:fb:4f:38 2427 -84 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] ChinaNet-wfJ9
46:f9:71:2d:a0:b6 2462 -84 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]
f4:32:3d:98:b6:a1 2447 -86 [WPA-PSK-CCMP+TKIP][ESS] ChinaNet-Y3Th
44:f9:71:0d:a0:b6 2462 -86 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] MIQI
a0:cf:f5:e2:ce:18 2447 -88 [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] CMCC-DXk7
2a:77:77:3d:ff:30 2457 -89 [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]
5c:e5:0c:cb:4e:c3 2412 -87 [ESS] MiDeskLamp1S-4EC2-CB4EC2
此时查看网络状态和wpa_supplicant的状态:
wpa的状态,注意,这里wpa的状态是COMPLETED
[root@centos10 ~]# wpa_cli -i wls35u2 status
bssid=50:33:f0:cd:21:d9
freq=2432
ssid=mywifi
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=00:5c:c2:ce:dc:24
address=00:5c:c2:ce:dc:24
uuid=9437e8d3-f5a2-5382-8425-e6753f8d72ee
网络状态,只有ipv6:
[root@centos10 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:e8:89:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.123.20/24 brd 192.168.123.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fd15:4ba5:5a2b:1008:162e:7500:4e67:2fb1/64 scope global noprefixroute dynamic
valid_lft 86386sec preferred_lft 14386sec
inet6 fe80::523b:7d77:34e9:fa42/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wls35u2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:5c:c2:ce:dc:24 brd ff:ff:ff:ff:ff:ff
inet6 240e:348:378:4020:25c:c2ff:fece:dc24/64 scope global mngtmpaddr dynamic
valid_lft 6959sec preferred_lft 3359sec
inet6 fe80::25c:c2ff:fece:dc24/64 scope link
valid_lft forever preferred_lft forever
wpa_states的取值如下。
- WPA_DISCONNECTED: 表示当前未连接到任何无线网络。
- WPA_INTERFACE_DISABLED: 代表当前此wpa_supplicant所使用的网络设备
被禁用。- WPA_INACTIVE: 代表当前此wpa_supplicant没有可连接的无线网络。 这种情况
包括周围没有无线网络, 以及有无线网络, 但是因为没有配置信息( 如没有设置密码等) 而
不能发起认证及关联请求的情况。- WPA_SCANNING、 WPA_AUTHENTICATING、 WPA_ASSOCIATING: 分别
表示当前wpa_supplicant正处于扫描无线网络、 身份验证、 关联过程中。- WPA_ASSOCIATED: 表明此wpa_supplicant成功关联到某个AP。
- WPA_4WAY_HANDSHAKE: 表明此wpa_supplicant处于四次握手处理过程中。当使用PSK( 即WPA/WPA2-Personal) 策略时, STA收到第一个EAPOL-Key数据包则
进入此状态。 当使用WPA/WPA2-Enterprise方法时, 当STA完成和RAIDUS身份验证后
则进入此状态。- WPA_GROUP_HANDSHAKE: 表明STA处于组密钥握手协议处理过程中。 当STA
完成四次握手协议并收到组播密钥交换第一帧数据后即进入此状态( 或者四次握手协议中携
带了GTK信息, 也会进入此状态。 详情见4.5.5节EAPOL-Key交换流程分析) 。- WPA_COMPLETED: 所有认证过程完成, wpa_supplicant正式加入某个无线网
络
此时,给网卡wls35u2通过DHCP增加ipv4地址,该网卡就可以使用了:
一般,这个命令会非常快就完成,如果卡住很长时间,通常是wpa_supplicant 服务端报错了
dhclient wls35u2
上面的命令执行完毕后,查看wpa的状态,有ipv4地址了:
[root@centos10 ~]# wpa_cli -i wls35u2 status
bssid=50:33:f0:cd:21:d9
freq=2432
ssid=mywifi
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.2.7
p2p_device_address=00:5c:c2:ce:dc:24
address=00:5c:c2:ce:dc:24
uuid=9437e8d3-f5a2-5382-8425-e6753f8d72ee
去掉ipv4地址:
[root@centos10 ~]# dhclient wls35u2 -r
[root@centos10 ~]# ifconfig wls35u2
wls35u2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 240e:348:378:4020:25c:c2ff:fece:dc24 prefixlen 64 scopeid 0x0<global>
inet6 fe80::25c:c2ff:fece:dc24 prefixlen 64 scopeid 0x20<link>
ether 00:5c:c2:ce:dc:24 txqueuelen 1000 (Ethernet)
RX packets 847 bytes 85582 (83.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 34 bytes 4384 (4.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
二,
wpa_supplicant的配置文件
上面的扫描已经说了,必须要有配置文件,那么配置文件如何写呢?
1.
利用wpa_passphrase 指定WiFi名称和 WiFi的密码重定向到wpa_supplicant的主配置文件
wpa_passphrase mywife AP的密码 >/etc/wpa_supplicant/wpa_supplicant.conf
2,
WiFi的安全标准和wpa_supplicant服务的配置文件
- IEEE 802.11 所制定的是技术性标准 ,Wi-Fi 联盟所制定的是商业化标准 , 而 Wi-Fi 所制定的商业化标准基本上也都符合 IEEE 所制定的技术性标准。
- WEP 是1999年9月通过的 IEEE 802.11 标准的一部分;WPA(Wi-Fi Protected Access) 事实上就是由 Wi-Fi 联盟所制定的安全性标准 , 这个商业化标准存在的目的就是为了要支持 IEEE 802.11i 这个以技术为导向的安全性标准;而 WPA2 其实就是 WPA 的第二个版本。直观点说,WEP是较老的认证方法它有好几个弱点,因此在2003年被WPA淘汰,WPA又在2004年由完整的 IEEE 802.11i 标准(又称为 WPA2)所取代。
- WEP(Wired Equivalent Privacy),采用名为RC4的RSA加密技术
- WPA(Wi-Fi Protected Access) ,采用新的TKIP算法,TKIP算法保留了RC4所以也有其弱点,但是这个时候更好的CCMP还没完成,所以先在WPA上用TKIP技术
- WPA2是WPA的第2个版本,采用CCMP加密协定(在有些路由器等设备上设定加密协定或者加密算法的时候,可能会用类似AES之类的字眼替代CCMP)。所以WPA2+AES是安全性最强的。
另外,在有些无线网路设备的参数中会看到像 WPA-Enterprise / WPA2-Enterprise 以及 WPA-Personal / WPA2-Personal 的字眼 , 其实 WPA-Enterprise / WPA2-Enterprise 就是 WPA / WPA2 ; WPA-Personal / WPA2-Personal 其实就是 WPA-PSK / WPA2-PSK, 也就是以 ”pre-share key” 或 ” passphrase” 的验证 (authentication) 模式来代替 IEEE 802.1X/EAP 的验证模式 ,PSK 模式下不须使用验证服务器 ( 例如 RADIUS Server), 所以特别适合家用或 SOHO 的使用者。
还有,wep是旧的加密方式,工作于802.11B/G模式下而802.11N草案并不支持此加密方式,所以如果802.11N的设备采用wep加密方式后,它也只会工作在802.11b/g模式下,N的性能发挥不出来。
在本例中,mywif查询出来的 是 50:33:f0:cd:21:d9 2432 -65 [WPA2-PSK-CCMP][WPS][ESS] ,因此,我的无线路由使用的是WPA2
3,
wpa_supplicant主配置文件:
cat /etc/wpa_supplicant/wpa_supplicant.conf
# WPA-PSK/TKIP
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="example wpa-psk network"
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP
group=TKIP
psk="secret passphrase"
}
在本例中ssid是mywifi,psk是WiFi的密码,因此,本例使用的配置文件如下,主要是认证方式key_mgmt=WPA-PSK:
[root@centos10 ~]# cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant/
network={
ssid="mywifi"
psk="WiFi密码"
key_mgmt=WPA-PSK
#psk=0093d6fd4ee9d59e1c19c5468969b916ecdd3ab9011c766e8ae0761f706b0f6d
}
带证书的EAP:
# WPA2-EAP/CCMP using EAP-TLS
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="example wpa2-eap network"
key_mgmt=WPA-EAP
proto=WPA2
pairwise=CCMP
group=CCMP
eap=TLS
ca_cert="/etc/cert/ca.pem"
private_key="/etc/cert/user.p12"
private_key_passwd="PKCS#12 passhrase"
}
IEEE 802.1X:
# IEEE 802.1X with dynamic WEP keys using EAP-PEAP/MSCHAPv2
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="example 802.1x network"
key_mgmt=IEEE8021X
eap=PEAP
phase2="auth=MSCHAPV2"
identity="user name"
password="password"
ca_cert="/etc/cert/ca.pem"
}
三,
WiFi自动连接的设置
编辑/etc/sysconfig/wpa_supplicant这个文件,该文件是wpa_supplicant服务的环境变量文件,文件内容如下:
(wls35u2是无线网卡名称,ip a 命令可以看到的那个 -D nl80211是该无线网卡的驱动)
# Use the flag "-i" before each of your interfaces, like so:
# INTERFACES="-ieth1 -iwlan0"
INTERFACES="-iwls35u2"
# Use the flag "-D" before each driver, like so:
# DRIVERS="-Dwext"
DRIVERS="-D nl80211"
# Other arguments
# -u Enable the D-Bus interface (required for use with NetworkManager)
# -f Log to /var/log/wpa_supplicant.log
# -P Write pid file to /var/run/wpa_supplicant.pid
# required to return proper codes by init scripts (e.g. double "start" action)
# -B to daemonize that has to be used together with -P is already in wpa_supplicant.init.d
OTHER_ARGS="-P /var/run/wpa_supplicant.pid"
编辑文件/usr/lib/systemd/system/wpa_supplicant.service
cat /usr/lib/systemd/system/wpa_supplicant.service
[Unit]
Description=WPA Supplicant daemon
Before=network.target
After=syslog.target
[Service]
Type=dbus
BusName=fi.w1.wpa_supplicant1
EnvironmentFile=-/etc/sysconfig/wpa_supplicant
ExecStart=/usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf $INTERFACES $DRIVERS $OTHER_ARGS && ifconfig wls35u2 up && dhclient wls35u2
[Install]
WantedBy=multi-user.target
编辑/etc/rc.local 这个文件,在末尾添加如下命令:
[root@centos10 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
ifconfig wls35u2 up&&ifconfig wls35u2 up&ifconfig wls35u2 up&&sleep 40&&systemctl restart wpa_supplicant && ifconfig wls35u2 up && dhclient wls35u2
给这个文件/etc/rc.local 执行权限:
chmod a+x /etc/rc.local
重启服务器后,将会自动发现无线网卡并通过DHCP自动分配ip地址:
[root@centos10 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether 00:0c:29:e8:89:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.123.20/24 brd 192.168.123.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fd15:4ba5:5a2b:1008:162e:7500:4e67:2fb1/64 scope global noprefixroute dynamic
valid_lft 86378sec preferred_lft 14378sec
inet6 fe80::523b:7d77:34e9:fa42/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wls35u2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:5c:c2:ce:dc:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.7/24 brd 192.168.2.255 scope global dynamic wls35u2
valid_lft 604670sec preferred_lft 604670sec
inet6 240e:348:378:4020:25c:c2ff:fece:dc24/64 scope global mngtmpaddr dynamic
valid_lft 7067sec preferred_lft 3467sec
inet6 fe80::25c:c2ff:fece:dc24/64 scope link
valid_lft forever preferred_lft forever