Linux使用wpa_supplicant手动配置连接WiFi

本文详细介绍了Linux下的wpa_supplicant服务,包括其功能、编译安装、配置方法,以及如何使用wpa_passphrase生成配置文件和通过wpa_cli进行WiFi管理和连接。涵盖了启动、连接流程和常见问题解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wpa_supplicant是Linux BSD, Mac OSX和Windows的WPA的服务,支持WPA和WPA2(IEEE 802.11i/RSN),它适用于台式机/笔记本和嵌入式系统,Supplicant是在客户端站中使用的IEEE 802.1X/WPA组件,它使用WPA身份验证器实现秘钥协商,并控制漫游和IEEEE802.11认证/关联的WLAN驱动程序
wpa_supplicant被设计成一个在后台运行的"守护进程"程序,并作为控制无线连接的后端组件,wpa_supplicant支持单独的前端程序,包含基于文本的前端(wpa_cli)和GUI(wpa_gui)
wpa_supplicant使用灵活的构建配置,可用于选择包含哪些功能.允许最小代码大小(WPA/WPA2-Personal 50kb 130kb的WPA/WPA2-Enterprise中没有调试代码,450kb大小具有大多数功能和全面的调试支持,这些示例大小来自X86平台的构建)

编译安装

Installation Environment :  Ubuntu 18.04 
Download (HTTP): https://w1.fi/releases/wpa_supplicant-2.6.tar.gz
Download MD5 sum: 091569eb4440b7d7f2b4276dbfc03c3c
Download size: 2.6 MB
Estimated disk space required: 36 MB
Estimated build time: 0.4 SBU (includes optional gui)

注意安装依赖,wpa_supplicant 依赖于 openssl , libnl

配置

wpa_supplicant的配置方式和其他的开源库不一样

  • wpa_supplicant目录中cp defconfig .config 拷贝生成编译配置

  • 配置文件中可以针对功能进行裁剪,适应更多的平台, 如指定openssl 库的路径, 配置libnl的版本

    # Uncomment following two lines and fix the paths if you have installed OpenSSL
    # or GnuTLS in non-default location
    #CFLAGS += -I/usr/local/openssl/include
    #LIBS += -L/usr/local/openssl/lib
    
    # Use libnl v2.0 (or 3.0) libraries.
    #CONFIG_LIBNL20=y
    
    # Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
    #CONFIG_LIBNL32=y

  • 指定编译器,默认的编译器为GCC,如需要交叉编译需要修改Makefile

    CC=arm-linux-gnueabihf-gcc

  • 指定安装路径, 默认的安装路径为/usr/local/目录下,交叉编译的时候需要指定路径来存放, 方便打包制作文件系统,同时也不会影响系统, 指定路径需要修改Makefile 中

     export LIBDIR ?= /usr/local/lib/
     export INCDIR ?= /usr/local/include/
     export BINDIR ?= /usr/local/sbin/

安装

make
make install

最后生成二进制可执行文件wpa_supplicantwpa_cli

1|2常用操作

wpa_supplicant是一个连接、配置WiFi的工具,它主要包含wpa_supplicant与wpa_cli两个程序。 可以通过wpa_cli来进行WiFi的配置与连接,前提要保证wpa_supplicant正常启动。

相当于wpa_supplicant 是服务端,wpa_cli 是客户端。

  • 启动wpa_supplicant应用
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
  • -D 驱动程序名称(可以是多个驱动程序:nl80211,wext)
  • -i 接口名称
  • -c 配置文件
  • -B 在后台运行守护进程

配置文件 /etc/wpa_supplicant.conf文件里,添加下面代码:

 

ctrl_interface=/var/run/wpa_supplicant  update_config=1 // 强制更新覆盖配置 

  • ctrl_interface指向的是一个目录,在这个目录中默认会生成一个文件/var/run/wpa_supplicant/wlan0,这是local socket address,相当于UNIX Domain Socket,程序和后台程序wpa_supplicant进行通信(其实是wpa_supplicant作为后台服务程序是通过本地socket和客户端进行通信的)

  • update_config = 1时会在(客户端发送SAVE_CONFIG命令)更新这个配置文件。

wpa_supplicant.conf配置文件解析:

