Skip to main content
 首页 » DevOps

WIFI_认证加密学习_STA_AP_WDS

2022年07月19日28mengfanrong

2-1.1_15_使用卡1_准备工作及配置内核
====================================
1.无线网卡连接上路由或AP之后使用上是和有线网卡是一样的,都是socket编程。
2.同一个WIFI网卡可以工作在不同的模式,AP或STA模式
3.网址:http://wireless.kernel.org/en/users/Devices/USB 里面列出了Linux支持的所有网卡的VID和PID
4.带天线的网卡信号比较强,获取电流也就比较大,如果供电不足的话,在使用过程中会出现很多莫名其妙的问题。
5.推荐两种网卡:
Atheros:VID 0x13D3 PID 0x3327 成品型号:AR9271
realtek:VID 0x0bda PID 0x8176 成品型号:TP-LINK公司的TL-WN721N
注意即使是同型号的网卡,使用的网卡芯片也可能不一样,购买时需要先咨询PID VID。建议前面一个,有公开源码。

6.配置VMware虚拟机使用无线网卡
1)虚拟机 -> 设置 -> 网络适配器 -> 选择“桥接模式”或“自定义” 例如选中“自定义”中的VMnet0,
若有多个网卡的话然后选择使用哪一个网卡:edit -> 虚拟机网络编辑器 -> 桥接到指定的设备,桥接到里面列出来的就是Window下设备管理器中网络部分列出来的。
使用这种方法使Ubuntu桥接到笔记本的无线网卡中,ping百度是成功的!电脑网卡是Atheros AR956x

7.同一个系统中若有多个网卡的话,这些网卡的IP不能设置为同一个网段中?
比如说同时接了有线网卡和无线网卡,他两个也不可以使用相同的网段。

8.测试的时候PC, Linux虚拟机,开发板网卡都要设置在同一网段中。

9.已知USB网卡设备的VID PID,编译其驱动的方法:先检索其VID,PID在的源文件,然后在Makefile中顺藤摸瓜编译时选中。

10.内核中某一个模块只要有一个依赖(在Kconfig中Depends域中指定)被编译成模块,它也只能被编译成模块。
11.make menuconfig时还可以按‘H’键获取帮助,选中一个配置项后按‘H’。其Depends中[=n]表示目前没有选中的状态。
12.有些USB网卡还需要下载固件才行,log中会有提示,可以在上面网址中根据VID PID来找固件。固件一般放到/lib/firmware目录下,以此目录为基目录。
13.自己很可能不是第一个遇到问题的人,可以在谷歌上搜索。

2-1.1_15_使用WIFI网卡2_概念及工具iw(STA模式)
==========================================
1.认证和加密
认证:允许只有被许可的用户才能连接到无线网络。
加密:提供数据的保密性和完整性,使数据在传输的过程中不被篡改。
认证加密三个版本:
①初级版本:
open/open:认证是open的,加密也是open的,即不需要密码,不需要加密,特别不安全。[最初]
open/WEP: 认证是open的,数据传输中使用WEP算法加密。[然后]
WEP/WEP: 认证的时候也要求用户输入密码,数据传输中也使用WEP算法加密。[然后]
初级版本的加密很容易被破解,不安全。

②过渡版本:使用WPA的方式,加密/认证为:
802.1x/TKIP,WEP: 认证是802.1x,加密使用的是TKIP,为了向下兼容,也支持WEP。[最初]
PSK/TKIP,WEP: 后来发展成这个。[然后]
过渡版本的加密性能比初级版本强了几百万倍,很安全。但是还是有一些不安全,算法还是有些简单。

③总结版本:使用WPA2的方式
802.1x/CCMP(AES-CCMP),TKIP,WEP: 为了向下兼容,也支持TKIP,WEP。[最初]
PSK/CCMP(AES-CCMP),TKIP,WEP: 为了向下兼容,也支持TKIP,WEP。[然后]
这种加密方式被破解的难度很大,非常安全。

802.1x的认证过程:
手机连接AP,认证过程不是在AP上完成的,而是由AP发送到服务器,在服务器上完成的。大型公司一般使用服务器进行认证。
示意图:
手机------------------------> AP ---------------------> 服务器
(supplicant) (authentictor) (authentictor server)

