fl2440工作于AP模式

来源:互联网 发布:读研 知乎 编辑:程序博客网 时间:2024/05/14 01:56
板子为fl2440,无线网卡为rt3070,内核为linux3.0


接入点模式(AP模式):将有线信号转变成无线wifi信号,可以设置自己的SSID(无线网络名称)及密码,设备通过验证后可接入网络上网。


一:配置内核,使其支持无线网卡AP模式
[*] Networking support  --->
Networking options  --->
[*] Network packet filtering framework (Netfilter)  --->
Core Netfilter Configuration  --->//以下选项外全选
< > Transparent proxying support (EXPERIMENTAL)
< >   set target and match support
< >   CHECKSUM target support
< >   "CT" target support                       
< >   "DSCP" and "TOS" target support
< >   "NOTRACK" target support
< >   "TRACE" target support
<*>   IP set support  --->//以下选项外全选
--- IP set support                              
(256) Maximum number of IP sets                                                              
< >   hash:ip set support                                           
< >   hash:ip,port set support                                        
< >   hash:ip,port,ip set support                                               
< >   hash:ip,port,net set support                    
< >   hash:net set support                                                      
< >   hash:net,port set support                                               
<*>   IP virtual server support  --->//以下选项外全选
--- IP virtual server support
[ ]   IP virtual server debugging
[ ]   SCTP load balancing support
< >   FTP protocol helper
< >   SIP persistence engine
     IP: Netfilter Configuration  --->//包含的选项全选
<*>   RF switch subsystem support  --->//必须选上,不然后面做接入点时会出错


二:配置无线网络的软件移植


做wifi接入点时,我们用的是hostapd,而hostapd又依赖openssl和libnl这两个库。


那什么是hostapd:
hostapd 是用户控件的守护进程用于无线接入点(AP)和授权服务器(authentication servers).她实现了IEEE802.11的AP管理,IEEE802.1X/WPA/WPA2/EAP授权,RADIUS 客户端,EAP服务器和RADIUS 授权服务器


,目前最新版本支持Linux系统(HOST AP,madwifi,mac80211-based驱动)和FreeBSD(net80211)。


1:移植Openssl-0.9.8e
修改源码内的Makefile文件内容(INSTALLTOP,CC,AR,RANLIB)。
INSTALLTOP=/home/zhangl/fl2440/3rdparty/openssl-0.9.8e/install
CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar $(ARFLAGS) r
RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib


编译并安装
#make&&make install


2:移植libnl-1.1.4
./configure?--prefix=/home/zhangl/fl2440/3rdparty/libnl-1.1.4/install(安装路径)?--host=arm-linux(运行平台)?
#make?CC=?/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
#make?install
拷贝install/lib下的libnl.so.1库到开发板的/lib下。


3:移植hostapd-1.0
有了以上库的支持,hostapd便可顺利安装。


修改.config
# cp defconfig .config
#vi .config


23:CONFIG_DRICER-NL80211=Y


修改Makefile
#vi Makefile

12 CFLAGS +=-I/home/zhangl/fl2440/3rdparty/libnl-1.1.4/install/include/
13 CFLAGS +=-I/home/zhangl/fl2440/3rdparty/openssl-0.9.8e/install/include/
14 LIBS +=-L/home/zhangl/fl2440/3rdparty/libnl-1.1.4/install/lib/
15 LDFLAGS +=-L/home/zhangl/fl2440/3rdparty/libnl-1.1.4/install/lib/
16 LIBS +=-L/home/zhangl/fl2440/3rdparty/openssl-0.9.8e/install/lib/
17 LDFLAGS +=-L/home/zhangl/fl2440/3rdparty/openssl-0.9.8e/install/lib/(用到了上面的两个库)


#make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-inux-gcc
#make install

此时便生成了hostapd工具和hostapd.conf配置文件。


修改hostapd.conf配置文件
interface=wlan0 //接入点设备名称
driver=nl80211 //设定无线驱动,此处指定使用nl80211
ssid=test_zl //热点名称
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准( a= IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)
ignore_broadcast_ssid=0 //
auth_algs=1 //指定OSA认证算法。auth_algs采用位域方式来制定,其中第一位表示开放系统认证(OSA),第二位表示共享密钥认证(SKA)。
wpa=3 //指定WPA/WPA2类型,这是一个位域值(bit fields),1表示启用WPA,2表示启用WPA2,3表示启用WPA/WPA2。
wpa_passphrase=zhang123 //指定认证密钥
wpa_key_mgmt=WPA-PSK //
wpa_pairwise=TKIP
rsn_pairwise=CCMP //如果启用了WPA,需要指定wpa_pairwise;如果启用了WPA2,需要指定 rsn_pairwise,或者采用wpa_pairwise的设定。都可以设定成TKIP、CCMP或者两者都有


将修改过的hostapd.conf文件和hostapd工具下载到开发板上,并修改权限chmod a+x hostapd
并在开发板上执行命令hostapd -B hostapd.conf(此时开发板须用网线与路由器连接,并使能wlan0网卡)
若出现读取random随机数错误,可采用符号链接的方法解决:
#mv /dev/random /dev/random.org
#ln -s /dev/urandom /dev/random
若成功,则可在电脑或手机上看见开发板热点,但无法获取ip地址,会一直显示正在连接中,此时便进入下一步操作。