update_config=1      //是否允许wpa_supplicant更新(覆盖)配置
eapol_version=1  //IEEE 802.1X / EAPOL版本
ap_scan=1  //AP扫描/选择
passive_scan=0   //是否强制被动扫描进行网络连接
user_mpm=1   //MPM驻留
max_peer_links=99  //最大对等链路数(0-255;默认值:99)
mesh_max_inactivity=300   //检测STA不活动的超时(以秒为单位)(默认值:300秒)
cert_in_cb=1  //cert_in_cb - 是否在事件中包含对等证书转储
fast_reauth=1   //EAP快速重新认证
driver_param="field=value"   //驱动程序接口参数
country=US  //国家码
dot11RSNAConfigSATimeout=60  //PMKSA的最长寿命,以秒为单位; 默认43200
uuid=12345678-9abc-def0-1234-56789abcdef0  //设备的通用唯一标识符
auto_uuid=0   //自动UUID行为
device_name=Wireless Client  //设备名称
manufacturer=Company  //生产厂家
model_name=cmodel  //型号名称
model_number=123 // 型号
serial_number=12345  //序列号
device_type=1-0050F204-1  //主要设备类型
os_version=01020300    //操作系统版本
config_methods=label virtual_display virtual_push_button keypad  //配置方法
wps_cred_processing=0   //凭证处理
wps_vendor_ext_m1=000137100100020001  //WPS M1中的供应商属性,例如,Windows 7垂直配对
wps_nfc_dev_pw: Hexdump of Device Password     //WPS的NFC密码令牌
wps_priority=0  //通过WPS添加网络的优先级
bss_max_count=200   //要保留在内存中的最大BSS条目数
filter_ssids=0  //filter_ssids - 基于SSID的扫描结果过滤
p2p_disabled=1   //禁用P2P功能
p2p_go_max_inactivity=300  //检测STA不活动的超时(以秒为单位)(默认值:300秒)
p2p_passphrase_len=8   //P2P GO的密码长度
p2p_search_delay=500   //并发P2P搜索迭代之间的额外延迟
okc=0   //机会密钥缓存(也称为主动密钥缓存)默认
pmf=0  //受保护的管理框架
sae_groups=21 20 19 26 25  //按优先顺序启用SAE有限循环组
dtim_period=2   //DTIM周期的默认值(如果未在网络块中覆盖)
beacon_int=100   //Beacon间隔的默认值(如果未在网络块中覆盖)
ap_vendor_elements=dd0411223301   //Beacon和Probe Response帧的其他供应商特定元素
ignore_old_scan_res=0  //忽略比请求更早的扫描结果
mac_addr=0  //MAC地址策略
rand_addr_lifetime=60  //随机MAC地址的生命周期,以秒为单位(默认值:60)
preassoc_mac_addr=0   //预关联操作的MAC地址策略(扫描,ANQP)
gas_rand_mac_addr=0  //GAS操作的MAC地址策略
gas_rand_addr_lifetime=60   //GAS随机MAC地址的生命周期(以秒为单位)
interworking=1   //启用互通
go_interworking=1   //启用互通的P2P GO广告
go_access_network_type=0   //P2P GO互通:接入网络类型
go_internet=1   //P2P GO互通:网络是否提供到Internet的连接
go_venue_group=7  go_venue_type=1  //p2p-go互通:群组场馆信息(可选)
hessid=00:11:22:33:44:55  //同源ESS标识符
auto_interworking=0   //自动网络选择行为
gas_address3=0  //GAS Address3字段行为
ftm_responder=0  // 在扩展功能元素位70中发布精确定时测量(FTM)响应器功能。
ftm_initiator=0  //在扩展功能元素位71中发布精确定时测量(FTM)启动器功能。
mbo_cell_capa=3  //MBO蜂窝数据功能
non_pref_chan=81:5:10:2 81:1:0:2 81:9:0:2  //多频段操作(MBO)非首选频道
 oce=1       //优化的连接体验(OCE)
mem_only_psk=0        //mem_only_psk:是否仅在内存中保留PSK /密码

启动wpa_cli应用

wpa_cli 有命令和交互的方式进行操作

wpa_cli -i wlan0 scan              //搜索附件wifi热点
wpa_cli -i wlan0 scan_result   //显示搜索wifi热点
wpa_cli -i wlan0 status              //当前WPA/EAPOL/EAP通讯状态
wpa_cli -i wlan0 ping                //pings wpa_supplicant

添加新的连接

wpa_cli -i wlan0 add_network   //添加一个网络连接,会返回<network id> 
wpa_cli set_network <network id>  ssid '"name"'  //ssid名称 
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   //优先级

保存连接