但是服务器认证的成本较高,对于个人或小公司,替代的认证方法就是PSK。

PSK示意图:
手机(输入密码)----------------> AP(AP上事先设置密码)
(supplicant) (authentictor)

wpa_supplicant(supplicant 请求者)支持上面两种认证模式

总结起来4种加密方式:
a.open
b.WEP
c.WPA(TKIP)
d.WPA2(AES)
目前家庭网络中4种加密方式中都有使用,应该用户也可以选择使用哪一种。


编译使用iw,wpa_supplicant,dhcp:
1.iw:https://wireless.wiki.kernel.org/en/users/Documentation/iw

旧的为iwconfig, iw是iwconfig的替代者,只可用于open和WEP的加密认证方式,注意只支持这两种模式。
iw测试网卡:
iw list //列出WIFI网卡性能
iw scan //扫描WIFI AP   # iw mlan0 scan 需要指定dev
iw wlan0 connect foo //链接没有密码的foo,认证是open。
iw wlan0 connect foo keys 0:abcde d:1:0011223344 //带密码的,0:表示第0个密码,1:表示第一个密码,对于WEP的加密方式可以有5个字符的密码,也可以有13个字符的密码。d:表示default

连接过程中出现问题,可以ifconfig wlan0 down/up 重新启动一下网卡
若是想要ping AP,自己必须要有IP。
若想使用更安全的WPA或WPA2的话就不能再使用iw了,应该是用wpa_supplicant了。

2.wpa_supplicant支持上面的4种加密认证方式。这里还编译iw的原因是iw里面有写工具比较好用,比如扫描周围的热点。
wpa_supplicant可以用于上述的4中加密方式。
网址:https://wireless.wiki.kernel.org/en/users/Documentation 点选wpa_supplicant,里面链接了很好的资源。

wpa_cli -iwlan0 status 查看网卡wlan0的连接状态,可以显示MAC,连接的AP,当前网卡的模式等。wpa_state=COMPLETED表示已经连接上去了。

① 以open加密方式连接
wpa_supplicant -B -c/etc/plaintext.conf -iwalan0 //连接热点
wpa_cli -iwlan0 status //查看网卡wlan0的连接状态,是否连接上。
ifconfig wlan0 192.168.1.55
ping 192.168.1.1
修改plaintext.conf:
network = {
  ssid="AP热点名"
  key_mgmt=NONE //NONE表示使用open或WPE方式连接。(前提:AP也选择了open方式)
}


② 以WEP加密方式连接
修改wep.conf:
network = {
  ssid="AP热点名"
  key_mgmt=NONE //NONE表示使用open或WPE方式连接。(前提:AP也选择了open方式)
  wep_key0="abcde" //WEP保护的AP的密码有2种,一种是5个字符的,一种是13个字符的。
  wep_key1="0123456789abc"
  wep_tx_keyidx=0 //表示使用2个密码中的哪个密码
}
wpa_supplicant -B -c/etc/wep.conf -iwalan0 //连接热点
wpa_cli -iwlan0 status //wpa_cli可以关联起wpa_supplicant,然后执行一些命令查看网卡状态

③ 使用WPA方式连接
修改wpa-psk-tkip.conf:
network = {
  ssid="AP热点名"
  key_mgmt=WPA-PSK //WPA或WPA2都写成WPA-PSK,若设置成WPA-EAP表示引入认证服务器,若不设置,默认是WPA-PSK WPA-EAP
  proto=WPA //WPA2这里赋值是RSN,若不设置,默认是WPA RSN
  pairwise=TKIP //取值TKIP是WPA用的,CCMP是WPA2用的,若不设置,默认为:TKIP CCMP,表示两个都可以。
  group=TKIP //4种取值:TKIP,CCMP,WEP104,WEP40, 若不设置,默认是:TKIP CCMP WEP104 WEP40
  psk="0123456789abc" //密码
}
简化版:
network = {
  ssid="AP热点名"
  psk="0123456789abc" //密码
}
它也可以使用于WPA2
wpa_supplicant -B -c/etc/wpa-psk-tkip.conf -iwalan0 //连接热点
wpa_cli -iwlan0 status //查看连接状态

