Linux中USB无线网卡实现AP模式(hostapd交叉编译环境下).

2019-07-13 07:01发布

用手机APP来实现无线监控已经成功了,接下来准备讲解andriod相关的知识和客户端APP源程序
以手机上WIFI热点为例,有4种常用的"认证/加密"
a. open
b. WEP
c. WPA(TKIP)
d. WPA2(AES)

需要用到的源代码有: hostapd-2.0.tar.gz,下载地址:点击这里!
openssl-1.0.1d.tar.gz,下载地址:点击这里!
dhcp-4.2.5-P1.tar.gz,下载地址:点击这里!

首先交叉编译dhcp-4.2.5-P1.tar.gz tar xzf dhcp-4.2.5-P1.tar.gz
cd dhcp-4.2.5-P1
/configure --host=arm-linux ac_cv_file__dev_random=yes

cd bind
修改Makefile:
./configure BUILD_CC=gcc ac_cv_file__dev_random=yes --host=arm-linux --disable-kqueue   /* 添加到./configure这行 */

tar xzf bind.tar.gz
cd bind-9.8.4-P2
修改 lib/export/dns/Makefile.in 
gen: ${srcdir}/gen.c
        ${CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}
改为
gen: ${srcdir}/gen.c
        ${BUILD_CC} ${ALL_CFLAGS} ${LDFLAGS} -o $@ ${srcdir}/gen.c ${LIBS}

cd ../..
make DESTDIR=$PWD/tmp install
把生成tmp/usr/local/sbin目录下的dhcpd命令复制到根文件系统的bin目录,把tmp/usr/local/etc目录下的dhcpd.conf.example复制到根文件系统/etc目录下面,以后用得到(自动获取IP地址)
交叉编译openssl-1.0.1d.tar.gz
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
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

把编译出来的库文件应该放入根文件系统文件系统的lib目录:*so*


交叉编译hostapd-2.0.tar.gz
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复制到根文件系统的bin目录

启动开发板:vi /etc/hostapd.conf   内容如下: ctrl_interface=/var/run/hostapd           
#change wlan0 to your wireless device
interface=wlan0
driver=nl80211
ssid=Linux                /* 名字 */
channel=1

# 认证/加密方式
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_passphrase=linuxdrv     /* 密码*/
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

hostapd: hostapd -B /etc/hostapd.conf        /* 启动AP模式,手机连接时候一直停在获取IP,需要配置dhcp */

修改配置文件/etc/dhcpd.conf,添加:
subnet 172.16.1.0 netmask 255.255.255.0 {                       
  range 172.16.1.10 172.16.1.100;                                                      
  option routers 172.16.1.1;                       /* 开发板IP地址 */                               
}    


创建空文件/var/db/dhcpd.leases:
mkdit    /var/db/
touch dhcpd.leases
dhcpd -cf /etc/dhcpd.conf wlan0              /* 启动自动获取IP */

在/etc/init.d/rcS目录下添加下面几条命令:/* 下面的命令折腾了很久才配置出来的 */ ifconfig wlan0 up                         ifconfig wlan0 172.16.1.1  netmask 255.255.255.0
route add default gw 172.16.1.1                /* 这两条路由命令需要添加 */
route add default gw 172.16.148.111
echo 1 > /proc/sys/net/ipv4/ip_forward         /* 打开IP转发 */
dhcpd -cf /etc/dhcpd.conf wlan0  &              
hostapd -B /etc/hostapd.conf


下面是转载的: 1、从官网上下载hostapd,编译之前先在hostapd目录下执行cp defconfig .config,配置文件默认只支持nl80211的驱动(CONFIG_DRIVER_NL80211=y)。 make make install 3、新建/etc/hostapd/hostapd.conf  interface=wlan0
#interface=wlan0
driver=nl80211
#driver=madwifi
ssid=YOUR_SSID
channel=9
hw_mode=g
macaddr_acl=0
ignore_broadcast_ssid=0
auth_algs=1
wpa=3
wpa_passphrase=YOUR_PASSPHRASE
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
最后执行:hostapd -d /etc/hostapd/hostapd.conf 
hostapd.conf文件(也可以从这里获得),这个文件很大,里面的配置项相当的多,从简单到高级。但一般地我们能够使用到的功能只是其中很少的一部分,下面介绍一下我认为最常用的一些配置选项。首先介绍一些基本的配置项: 复制代码 ssid=test hw_mode=g channel=10 interface=wlan0 bridge=br0 driver=nl80211 ignore_broadcast_ssid=0 macaddr_acl=0 accept_mac_file=/etc/hostapd.accept deny_mac_file=/etc/hostapd.deny 复制代码 上面列出的配置基本上是必须的,其中:
  • ssid:别人所看到的我们这个无线接入点的名称;
  • hw_mode:指定802.11协议,包括 a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g;
  • channel:设定无线频道;
  • interface:接入点设备名称,注意不要包含ap后缀,即如果该设备称为wlan0ap,填写wlan0即可;
  • bridge:指定所处网桥,对于一个同时接入公网、提供内部网和无线接入的路由器来说,设定网桥很有必要;
  • driver:设定无线驱动,我这里是nl80211;
  • macaddr_acl:可选,指定MAC地址过滤规则,0表示除非在禁止列表否则允许,1表示除非在允许列表否则禁止,2表示使用外部RADIUS服务器;
  • accept_mac_file:指定允许MAC列表文件所在;
  • deny_mac_file:指定禁止MAC列表文件所在;
