wifi网卡有两种工作模式:
在使用无线网时,我们都知道需要无线网的密码,以及通过无线网进行网上冲浪或者下载app,这里就涉及无线网的安全性,无线网的安全性由两部分组成:认证和加密。
常用的认证方式有以下四种:
常用的加密算法有三种:
公共场所常见的wifi:连接wifi使用浏览器验证,通过用户自己的手机号以及验证码进行验证,AP上传给服务器进行数据的验证,这种是802.11x的验证方式。
对于一个陌生的USB网卡设备我们先将其插入PC机获得VID和PID。在设备管理器中,找到该无线网卡,右键属性,详细信息中选中硬件id就能看到VID和PID。
在Wi-Fi Device IDs in Linux网站中可以看到所有网卡文件在wireless里面,因此在内核中找到相应的文件
使用grep命令寻找
grep "0x3070" drivers/net/wireless/ -nr
得到
或者使用find命令(注意:该方式必须知道文件的全名)
find -name rt2800usb.c
得到
进入rt2x00目录,打开Makefile
找到rt2800usb.c在配置中的参数设置,用这个参数在配置内核时搜索,实行相应的配置
根据配置选项,depend on是以来的配置(只要以来中有一个是配置为模块,该选项就只能配置成模块);selects是该选项为Y时,selects中的选项自动配置为y,为m时自动配置为模块。
注意:可能某些选项由于依赖没有开,可能会找不到,将依赖一个一个全配置了就出现了!
除了以上配置项,还需要安装一个库的配置项
这就是在insmod时出现某些函数找不到的原因
然后重新编译内核make uImage && make modules(如果配置为某块,该步必须做,然后将某块拷贝到网络文件系统)
使用前需要下载该wifi网卡的固件rt2870.bin,找到网页中
firmware点进去,按最新版本下载,解压后找到其中的rt2870.bin,拷贝到文件系统的/lib/firmware/下即可
如果是模块,又不想每次都去加载模块
可以在/etc/init.d/rcS 写如下代码:
insmod /lib/modules/3.4.2/rt2x00lib.ko
insmod /lib/modules/3.4.2/rt2x00usb.ko
insmod /lib/modules/3.4.2/rt2800lib.ko
insmod /lib/modules/3.4.2/rt2x00usb.ko
ifconfig wlan0 up
ifconfig wlan0 192.168.1.110
此时使用ifconfig就会看到无线网卡已经启动成功
iw:可用于OPEN、WEP这两种”认证/加密”,以及扫描WIFI热点等;
wpa_supplicant:可用于前面4种”认证/加密”;
hostapd:能够使得无线网卡切换为AP模式;
dhcp:STA模式使WIFI网卡动态获取IP,AP模式分配IP;
在使用前先编译libnl库
tar xzf libnl-3.2.23.tar.gz
cd libnl-3.2.23/
./configure --host=arm-linux --prefix=$PWD/tmp
修改 lib/addr.c 添加宏(宏来自内核源码)
make(第一次make会找不打某些宏,修改 lib/addr.c后就能编译了,直接去内核中搜索相关宏,然后贴进去就好)
make install
把编译出来的头文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
cd tmp/include/libnl3
sudo cp netlink -rf /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
把编译出来的库文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
把编译出来的库文件应该放入NFS文件系统的lib目录:
/work/nfs_root/fs_mini_mdev_new/lib
tar xjf iw-3.11.tar.bz2
cd iw-3.11/
修改Makefile:
CC = "arm-linux-gcc"
NL3xFOUND := Y
#LIBS += $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))
#CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME))
在info.c的代码前面添加
#define htole16(X) (((((uint16_t)(X)) << 8) | ((uint16_t)(X) >> 8)) & 0xffff)
iw list // 列出WIFI网卡的性能
iw dev wlan0 scan // 扫描WIFI AP
iw dev wlan0 scan | grep SSID:RedMi
iw wlan0 connect RedMi // 连接到WIFI AP:RedMi (open)
手机热点名字:RedMi
iw dev wlan0 link//查看状态
iw wlan0 disconnect//断开连接
这里OPEN模式。
注意:手机热点的网段是192.168.43.1,所以wlan0的ip也需要设置在该网段下;路由器网段是192.168.1.1
注意:如果需要ping外网,需要设置域名服务器(DNS)和网关
修改/etc/resolv.conf,添加DNS:nameserver 192.168.1.1,如果是手机热点为nameserver 192.168.43.1;
设置网关,输入命令:route add default gw 192.168.1.1,如果是手机热点为route add default gw 192.168.43.1;
tar xzf openssl-1.0.1d.tar.gz
cd openssl-1.0.1d/
./config shared no-asm --prefix=$PWD/tmp
修改Makefile:
CC= arm-linux-gcc
AR= arm-linux-ar $(ARFLAGS) r
RANLIB= arm-linux-ranlib
NM= arm-linux-nm
MAKEDEPPROG= arm-linux-gcc
make
make install
安装:
把编译出来的头文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
把编译出来的库文件应该放入:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
把编译出来的库文件应该放入NFS文件系统的lib目录:
/work/nfs_root/fs_mini_mdev_new/lib
tar xzf wpa_supplicant-2.0.tar.gz
cd wpa_supplicant-2.0/wpa_supplicant/
cp defconfig .config
修改.config加上一行: CONFIG_LIBNL32=y
修改Makefile:
CC=arm-linux-gcc
make
make DESTDIR=$PWD/tmp install
使用
mkdir -p /var/run/wpa_supplicant ----一个目录,用于wpa_supplicant和wpa_cli的socket通信
1.open模式
plaintext.conf配置文件(/etc/plaintext.conf)内容:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="RedMi" //wifi名字
key_mgmt=NONE //密码
}
连接:wpa_supplicant -B -c/etc/plaintext.conf -iwlan0
查看状态:wpa_cli -iwlan0 status
设置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1
2.WEP/WEP
wep.conf配置文件内容:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="RedMi"
key_mgmt=NONE
wep_key0="baiwenwang123"---密码必须13位
wep_tx_keyidx=0
}
连接:wpa_supplicant -B -c/etc/wep.conf -iwlan0
查看状态:wpa_cli -iwlan0 status
设置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1
3.WPA(TKIP)
wpa-psk-tkip.conf配置文件内容:
ctrl_interface=/var/run/wpa_supplicant # 一个目录,用于wpa_supplicant和wpa_cli的socket通信
network={
ssid="dswei"
proto=WPA # proto: list of accepted protocols, 可取WPA,RSN
# If not set, this defaults to: WPA RSN
key_mgmt=WPA-PSK # 认证方式
# If not set, this defaults to: WPA-PSK WPA-EAP
pairwise=TKIP # If not set, this defaults to: CCMP TKIP
group=TKIP # If not set, this defaults to: CCMP TKIP WEP104 WEP40
psk="baiwenwang12"
}
连接:wpa_supplicant -B -c/etc/wpa-psk-tkip.conf -iwlan0
查看状态:wpa_cli -iwlan0 status
设置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1
4.WPA2(AES)—目前大部分wifi使用的模式、密码8位及以上
wpa_wpa2.conf配置文件内容:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
psk="baiwenwang123"
}
连接:wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
查看状态:wpa_cli -iwlan0 status
设置ip:ifconfig wlan0 192.168.43.55
ping :ping 192.168.43.1
注:以上所有配置文件均可设置多个连接,类似你的手机可以记住办公室的wifi信息,同样可以记住家里wifi信息
格式如下:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="dswei"
psk="baiwenwang123"
}
network={
ssid="Programer"
psk="baiwenwang"
}
在连接上手机或者路由器后,如果需要使用外网,还需要设置网关以及域名服务器(DNS)
修改/etc/resolv.conf添加DNS:
nameserver 192.168.1.1
开发板命令行输入:route add default gw 192.168.1.1
设置网关
在连接wifi后需要自己设置网关参数,这样不是特别方便,因此引入DHCP,自动分配ip地址,连接好wifi后
dhclient wlan0
即可实现网关参数的自动分配设置
在开发板执行完init进程后,开始执行第一个用户的子进程,根据inittab中的顺序进行执行
如上图,首先执行rcS这个脚本(挂接其他文件系统、配置网络等),这里面可以自己添加想要自动执行的命令,例如装载驱动以及运行其他脚本文件之类的;在启动shell(命令行)以/dev/console作为控制台;组合键ctrl+alt+del是重启;shutdown是关机
闲话:分析一下这个rcS
mount -a:根据/etc/fstab中的内容进行文件系统的挂接
echo /sbin/mdev > /proc/sys/kernel/hotplug -----启动热拔插事件,所有热拔插都会调用 /sbin/mdev
mdev -s自动创建系统所需要的设备节点
在插入wifi模块的时候就能自动启动,实现自动连接无线AP。
wlan0 0:0 777 * /sbin/auto_wifi.sh
mdev.conf的格式:
: [<@|$|*> ]
device regex:正则表达式,表示哪一个设备
uid: owner
gid: 组ID
octal permissions:以八进制表示的属性
@:创建设备节点之后执行命令
$:删除设备节点之前执行命令
*: 创建设备节点之后 和 删除设备节点之前 执行命令
command:要执行的命令
#!/bin/sh
if [ $ACTION = "add" ];
then
wpa_supplicant -B -c/etc/wpa_wpa2.conf -iwlan0
wpa_cli -a/sbin/wpa_action.sh -B
else
killall wpa_supplicant
killall wpa_cli
killall dhclient
fi
并赋予执行权限
chmod +x /sbin/auto_wifi.sh
注意:/etc/wpa_wpa2.conf文件名字一定要写正确
#!/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
并赋予执行权限
chmod +x /sbin/wpa_action.sh
AP功能就是讲无线网卡设置为可以供其他客户端连接的模式
tar xzf hostapd-2.0.tar.gz
cd hostapd-2.0/
cd hostapd/
cp defconfig .config
修改.config, 加一行: CONFIG_LIBNL32=y
修改Makefile:
CC=arm-linux-gcc
make
make DESTDIR=$PWD/tmp install
把生成的hostapd hostapd_cli复制到NFS的bin目录
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1
# 认证/加密方式
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
2.WEP模式
ctrl_interface=/var/run/hostapd
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=S3C2440
channel=1
macaddr_acl=0
auth_algs=2
ignore_broadcast_ssid=0
wep_key0="baiwenwang123"
wep_default_key=0
3.WAP/WAP2模式
ctrl_interface=/var/run/hostapd
ssid=S3C2440
#hw_mode=g
channel=1
interface=wlan0
#bridge=br0
driver=nl80211
macaddr_acl=0
# 认证/加密方式
auth_algs=1
wpa=3
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
注释:
ctrl_interface:为了后面hostapd_cli链接上hostapd;
ssid:无线热点名字;
hw_mode:指定802.11协议,其中a=IEEE 802.11a,b=IEEE 802.11b, g=IEEE 802.11g;
channel:设定无线信道;
interface:指定使用哪一个无线网卡;
bridge:指定所处网桥,对于一个同时接入公网、提供内部网和无线接入的路由器来说,设定网桥很有必要;
driver:指定无线驱动;
macaddr_acl:指定MAC地址过滤规则:
0表示允许除禁止列表外的设备;
1表示只允许在允许列表的设备;
2表示使用外部RADIUS服务器;
accept_mac_file:指定允许MAC列表文件所在路径;
deny_mac_file:指定禁止MAC列表文件所在路径;
auth_algs:指定采用哪种认证算法,采用位域(bit fields)方式来制定;
1表示使用WPA;
2表示使用WEP;
3表示使用WPA/WEP;
wpa:指定WPA类型,采用位域(bit fields)方式来制定;
1表示使用WPA;
2表示使用WPA2;
3表示使用WPA2/WPA;
wpa_passphrase:WIFI的密钥;
wpa_key_mgmt:PSK为个人AP,不使用服务器认证;
wpa_pairwise:指定WPA的加密方式;
rsn_pairwise:指定WPA2的加密方式;
创建/etc/dhcpcd.conf配置文件(之前的配置文件可以重命名)
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.10 192.168.2.100;
option domain-name-servers 192.168.2.1;
option routers 192.168.2.1;
}
指定了子网IP起始地址、子网掩码、动态分配的IP范围、DNS服务器、路由。
#1.启动无线网卡,并设置IP
ifconfig wlan0 up
ifconfig wlan0 192.168.1.1
#启动AP和DHCP
hostapd -B /etc/hostapd.conf
dhcpd -cf /etc/dhcpcd.conf wlan0
#停止命令
killall hostapd
killall dhcpd
#查看状态
hostapd_cli all_sta
#查看热点配置
hostapd_cli get_config
#查看已经连接的设备
iw dev wlan0 station dump
wlan0 0:0 777 * /sbin/auto_wifi_ap.sh
2.创建/sbin/auto_wifi_ap.sh
cat /sbin/auto_wifi_ap.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
hostapd -B /etc/myhostapd.conf
ifconfig wlan0 192.168.1.1
dhcpd -cf /etc/dhcpd.conf wlan0
else
killall hostapd
killall dhcpd
fi
赋予权限
chmod +x /sbin/auto_wifi_ap.sh
至此无线网卡使用过程完毕,需要注意的是脚本的格式以及热拔插的流程