有个文档介绍了配置文件该怎么配置的。
在不同的安全模式之间进行切换时要先killall wpa_supplicant,然后ifconfig down掉网卡,修改后再up起来。


配置文件*.conf介绍
network = {
  ssid="AP热点名"
  key_mgmt=WPA-PSK
  proto=WPA
  pairwise=TKIP
  group=TKIP
  psk="0123456789abc"
}
key_mgmt:可以接受的认证管理协议列表(也就是认证方式列表),可取值:WPA-PSK,WPA-EAP。WPA-PSK是将密码保存在无线AP那里,WPA-EAP需要用到认证服务器。默认值是:WPA-PSK WPA-EAP
proto:可接受的协议列表,可取值WPA,RSN(代表WPA2), 模式是WPA RSN
pairwise:WPA可接受的配对(单播)密码列表,也即加密方法,可取值CCMP(WPA2) TKIP(WPA) NONE(open或WEP),默认值为:CCMP TKIP NONE
group:暂不清楚表示什么

2.ctrl_interface=/var/run/wpa_supplicant //一个目录用于wpa_cli与wpa_supplicant之间进行socket通讯,
如果不指定ctrl_interface这一项,wpa_cli就无法连接到应用服务程序wpa_supplicant。

3.wpa_cli有两种工作模式,第一中种就是上面的命令行模式,第二种是交互模式,如同打断uboot类似。
命令行模式:wpa_cli -iwlan0 scan/scan_results
交互模式: wpa_cli然后输入命令,最后输入quiet退出。

4.配置文件中设置多个network
指定多个network,eg:
network = {
  ssid="AP_name1"
  psk="0123456789abc" //密码
}
network = {
  ssid="AP_name2"
  psk="mmm0123456789" //密码
}

实验:先连接AP_name1,然后关闭热点AP_name1,会自动连接到AP_name2.类似手机的工作原理,如果设置了
多个AP和密码,第一个连接不上的话会去连接第二个。

5.访问外网
$ ping baidu
ping: unknown host baidu
①修改/etc/resolv.conf,添加DNS
在它里面指定路由IP作为路由DNS,有了这个文件再去ping外网网址,就可以知道其IP了。但是此时还不能用,还需要设置网关。
$ cat /etc/resolv.conf
nameserver 192.168.1.1
②设置网关
$ route add default gw 192.168.1.1
此时就可以ping通外网了。

6.此时还是手工获取IP,可以使用dhcp动态获取IP地址。

7.dhcp 使得WIFI网卡动态获取IP
$ dhclient -v
For info, please visit https://www.isc.org/software/dhcp/ 下载dhcp软件包
dhclient mlan0: 自动配置网卡IP

8.自动执行wpa_supplicant和获取IP
①一插入网卡后就自动执行wpa_supplicant
cat /etc/mdev.conf
wlan0 0:0 777 * /sbin/auto_wifi.sh 使用mdev的热插拔配置[2期28课],mev与udev的区别:https://www.cnblogs.com/ganrui/p/3804467.html

cat /sbin/auto_wifi.sh
  #!/bin/sh
    if [$ACTION = "add"] then
    wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwalan0
    wpa_cli -a/sbin/wpa_action.sh -B
  else
    killall wpa_supplicant
    killall wpa_cli
    killall dhclient
  fi

②一连上WIFI AP就自动执行dhclient获取IP
README中有介绍在connect/disconnect时使用wpa_cli来执行外部程序。把需要执行的命令写在:/sbin/wpa_action.sh脚本中。[Ubuntu中有可以参考]
执行原理:wpa_supplicant发现连接上AP之后就会向wpa_cli发送一个事件,wpa_cli就会执行:wpa_cli -a/sbin/wpa_action.sh -B //-B后台执行,-a表示action
例子:
$ cat /sbin/wpa_action.sh
  #!/bin/sh
  IFNAME=$1
  CMD=$2
  if ["$CMD" = "CONNECTED"]; then
    echo "connect $IFNAME, dhclient for it" > /dev/console
    dhclient $IFNAME
  fi
  if ["$CMD" = "DISCONNECTED"]; then
    echo "disconnect $IFNAME, kill dhclient for it" > /dev/console
    killall dhclient
  fi