下面介绍关于认证方式的配置: auth_algs=1 其中auth_algs指定采用哪种认证算法,采用位域(bit fields)方式来制定,其中第一位表示开放系统认证(Open System Authentication, OSA),第二位表示共享密钥认证(Shared Key Authentication, SKA)。我这里设置alth_algs的值为1,表示只采用OSA;如果为3则两种认证方式都支持。不过很奇怪的是,在我工作中如果配置了3,不管采用WEP/WPA/WP2加密的方式都从没连接成功过,配置为2也是如此。所以在我的配置当中,如果采用认证,则设置auth_algs为1;否则把这行代码注释掉(在前面加#)。 由于RADIUS认证需要提供外部RADIUS服务器,我们没有这个功能,因此我只研究了WEP、WPA和WPA2这三种加密方式。 复制代码 #wep_default_key=0 #wep_key0=1234567890 #wep_key1="vwxyz" #wep_key2=0102030405060708090a0b0c0d #wep_key3=".2.4.6.8.0.23" #wep_key_len_broadcast=13 #wep_key_len_unicast=13 #wep_rekey_period=300 复制代码 如果要启用WEP加密,只需配置wep_default_key和其中一个wep_keyx,其中x的值只能在0~3之间,wep_default_key的值必须启用了。注意wep_keyx的值不是任意的,只能是5、13或16个字符(用双引号括住),或者是10、26或32个16进制数字。由于WEP加密算法已经被破解了,所以通常不启用它,全部注释掉。 wpa=2 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK #wpa_pairwise=TKIP CCMP rsn_pairwise=TKIP CCMP 现在推荐的加密方式是WPA/WPA2,由于时间紧迫,我没有怎么去了解过这两者的差别。不过配置是很简单的:
  • wpa:指定WPA类型,这是一个位域值(bit fields),第一位表示启用WPA,第二位表示启用WPA2。在我的配置中,无论设置成1、2或3,都可以正常连接;
  • wpa_passphrase:WPA/WPA2加密需要指定密钥,这个选项就是配置WPA/WPA2的密钥。注意wpa_passphrase要求8~63个字符。另外还可以通过配置wpa_psk来制定密钥,不过要设置一个256位的16进制密钥,不适合我们的需求;
  • wpa_pairwise/rsn_pairwise:如果启用了WPA,需要指定wpa_pairwise;如果启用了WPA2,需要指定rsn_pairwise,或者采用wpa_pairwise的设定。都可以设定成TKIP、CCMP或者两者都有,具体含义我也没仔细弄清楚。一篇比较老的文章说TKIP不兼容Windows Mobile,但我的Windows Mobile 6.5在这两种算法下都没有遇到任何问题。
经过这样一些配置,启动hostapd之后应该就可以按照自己的需求正常使用无线接入点功能了: /usr/bin/hostapd -f /etc/hostapd.conf
4、安装dhcpd apt-get install dhcp3-server echo "1" > /proc/sys/net/ipv4/ip_forward hostapd -B /etc/hostapd/hostapd.conf /etc/dhcp/dhcpd.conf: subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.2 192.168.0.10; option routers 192.168.0.1; } wlan0配置地址: ifconfig wlan0 192.168.0.1 netmask 255.255.255.0 开启dhcp: dhcpd wlan0 -pf /var/run/dhcp-server/dhcpd.pid 现在无线网卡就可以当成ap了。
5、把无线网卡的ap继续扩展为连接到外网 网上有很多资料,一般有2种方法:一种是bridge(桥接),另一种是nat方式,这里只介绍nat的方式。 经过前面4个步骤,无线网卡已经可以自动分配IP,现在只需要把无线网卡的数据都经过eth0(有线网络)发到外网去,这就需要IP转发了。 # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
还需要修改/etc/dhcp/dhcpd.conf,添加dns: subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.2 192.168.0.10;  option domain-name-servers 221.5.88.88; option routers 192.168.0.1; } (Linux系统缺省并没有打开IP转发功能,要确认IP转发功能的状态,可以查看/proc文件系统,使用下面命令: cat /proc/sys/net/ipv4/ip_forward
如果上述文件中的值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
要想打开IP转发功能,可以直接修改上述文件: echo 1 > /proc/sys/net/ipv4/ip_forward
把文件的内容由0修改为1。禁用IP转发则把1改为0。
上面的命令并没有保存对IP转发配置的更改,下次系统启动时仍会使用原来的值,要想永久修改IP转发,需要修改/etc/sysctl.conf文件,修 改下面一行的值: net.ipv4.ip_forward = 1 修改后可以重启系统来使修改生效,也可以执行下面的命令来使修改生效: sysctl -p /etc/sysctl.conf 进行了上面的配置后,IP转发功能就永久使能了。)

6、嵌入式开发板上设置内核支持iptabel的设置如下: 内核需要对iptables的支持并加上nat功能 Networking support --->               Networking options --->                    Network packet filtering framework (Netfilter) │ │    --- Network packet filtering framework (Netfilter)               │ │    │ │    [*]   Network packet filtering debugging                         │ │    │ │    [*]   Advanced netfilter configuration                           │ │    │ │          Core Netfilter Configuration  --->                         │ │    │ │    < >   IP virtual server support  --->                            │ │    │ │          IP: Netfilter Configuration  --->   Core Netfilter Configuration里面的配置如下: <*> Netfilter connection tracking support -*- Netfilter Xtables support (required for ip_tables) IP: Netfilter Configuration里面的配置如下: [*]   proc/sysctl compatibility with old connection tracking <*> IP tables support (required for filtering/masq/NAT)    <*>   Packet filtering               <*>     REJECT target support          < >   LOG target support      < >   ULOG target support        <*>   Full NAT         <*>     MASQUERADE target support    <*>     NETMAP target support       <*>     REDIRECT target support   <*>     Basic SNMP-ALG support