Wpa_supplicant Linux wifi工具

发布时间: 更新时间: 总字数:3245 阅读时间:7m 作者:IP:上海 网址

wpa_supplicant是 Linux 中支持 WPA 和 WPA2 (IEEE 802.11i)协议的客户端,适用于台式机/笔记本和嵌入式系统,常用来管理 Wifi 链接

介绍

  • Wi-Fi 是一种无线网络技术,可用于将计算机(笔记本电脑和台式机)、移动设备(智能手机和可穿戴设备)以及其他设备(打印机和摄像头)连接到互联网
    • Wi-Fi 的设置至少需要一个接入点(Access Point,AP)和一个或一个以上的客户端用户(client)
    • 无线 AP 每 100ms 都会将 SSID(Service Set Identifier)经由 beacons(信号台)数据包广播一次,beacons 数据包的传输速率是 1 Mbit/s,并且长度相当的短,所以这个广播动作对网络性能的影响不大
    • 因此 Wi-Fi 规定其最低传输速率为 1 Mbit/s,以确保所有的 Wi-Fi client 端都能收到这个 SSID 广播数据包,client 可以借此决定是否要和这一个 SSID 的 AP 连线
  • wpa_supplicant 管理无线网卡驱动
    • 它是 Linux BSD, Mac OSX 和 Windows 的 WPA 的服务,支持 WPA 和 WPA2(IEEE 802.11i/RSN),它适用于台式机/笔记本和嵌入式系统,配置可参考
  • 组成
    • 守护进程:systemctl start wpa_supplicant.service
    • 客户端 cli:wpa_cli
  • NetworkManager 介绍替代

安装

apt install -y wpasupplicant

进程

  • 配置 /etc/wpa_supplicant/wpa_supplicant.conf
    • update_config=1 用来更新配置文件
    • ctrl_interface 用来指定 wpa_cli 的控制接口
    • priority 为优先级,值越大,优先级越高
    • 更多配置参考
ctrl_interface=/var/run/wpa_supplicant
update_config=1

# AP scanning
ap_scan=1

# ISO/IEC alpha2 country code in which the device is operating
country=CN

network={
    scan_ssid=1
    ssid="xxxx"
    psk="xxxx"
    bssid="xxx"
    priority=2
}

network={
	ssid="example"
	scan_ssid=1
	key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
	pairwise=CCMP TKIP
	group=CCMP TKIP WEP104 WEP40
	psk="very secret passphrase"
	eap=TTLS PEAP TLS
	identity="user@example.com"
	password="foobar"
	ca_cert="/etc/cert/ca.pem"
	client_cert="/etc/cert/user.pem"
	private_key="/etc/cert/user.prv"
	private_key_passwd="password"
	phase1="peaplabel=0"
}
  • 启动
wpa_supplicant -B -i $interface -c /etc/wpa_supplicant/wpa_supplicant.conf
  • -D 驱动程序名称(可以是多个驱动程序:nl80211,wext)

  • -i 接口名称

  • -c 配置文件

  • -B 在后台运行守护进程

  • 获取 IP 地址,也可以采用 udhcpc

dhcpcd <interface>
  • dhclient
$ /etc/systemd/system/dhclient.service
[Unit]
Description= DHCP Client
Before=network.target

[Service]
Type=simple
ExecStart=/sbin/dhclient wlp3s0 -v
ExecStop=/sbin/dhclient wlp3s0 -r

[Install]
WantedBy=multi-user.target

/sbin/wpa_action

  • wpa_action 是一个脚本,用于在 wpa_supplicant 事件发生时执行操作
    • wpa_cli 可以从 wpa supplicant daemon 中获取无线网卡的状态信息事件(CONNECTED 或者 DISCONNECTED event),然后会调用 wpa_action 进行相应的处理
  • man wpa_action 查看帮助信息