---------------------------
测试:
$ wpa_cli -iwlan0 disconnect
$ wpa_cli -iwlan0 reconnect

这个应该是执行wpa_cli后在后台睡眠,等到监听到connect/disconnect后才会执行那个脚本。

下载这些软件:http://wireless.kernel.org/en/users/Documentation/iw 里面有iw使用介绍。

遇到错误要在google上搜索,而不是百度!!!

加入编译一个开源软件,没有使用Yocto的情况下,生成下面文件:
etc include bin lib sbin share
需要把这些裤复制到交叉编译工具链里面去,和复制到开发板上面去。

9.获取AP的IP地址:mlan0连接到热点huawei-honor9后获取热点网卡的IP地址

# cat /proc/net/arp
IP address    HW type  Flags    HW address Mask    Device
192.168.43.1 0x1          0x2     10:b1:f8:c9:25:12    * mlan0

# wpa_cli scan/scan_results:
10:b1:f8:c9:25:12   2462   -38    [WPA2-PSK-CCMP][ESS]   huawei-honor9

r# ifconfig
mlan0 Link encap:Ethernet HWaddr 8C:45:00:04:F8:99
     inet addr:192.168.43.141

==========================开发板工作于AP模式===========================

1.移植hostapd搭建无线热点好文:http://blog.csdn.net/daydring/article/details/16337047
2.官网有介绍:https://wireless.wiki.kernel.org/en/users/documentation/hostapd
3.hostapd软件包编译会生成两个可执行文件:hostapd, hostapd_cli
4.hostapd的配置文件
a.现在源文件中检索有没有可以参考的例子:find ./ -name *.conf ==> hostapd.conf wired.conf
  ctrl_interface=/var/run/hostapd //用于hostapd_cli与hostapd之间通信的socket文件
  #change wlan0 to your wireless device
  interface=wlan0 //哪一个网卡
  driver=nl80211 //网卡驱动
  ssid=test //AP的热点名
  channel=1 //这个是?抓包的时候会使用到

b.认证加密方式
  # WPA and WPA2 enabled access point is:
  macaddr_acl=0 //控制MAC地址的过滤,hostapd.conf中有详细的介绍,取值:0 1 2 3
  auth_algs=1 //使用的加密方式,位掩码,bit0:open的,bit1:WEP的,使用WPA或WPA2这里必须是1,经验之谈。
  ignore_broadcast_ssid=0 //
  wpa=3 //为掩码,bit0:支持WPA,bit1:支持WPA2,这里是3,表示WPA,WPA2都支持。
  wpa_passphrase=YourPassPhrase //指定的AP的密码
  wpa_key_mgmt=WPA-PSK //使用WPA-PSK方式,不经过服务器的
  wpa_pairwise=TKIP //WPA的加密方式
  rsn_pairwise=CCMP //WPA2的加密方式
一个配置文件中必须要有这两部分。

cat /etc/my_hostapd.conf 
    ctrl_interface=/var/run/hostapd 
    #change wlan0 to your wireless device 
    interface=wlan0 
    driver=nl80211 
    ssid=test 
    channel=1 
 
    macaddr_acl=0 
    auth_algs=1 
    ignore_broadcast_ssid=0 
    wpa=3 
    wpa_passphrase=YourPassPhrase 
    wpa_key_mgmt=WPA-PSK 
    wpa_pairwise=TKIP 
    rsn_pairwise=CCMP 
------------------------

5.运行hostapd:hostapd -B /etc/my_hostapd.conf 然后就可以使用手机连接热点测试了。
此时手机可以扫描到这个热点,但是一直在“获取IP地址”或连接到其它网络上。这就要求开发板上还需要运行dhcp.

6.启动dhcpd服务
Ubuntu中需要sudo apt-get install isc-dhcp-server,才有此工具
它需要一个配置文件,修改配置文件/etc/dhcpd.conf,添加:
subnet 192.168.1.0 netmask 255.255.255.0 { //子网是从192.168.1.0开始,子网掩码是:255.255.255.0
  range 192.168.1.10 192.168.1.100; //分配的IP地址的范围从10-100
  option domain-name-servers 192.168.1.1; //域名解析服务器地址
  option routers 192.168.1.1; //路由
}