wpa_cli -i wlan0 save_config   //信息保存到默认的配置文件中,前面提到的/etc/wpa_supplicant.conf

断开连接

wpa_cli -i wlan0 disable_network <network id>  

连接已有连接

wpa_cli -i wlan0 list_network  //列举保存过得连接
wpa_cli -i wlan0 select_network  <network id>  //连接指定的ssid 
wpa_cli -i wlan0 enable_network  <network id>  //使能制定的ssid 

1|3使用wpa_passphrase

配置文件

我们一开始需要使用wpa_passphrase生成一个用于连接wifi的配置文件

[1] % wpa_passphrase
usage: wpa_passphrase <ssid> [passphrase]

If passphrase is left out, it will be read from stdin
  • ssid:要连接的WIFI名称
  • passphrase:密码
wpa_passphrase test_wifi 12345678 > /etc/wpa_supplicant/test.conf

wpa_passphrase的配置文件示例

ctrl_interface=/var/run/wpa_supplicant  # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
        ssid="dswei"		#WIFI名称
        proto=WPA  # proto: list of accepted protocols, 可取WPA,RSN
                   # 如果没有设置,默认为: WPA RSN
        key_mgmt=WPA-PSK # 认证方式
                         # 如果没有设置,默认为: WPA-PSK WPA-EAP
        pairwise=TKIP    # 如果没有设置,默认为: CCMP TKIP
        group=TKIP       # 如果没有设置,默认为: CCMP TKIP WEP104 WEP40 
        psk="a123654"	 # WIFI密码
}

测试和连接WIFI

 
 ifconfig wlan0 up
 wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf 
  • -D 指定网卡驱动可为: nl80211 wext
  • -i 指定网卡
  • -c 指定配置文件
  • & 挂起在后台

dhcp获取ip地址

dhclient 

如果是静态IP

fconfig wlan0 192.168.1.119 netmask 255.255.255.0
route add default gw 192.168.1.1
  • 192.168.1.119 为要设置的静态ip
  • 255.255.255.0 为要设置的子网掩码
  • 192.168.1.1 为要设置的网关

如果无法上网

  1. kill 掉 wpa_supplicant 和 dhclient 的进程 以重新测试
  2. 检查网卡名
  3. 检查配置文件
  4. -D更换驱动
  5. dns问题

1|4开机启动

加入开机脚本:

 touch /etc/rc.local
 chmod +x /etc/rc.local

脚本内容(命令请自行更改为测试通过的命令)

如果没有测试通过,千万不能写进开机脚本,防止不能开机

#!/bin/sh

ifconfig wlan0 up
wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf  #-B 参数为后台Daemon运行
dhclient 

exit 0

重启测试能否自动连接上wifi

1|5最后还是不行的话

可以使用nmtui连接,这是一款带有终端GUI 的软件,没有请自行百度安装。

