zoukankan      html  css  js  c++  java
  • Linux 使用wpa_supplicant手动配置连接wifi

    Linux 使用wpa_supplicant手动配置连接wifi

    wpa_supplicant

    简介

    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

    常用操作

    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 
    

    使用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问题

    开机启动

    加入开机脚本:

     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

    最后还是不行的话

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

    参考

    玩转「Wi-Fi」系列之wpa_supplicant 介绍(七)

  • 相关阅读:
    每日优鲜三面:在Spring Cloud实战中,如何用服务链路追踪Sleuth?
    一文就能看懂的Nginx操作详解,你还在查漏补缺吗!
    火花思维三面:说说Redis分布式锁是如何实现的!
    【秋招必备】Dubbo面试题(2021最新版)
    【秋招必备】Elasticsearch面试题(2021最新版)
    熬了一通宵!你竟然都没有弄懂陌陌面试官问的Java虚拟机内存?
    react-native-vector-icons 使用记录
    git
    在iOS项目中嵌入RN代码
    UITabBar 图标上下跳动
  • 原文地址:https://www.cnblogs.com/hokori/p/14168584.html
Copyright © 2011-2022 走看看