$ dhcpd -h 查看如何启动
$ dhcpd -cf /etc/dhcpd.conf wlan0 运行报文件/var/db/dhcpd.leases找不到

创建空文件/var/db/dhcpd.leases:
> /var/db/dhcpd.leases //>就是生成一个空文件

再次执行$ dhcpd -cf /etc/dhcpd.conf wlan0 报“No subnet declare for wlan0”,但是刚才在/etc/dhcpd.conf中已经定义了。
ifconfig wlan0 192.168.1.2 配置网卡IP,然后在启动就OK了

7.查看有多少个手机连接到此AP
使用hostapd_cli来查看,但是目前还不行,因为配置文件还缺少一个东西。
修改my_hostapd.conf加上:ctrl_interface=/var/run/hostapd hostapd_cli与hostapd之间是通过它通信的
hostapd_cli与wpa_cli一样,也有两种运行模式,命令行模式和交互模式。
交互模式下插卡连接的所有STA:hostapd_cli >all_sta 列出所有连接到此AP的STA的信息,STA的MAC地址等等。
但是这些信息中没有STA的IP,可以通过记住MAC地址,然后在刚才创建的空文件:/var/db/dhcpd.leases中找到STA的IP。
cat /var/db/dhcpd.leases
lease 192.168.1.10 { //STA的IP
  ......
  hardware ethernet xx.xx.xx.xx //这是刚才看到的STA的MAC
}

8.Open方式的AP配置文件

cat /etc/my_open_hostapd.conf 
    ctrl_interface=/var/run/hostapd 
    #change wlan0 to your wireless device 
    interface=wlan0 
    driver=nl80211 
    ssid=test 
    channel=1 
 
    # Authentication encryption mode 
    macaddr_acl=0 
    auth_algs=1 
    ignore_broadcast_ssid=0 
------------------------

此时手机上显示为开放网络,直接点击就可以连接,无需密码。

9.WEP方式的AP配置文件
可以参考源码中自带的配置文件

cat /etc/myhostapd.conf 
    ctrl_interface=/var/run/hostapd 
    #change wlan0 to your wireless device 
    interface=wlan0 
    driver=nl80211 
    ssid=test 
    channel=1 
 
    # Authentication encryption mode 
    macaddr_acl=0 
    auth_algs=2                    //bit1:使用WEP方式 
    wep_key0="0123456789abc"    //密码0,注意双引号 
    wep_default_key=0            //默认使用密码0 
------------------------

此时手机上显示AP“已受WEP保护”,但是此时让用户输入16进制的密码,可以在UltraEdit中转输入的时候中间不带空格。

10.修改/etc/mdev.conf自动启动AP模式

cat /etc/mdev.conf  
wlan0 0:0 777 * /sbin/auto_wifi_ap.sh 
 
cat /sbin/auto_wifi_ap.sh  
#!/bin/sh 
if [ $ACTION = "add" ];  
then 
   hostapd -B /etc/myhostapd.conf    #启动hostapd 
   ifconfig wlan0 192.168.1.1        #配置AP自己的网卡 
   dhcpd -cf /etc/dhcpd.conf wlan0    #启动dhcpd为连接上的STA分配ip 
else 
   killall hostapd 
   killall dhcpd 
fi 
-------------------

由脚本/sbin/auto_wifi_ap.sh可知有个限制,要么内核启动完成后插入网卡,要么网卡驱动编译成模块延迟加载。

11.在/etc/init.d/rcS中insmod驱动。

cat /etc/init.d/rcS 
#!/bin/sh 
#ifconfig eth0 192.168.1.17 
 
mount -a 
mkdir /dev/pts 
mount -t devpts devpts /dev/pts 
 
echo /sbin/mdev > /proc/sys/kernel/hotplug 
mdev -s 
 
insmod /ath9k_hw.ko 
insmod /ath9k_common.ko 
insmod /ath9k_htc.ko

12.不使用Yocto编译内核,编译内核和模块时分开的:make uImage && make modules


本文参考链接:https://www.cnblogs.com/hellokitty2/p/10126166.html