4:配置udhcpd(使得开发板可自动分配ip)

修改/opt/busybox-1.20.2/examples/udhcp/udhcpd.conf


4 # The start and end of the IP lease block
5 start       192.168.2.20
6 end         192.168.2.254 //配置地址池,保证在同一网段即可
7
8 # The interface that udhcpd will use
9 interface   wlan0 //配置网络接口
..........
64 opt dns 8.8.8.8 //配置dns
65 option  subnet  255.255.255.0 //配置子网掩码
66 opt router  192.168.2.1 //配置网关
其他的默认均可


将修改完的udhcpd.conf配置文件下载到开发板上


5:实现ip自动分配


先设置好接入点设备(wlan0)信息
#ifconfig wlan0 192.168.2.1 netmask 255.255.255.0
设置完后可用ifconfig命令查看是否成功。


使能udhcpd.conf配置文件
#udhcpd -f udhcpd.conf &
udhcpd (v1.20.2) started


udhcpd: can't open '/var/lib/misc/udhcpd.leases': No such file or directory
如果出现以上信息,使用以下命令可解决
#mkdir -p /var/lib/misc/
#touch /var/lib/misc/udhcpd.leases


再次执行
#udhcpd -f udhcpd.conf &
udhcpd (v1.20.2) started
Sending OFFER of 192.168.2.20
Sending ACK to 192.168.2.20 //出现类似信息时,手机应该可以成功连上热点,此处分配的ip地址,就是手机的ip地址


6:移植iptables-1.4.12,建立路由表及转发表


# ./configure --host=arm-linux --enable-static --disable-shared --prefix=/home/zhangl/fl2440/3rdparty/iptables-1.4.12/install --disable-ipv6 --disable-largefile
#make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static
#sudo make install


安装完成后,拷贝install/lib下库文件到开发板的/lib下。并进入install/sbin,拷贝xtables-multi到开发板上并修改为iptables,修改执行权限


开发板下配置nat转发表:


#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE//指定操作net表,向net表的规则链中添加一条规则为POSTROUTING,指定路由后的数据由eth0接口伪装后流出(数据流向:wlan0-->eth0)


#iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT//操作默认fileter表,建立从eth0到wlan0的数据通道,并指定已建立连接和该连接相关的所有包通过(配置数据包接受)


#iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT//操作默认fileter表,建立从wlan0到eth0的数据通道,并默认所有包可通过(配置数据包转发)


#echo "1" > /proc/sys/net/ipv4/ip_forward//上面只是打通了局域网通过此机的Forward的通道,也就是打通了局域网与外网的链路,实际上并起不到任何的作用,因为在内核里面的转发文件并没有打开,因为我们要手动修改/proc/sys/net/ipv4/ip_forward 的值,将默认的0改为1~!(1为打开,0为关闭)


附:

iptables命令格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
    
table :操作的表,有3个:filter(负责过滤数据包),nat(负责网络地址转换)和mangle(要应用在修改数据包内容上,用来做流量整形)
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
ACTION :指定如何进行处理


五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)


-t 指定要操作的表,默认是filter
-A 向规则链中添加一条规则,默认被添加到末尾
-D 从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R 进行规则替换
-I 插入一条规则,默认被插入到首部
-F 清空所选的链,重启后恢复
-N 新建用户自定义的规则链
-X 删除用户自定义的规则链
-p 用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s 指定源地址
-d 指定目的地址
-i 进入接口
-o 流出接口
-j 采取的动作,ACCEPT(默认接受所有包,不接受的包用DROP指定),DROP(默认拒绝所有包,接受的用ACCEPT指定),SANT(source network address translation的缩写,即源地址目标转换),DNAT(destination network address translation的缩写,即目标网络地址转换),MASQUERADE(地址伪装,在iptables中有着和SNAT相近的效果,但也有一些区别)
-m state --state {NEW,ESTATBLISHED,INVALID,RELATED}  指定检测那种状态




以上操作完成后,接入热点网络的设备就可以上网了,如果不能,最后有部分的问题及解决方法。






问题: ctrl_iface exists and seems to be in use -cannot override it
Delete '/var/run/hostapd/wlan0' manually if it is not used anymore
Failed to setup control interface
wlan0: Unable to setup interface.

解决方法:主要是因为之前设置了接入点后,配置保存在/var/run/hostapd文件夹下,当设置出现问题,需要重新设置时,接口被占用,故无法设置,出现以上问题。直接删除/var/run/hostapd文件夹,释放被占用接口。


问题: udhcpd:is interface wlan0 up and configured?:cannot assign requested address

解决方法:过会再试试(不太清楚)


问题: 开发板能ping同同网段其他ip,却无法ping通外网
解决方法:用route命令查看网卡信息,得知因为本地网卡缺少网关,而无法上网。添加网关即可route add dafault gw 192.168.1.1。因为缺少网关,导致开发板仅仅是处于路由器的局域网段内,而缺少与外网联通的“桥梁”(网关)
0 0