wpa_cli 使用

  • wpa_cli 可以在守护进程模式下运行,并根据来自 wpa_supplicant 的事件执行指定的脚本。支持两个事件:CONNECTED 和 DISCONNECTED
  • wpa_supplicantwpa_cli 一起使用,wpa_cli 可以查询和设置 wpa_supplicant 里面的参数,其是通过 sock 来通讯的,wpa_supplicant 运行的时候还在 /var/run/wpa_supplicant 下创建一个文件,wpa_cli 利用该文件还和 wpa_supplicant 通讯

help

wpa_cli -h ...

命令行示例

wpa_cli status

// 搜索附件wifi热点
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_result
wpa_cli -i wlan0 status
wpa_cli -i wlan0 ping

// 添加新的连接
wpa_cli -i wlan0 add_network   // 返回<network id>
wpa_cli set_network <network id>  ssid '"name"'
wpa_cli set_network <network id>  psk '"psk"'  // 密码
wpa_cli set_network <network id>  scan_ssid 1
wpa_cli set_network <network id>  priority  1

// 保存连接 /etc/wpa_supplicant
wpa_cli -i wlan0 save_config

// 断开连接
wpa_cli -i wlan0 disable_network <network id>

// 连接已有连接
wpa_cli -i wlan0 list_network
wpa_cli -i wlan0 select_network  <network id>
wpa_cli -i wlan0 enable_network  <network id>
iwconfig wlan0 essid <name>
# or
iwconfig wlan0 essid <name> key <password>

守护进程示例

#!/bin/sh

# IFNAME=$1
# ACTION=$2

case "$2" in
    CONNECTED)
        notify-send "WPA supplicant: connection established";
        ;;
    DISCONNECTED)
        notify-send "WPA supplicant: connection lost";
        ;;
esac

启动服务,当 wifi 网卡 CONNECTED、DISCONNECTED event 时,可以自定义相关的处理:

wpa_cli -a /path/to/wpa_action.sh -B

wpa_passphrase 生成加密密码

# 生成的 psk 是加密的
wpa_passphrase <ssid> <password> > /etc/wpa_supplicant/wpa_supplicant.conf

漫游 Roaming

  • WLAN 漫游是指 client 在不同的 AP 覆盖范围之间移动,且保持用户业务不中断的行为。
  • 漫游的分类
    • 有缝漫游
    • 无缝漫游
      • 无缝漫游又可以分为二层漫游和三层漫游
  • 配置示例:
bgscan="simple:30:-70:3600"
  • bgscan 参数用于配置后台扫描,格式为 <algorithm>:<interval>:<rssi_threshold>:<max_age>
    • <algorithm> 是背景扫描算法,可以是 simpleapscanmesh
    • <interval> 是扫描间隔,单位为秒
    • <rssi_threshold> 是信号强度阈值,单位为 dBm
    • <max_age> 是信号强度最大年龄,单位为秒

其他

  • 服务启动区别,参考
    • wpa_supplicant.service 一般在 D-Bus 类型的系统重,与 NetworkManager 一起使用
    • wpa_supplicant@interface.service 通过 接口名称 启动 wpa_supplicant 守护进程
      • 默认加载 /etc/wpa_supplicant/wpa_supplicant-<interface>.conf 配置文件
      • 一般与 systemd-networkd 配合使用
$ systemctl cat wpa_supplicant
# /lib/systemd/system/wpa_supplicant.service
[Unit]
Description=WPA supplicant
Before=network.target
After=dbus.service
Wants=network.target

[Service]
Type=dbus
BusName=fi.w1.wpa_supplicant1
ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant

[Install]
WantedBy=multi-user.target
Alias=dbus-fi.w1.wpa_supplicant1.service

$ systemctl cat wpa_supplicant@
# /lib/systemd/system/wpa_supplicant@.service
[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Before=network.target
Wants=network.target

# NetworkManager users will probably want the dbus version instead.

[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -Dnl80211,wext -i%I

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service
  • 更多配置示例参考
    • /usr/share/doc/wpasupplicant/README.modes.gz
    • /usr/share/doc/wpasupplicant/examples/wpa_supplicant.conf.gz
    • /usr/share/doc/wpasupplicant/examples/wpa-roam.conf
本文总阅读量 次 本站总访问量 次 本站总访客数