上一篇博文记录了fl2440添加了RT3070作为STA模式,并成功连接路由器上网。
这篇则记录第二种模式:SoftAP模式。以开发板fl2440作为一个路由器,并使自己的手机、笔记本电脑连接到这个“路由器”上网。
在这里我们会用到几个软件hostapd、udhcpd、iptables。基于内核的mac80211驱动框架来实现。
一、内核配置
make之后烧录到开发板。
把开发板用网线连接一个路由器的LAN口,接下来登陆开发板的话使用ssh来登陆。
二、软件工具移植
1、Hostapd移植
Hostapd依赖于openssl与libnl两个库。而openssl在上次已移植。
我们移植libnl库 。
官方说明:
The libnl suite is a collection of libraries providing APIs to netlink protocol based Linux kernel interfaces.
Netlink is a IPC mechanism primarly between the kernel and user space processes. It was designed to be a more flexible successor to ioctl to provide mainly networking related kernel configuration and monitoring interfaces.
libnl是提供基于Linux内核的netlink协议的API的库的套件。
Netlink是内核与用户空间进程之间主要的IPC机制。它相比ioctl设计得更加灵活,并提供了关于内核配置和监视接口的主要的通信方式。
1.1移植libnl
hostapd使用的libnl库为1.x版本,2.0版本的API与1.0的并不兼容,这里移植1.1版本。
下载:wget http://www.infradead.org/~tgr/libnl/files/libnl-1.1.tar.gz
解压:tar zvxf libnl-1.1.tar.gz
进入libnl-1.1:
[tangbin@localhost libnl-1.1]$ mkdir install
[tangbin@localhost libnl-1.1]$ ./configure --prefix=`pwd`/install --host=arm-linux
[tangbin@localhost libnl-1.1]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[tangbin@localhost libnl-1.1]$ sudo make install
安装完毕后,进入本目录下的install下,将libnl.so.1拷贝到开发板/lib目录下。
1.2移植Hostapd
hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动。
下载地址:wget http://w1.fi/releases/hostapd-1.0.tar.gz
下载并解压后,进入hostapd-1.0:
[tangbin@localhost wifi]$ cd hostapd-1.0
[tangbin@localhost hostapd-1.0]$ cd hostapd/
[tangbin@localhost hostapd]$ cp defconfig .config
[tangbin@localhost hostapd]$ vim .config
修改如下:
修改Makefile:
[tangbin@localhost hostapd]$ vim Makefile
8
9 CFLAGS += -I../src
10 CFLAGS += -I../src/utils
11
12 CFLAGS += -I /home/tangbin/fl2440/wifi/libnl-1.1/install/include
13 CFLAGS += -I /home/tangbin/fl2440/wifi/openssl-1.0.0s_tb/install/include
14 LIBS += -L /home/tangbin/fl2440/wifi/libnl-1.1/install/lib
15 LIBS += -L /home/tangbin/fl2440/wifi/openssl-1.0.0s_tb/install/lib
16 LDFLAGS += -L /home/tangbin/fl2440/wifi/libnl-1.1/install/lib
17 LDFLAGS += -L /home/tangbin/fl2440/wifi/openssl-1.0.0s_tb/install/lib
18 # Uncomment following line and set the path to your kernel tree include
19 # directory if your C library does not include all header files.
20 # CFLAGS += -DUSE_KERNEL_HEADERS -I/usr/src/linux/include
21
(请对照好自己各个库的安装目录再修改!)
[tangbin@localhost hostapd]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[tangbin@localhost hostapd]$ sudo make install
将生成的hostapd拷到开发板/bin目录下,并给予可执行权限。
1.3hostapd.conf配置文件
可以将hostapd目录下的hostapd.conf修改后拷贝到开发板/etc下,也可以直接新建一个,这里选择直接新建:
在开发板/etc目录下创建这个文件hostapd.conf:
interface=wlan0 //网络接口名称
ssid=FL2440 //热点名称
driver=nl80211 //默认使用nl80211无线驱动
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准 , 有效的值取决于硬件,通常:a, b, g
ignore_broadcast_ssid=0 //开启或禁用广播ssid
auth_algs=1 /*指定OSA认证算法, auth_algs=1 只支持 WPA2 身份验证算法。*/
/*auth_algs=2 表示支持 WEP。永远不要使用有线等效加密 (wired equivalent privacy, WEP),因为它非常容易破解,并且多年前就已经被完全破解了。*/
/*auth_algs=3 表示支持这两种方式。*/
wpa=3 /*指定WPA/WPA2类型, wpa=2 仅支持 WPA2。wpa=1 表示支持 WPA1,而 wpa=3 表示二者都支持。*/
wpa_key_mgmt=WPA-PSK //指定您想支持的加密密钥算法
wpa_passphrase=12345678 //指定认证密钥
wpa_pairwise=TKIP /*启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。*/
rsn_pairwise=CCMP /*wpa_pairwise 和 rsn_pairwise控制支持加密数据的密钥,您可以使用 CCMP、TKIP 或两者均使用*/
1.4启动wlan0
>: ifconfig wlan0 up
以守护进程启动:
>: hostapd -B hostapd.conf
出现随机数问题可采用符号链接解决:
>: mv /dev/random /dev/random.org
>: ln -s /dev/urandom /dev/random
成功的话会打印如下信息:
>: hostapd -B hostapd.conf
Configuration file: hostapd.conf
Using interface wlan0 with hwaddr 00:12:04:24:b7:55 and ssid 'FL2440'
并且ifconfig,新增加了一个网络接口:
mon.wlan0 Link encap:UNSPEC HWaddr 00-12-04-24-B7-55-00-00-00-00-00-00-00-00-00-00
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:169 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:39235 (38.3 KiB) TX bytes:0 (0.0 B)
此时电脑和手机已经能搜到wifi信号了,但是这时是连不上的,因为没有IP
二、DHCP配置
我们需要启动DHCP服务器,让手机或者电脑自动能获取IP。busybox已经集成了udhcpd。
同样我们可以在busybox-1.20.2/examples/udhcp/ 下修改配置文件udhcpd.conf,然后拷到开发板上。也可以直接在开发板上新建,由于我们目前只需要最基础的功能,所以选择在开发板/etc目录下新建这个文件,内容如下:
>: cat udhcpd.conf
start 192.168.3.20
end 192.168.3.254
interface wlan0
opt dns 8.8.8.8
option subnet 255.255.255.0
opt router 192.168.3.1
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases //创建租赁文件
ifconfig wlan0 192.168.3.1 netmask 255.255.255.0 //设置接入点
echo "nameserver 8.8.8.8" > /etc/resolv.conf //DNS
udhcpd -f /etc/udhcpd.conf //启动DHCP
成功会打印:
udhcpd (v1.20.2) started
Sending OFFER of 192.168.3.20
Sending ACK to 192.168.3.20
ping一下手机:
>: ping 192.168.3.20
PING 192.168.3.20 (192.168.3.20): 56 data bytes
64 bytes from 192.168.3.20: seq=0 ttl=64 time=72.368 ms
64 bytes from 192.168.3.20: seq=1 ttl=64 time=1280.778 ms
64 bytes from 192.168.3.20: seq=2 ttl=64 time=277.356 ms
64 bytes from 192.168.3.20: seq=3 ttl=64 time=74.611 ms
64 bytes from 192.168.3.20: seq=4 ttl=64 time=23.561 ms
但是还不能上网的。
我们还需要移植iptables。
三、iptables移植
iptables简介
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。
Filter表负责过滤数据包,包括的规则链有,input,output和forward;
Nat表则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
Mangle表则主要应用在修改数据包内容上,用来做流量整形的。
默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
INPUT匹配目的IP是本机的数据包,FORWARD匹配流经本机的数据包,PREROUTING用来修改目的地址用来做DNAT,POSTROUTING用来修改源地址用来做SNAT。
参考:http://www.cnblogs.com/metoy/p/4320813.html
下载并解压:
wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/iptables-1.4.12.tar.bz2
tar xvjf iptables-1.4.12.tar.bz2
[tangbin@localhost wifi]$ cd iptables-1.4.12
[tangbin@localhost iptables-1.4.12]$ mkdir install
[tangbin@localhost iptables-1.4.12]$ ./configure --host=arm-linux --enable-static --disable-shared --disable-ipv6 --disable-largefile --prefix=`pwd`/install
[tangbin@localhost iptables-1.4.12]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static
[tangbin@localhost iptables-1.4.12]$ make install
[tangbin@localhost iptables-1.4.12]$ cd install
[tangbin@localhost install]$ ls
bin include lib sbin share
[tangbin@localhost install]$ cd sbin/
[tangbin@localhost sbin]$ ls
iptables iptables-restore iptables-save xtables-multi
[tangbin@localhost sbin]$ file *
iptables: symbolic link to `xtables-multi'
iptables-restore: symbolic link to `xtables-multi'
iptables-save: symbolic link to `xtables-multi'
xtables-multi: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped
将/install/lib文件夹的文件和xtables-multi打包放到开发板/lib和/bin目录下,赋予权限后将xtables-multi重命名为iptables。
首先要确保eth0是可用的,能上网的(已经连接一个路由器)。
在开发板上iptables配置 :
使用iptables命令接着配置nat转发表
/*将局域网内地址通过eth0接口伪装后转发出去*/
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/*开启转发功能,允许已建立连接及相关连接对内转发*/
>: iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
/*对外转发,数据包从wlan0流向eth0*/
>: iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
>:echo "1" >/proc/sys/net/ipv4/ip_forward //开启内核转发
>: route add default gw 192.168.2.1 //配置好默认网关
>: udhcpd -f udhcpd.conf //启动
此时手机已经能连上wifi热点,并上网:
最后来一个流程总结:
1、确保开发板用网线和路由器LAN口相连。
2、启动网卡wlan0,ifconfig wlan0 up,设置wlan0的ip和netmask(ifconfig wlan0 192.168.3.1 netmask 255.255.255.0)
3、执行命令hostapd -B etc/hostapd.conf。
4、执行udhcpd -f etc/udhapd.conf。此时手机已经能连上,且能ping通,手机上的IP是分配的IP的第一个,即:192.168.3.20。
5、iptables配置,四条命令。
6、eth0的IP确保和连接的路由是在同一个网段的(如我的:192.168.2.200),不然连不上外网的。
7、设置默认网关:route add default gw 192.168.2.1。
8、再次执行udhcpd -f etc/udhapd.conf,此时手机能连上并能上网了。
在这一步时,如果出现
>: udhcpd -f /etc/udhcpd.conf
udhcpd (v1.20.2) started
udhcpd: max_leases=235 is too big, setting to 155
解决方法:
把start 192.168.3.100
改为
start 192.168.3.20