<think>好的,我现在需要详细解释如何使用wpa_supplicant连接WiFi。首先,我得回忆一下wpa_supplicant的基本作用,它是一个在Linux系统中用于连接WPAWPA2加密无线网络的后台服务程序。用户需要配置相应的文件,并通过命令行工具来启动连接。 接下来,我应该分步骤来介绍整个过程,这样用户更容易理解。第一步通常是检查无线网卡是否被系统识别。用户可能需要使用命令如`iwconfig`或`ip link`来查看网卡接口名称,比如常见的wlan0或wlp3s0。这部分需要确保用户明确自己的网卡接口,否则后续步骤可能出错。 然后,配置wpa_supplicant配置文件是关键。需要指导用户创建或编辑`/etc/wpa_supplicant/wpa_supplicant.conf`文件,并正确填写网络块的内容,包括SSID和PSK。这里要注意PSK的生成方式,用户可能需要使用`wpa_passphrase`命令来生成加密后的密码,避免明文存储的安全问题。这时候可能会想到,如果用户直接输入明文密码,是否需要在配置文件中加引号?或者使用生成的哈希值?这部分需要准确说明,避免混淆。 接下来是启动wpa_supplicant服务。这里有不同的方法,比如直接运行命令并指定配置文件,或者使用systemctl来管理服务。需要指出两种方式的区别,以及可能遇到的问题,例如接口名称错误、配置文件路径不正确等。此外,如果是手动运行,可能需要指定驱动类型,比如wext或nl80211,这取决于无线网卡的型号和驱动支持,用户可能需要查阅相关文档或使用`iw list`来确认。 获取IP地址的步骤也很重要,通常使用dhclient或dhcpcd命令。需要提醒用户,如果系统使用NetworkManager或其他网络管理工具,可能会有冲突,建议停止相关服务后再尝试。这部分需要谨慎处理,避免用户因为服务冲突而无法连接。 最后,验证连接是否成功的方法,比如ping测试或检查IP地址,能帮助用户确认是否连接成功。如果遇到问题,可能需要检查日志文件,如使用`journalctl`查看系统日志,或者直接查看wpa_supplicant的输出信息。 在思考过程中,我需要确保每个步骤的准确性,尤其是命令和配置文件的语法是否正确。例如,wpa_supplicant配置文件中,network块的结构是否正确,引号是否遗漏,以及是否使用了正确的加密方式(如WPA-PSK)。同时,要考虑到不同Linux发行版可能存在的差异,比如配置文件的位置或服务管理工具的不同,可能需要给出通用建议或提示用户根据系统调整。 另外,需要注意权限问题,部分操作可能需要root权限,如编辑配置文件或运行服务,这需要在命令前加上sudo。同时,如果用户遇到驱动不支持的问题,可能需要安装额外的固件或驱动程序,这可能需要根据具体硬件提供指导,但可能超出当前问题的范围,所以可以建议用户查阅相关硬件文档。 最后,确保整个解释结构清晰,步骤分明,语言简洁,用户能够一步步跟随操作,并在遇到常见问题时提供排查方法,比如检查接口名称、配置文件语法、密码是否正确等。这样可以帮助用户自行解决大部分问题,提高成功率。</think>以下为使用wpa_supplicant连接WiFi的详细步骤: --- ### 一、前置准备 1. **确认无线网卡接口名** ```bash ip link | grep wlan # 通常为wlan0/wlp3s0等 iwconfig # 查看无线设备状态 ``` 2. **安装必要工具** ```bash sudo apt install wpasupplicant dhcpcd # Debian/Ubuntu ``` --- ### 二、配置wpa_supplicant 1. **生成加密PSK(推荐方式)** ```bash wpa_passphrase "你的WiFi名称" "明文密码" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf ``` ✔️ 输出示例: ``` network={ ssid="WiFi名称" #psk="明文密码" psk=5e1b456d3c9c1058743a1ae3d1d0260c... } ``` 2. **手动配置文件(可选)** ```bash sudo nano /etc/wpa_supplicant/wpa_supplicant.conf ``` ```conf ctrl_interface=/run/wpa_supplicant update_config=1 network={ ssid="WiFi名称" psk=加密后的密钥 # 或使用明文psk="密码"(不安全) key_mgmt=WPA-PSK # 加密协议类型 } ``` --- ### 三、连接WiFi 1. **启动wpa_supplicant** ```bash sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -D nl80211 ``` - `-B`:后台运行 - `-i`:指定接口名 - `-D`:驱动类型(`nl80211`或`wext`) 2. **获取IP地址** ```bash sudo dhclient wlan0 # 传统方式 sudo dhcpcd wlan0 # 使用dhcpcd ``` --- ### 四、验证连接 1. **检查连接状态** ```bash iwconfig wlan0 # 查看信号强度 ping -I wlan0 8.8.8.8 # 测试网络连通性 ``` 2. **查看详细日志** ```bash journalctl -u wpa_supplicant -f # 实时查看服务日志 ``` --- ### 五、故障排查 | 常见问题 | 解决方案 | |--------------------------|-----------------------------------| | 接口未找到 | 检查`ip link`,确认无线网卡驱动已加载 | | 超时无响应 | 尝试更换驱动类型(`-D wext`) | | 认证失败 | 检查PSK是否与路由器加密方式匹配 | | 无法获取IP | 停止NetworkManager:`sudo systemctl stop NetworkManager` | --- ### 六、进阶操作 1. **多网络配置** 在配置文件中添加多个`network{}`块,wpa_supplicant会自动选择可用网络 2. **隐藏SSID连接** 在network块中添加: ```conf scan_ssid=1 ``` 3. **企业级认证(WPA-EAP)** ```conf network={ ssid="企业网络" key_mgmt=WPA-EAP eap=PEAP identity="用户名" password="密码" phase2="auth=MSCHAPV2" } ``` --- 通过以上步骤,您应能完成基于wpa_supplicantWiFi连接。建议优先使用`wpa_passphrase`生成密钥以保证安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值