本文主要内容转载自https://blog.youkuaiyun.com/Edroid1530/article/details/72784383,中间有自己的心得与补充,感谢博主分享。
前些日子完成了fl2440的一些功能,现在来对其做一些整理
RT3070无线网卡有两种工作模式STA模式和softAP模式,分别由STA驱动和softAP驱动来实现,STA驱动支持无线网卡工作在STA模式下,可以连接到网络实现上网功能。而SoftAP的驱动支持无线网卡工作在softAP模式下,可以作为一个软的接入点,实现无线路由器功能。
在前面一篇博客总结了STA模式的驱动移植,使得我们的开发板能够连接到互联网实现上网功能。这里对RT3070的第二种工作模式即softAP进行一个回顾总结,使FL2440开发板实现路由器功能,其他终端设备可以连接到「 路由器」实现上网。
内核配置
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
[*] Advanced netfilter configuration
Core Netfilter Configuration --->(除了下面选项外其他全选)
< > SCTP protocol connection tracking support (EXPERIMENTAL)
< > FTP protocol support
< > SIP protocol support
< > 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 --->
<*> bitmap:ip set support
<*> bitmap:ip,mac set support
<*> bitmap:port set support
<*> list:set set support
<*> IP virtual server support --->(除了下面选项外其他全选)
[ ] IP virtual server debugging
[ ] SCTP load balancing support
< > FTP protocol helper
IP: Netfilter Configuration --->(全选)
<*> RF switch subsystem support --->
按照上面配置完make menuconfig选项后重新编译内核并烧录到开发板。
接下来将开发板通过网线连接到已经连入因特网的路由器,然后通过SSH远程登陆软件软件登陆到开发板。注意:必须保证PC和开发板处于同一局域网并且在用以网段内,否则登录不上开发板。
配置无线网络的工具移植
移植Openssl库
Hostapd依赖于openssl与libnl这两个库。所以首先要移植openssl与libnl,openssl在前面使能RT3070 STA模式的过程中已经移植了,这里不再重复。
移植linbl库
libnl核心库提供了通过netlink socket连接所需要的基础函数,用于处理socket的链接和断开、数据收发、消息创建分析,提供用户可定制接收状态机,并提供一种抽象的数据类型框架,用于简化netlink 协议对象的实现。 linbl包括四个主要的lib,libnl,libnl-genl,libnl-route,libnl-nf。
更多关于linbl和netlink的介绍,大家可以参考这篇博客。下面进行libnl的移植操作。
安装完成后,将libnl-1.1/install/目录下的 libnl.so.1 拷贝到开发板/lib目录下。
移植Hostapd
hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。在linux系统中,使用hostapd可以实现WIFI的无线接入热点(AP)。
下载解压
[lwn@localhost hostpad]$ wget http://w1.fi/releases/hostapd-1.0.tar.gz
[lwn@localhost hostpad]$ tar -xzvf hostapd-1.0.tar.gz
[lwn@localhost hostpad]$ ls
hostapd-1.0 hostapd-1.0.tar.gz
进入hostapd-1.0修改相关配置文件
[lwn@localhost hostapd]$ cd hostapd-1.0
[lwn@localhost hostapd-1.0]$ cd hostapd/
[lwn@localhost hostapd]$ cp defconfig .config
1.修改.config,如下截图。
[lwn@localhost hostapd]$ vim .config
2.修改Makefile,添加相关依赖库。如下截图。
[lwn@localhost hostapd]$ vim Makefile
3.编译生成hostapd工具
[lwn@localhost hostapd]$ make CC=/opt/dl/buildroot-2012.08/ARM920t/usr/bin/arm-linux-gcc
[lwn@localhost hostapd]$ sudo make install
将生成的hostapd拷贝到开发板的/user/bin目录下,并给与可执行权限。
创建hostapd.conf配置文件
hostapd.conf配置文件是用来设置wifi热点信息的文件,我们可以对hostapd目录下的hostapd.conf文件进行配置然后拷贝到开发板,也可以直接在开发板上新建名为hostapd.conf的配置文件。由于配置文件内容本身并不多,所以我直接在开发板新建一个配置文件。
在开发板/etc目录下创建hostapd.conf配置文件,内容如下:
interface=wlan0 //网络接口
ssid=FL2440 //设置SSID为FL2440
driver=nl80211 //使用nl80211无线驱动
channel=3 //设置wifi信道为信道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 或两者均使用*/
启动wlan0
>: ifconfig wlan0 up
启动守护进程
>: hostapd -B hostapd.conf
...
/*启动hostapd成功的打印信息*/
Using interface wlan0 with hwaddr 00:12:04:24:06:93 and ssid 'FL2440'
...
启动成功会出现上面的打印信息,使用ifconfig命令可以看到多了一个如下的网络接口
现在通过手机或其他终端设备可以搜索到SSID为FL2440的wifi热点信号,并通过预设的秘钥12345678可以连上热点。然而此时并不能上网,因为还没有分配IP地址。
配置DHCP
为了使连上热点的中断设备能够自动获取IP,我们需要启用DHCP服务。busybox中已经集成了udhcp,我们可以直接对busybox-1.20.2/examples/udhcp/ 下的配置文件udhcpd.conf进行修改,也可以在开发板上/etc目录下新建一个名为udhcp.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
然后设置并启动DHCP服务(开发板上操作以下命令)
>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,此时用手机连上FL2440『路由器』将打印以下信息
udhcpd (v1.20.2) started
Sending OFFER of 192.168.3.20/*分配给手机的IP地址为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
成功返回数据,说明此时手机已经连接上『FL2440路由器』并且成功获取到IP。然而此时,依然还不能接入互联网。要使我们的『FL2440路由器』连上因特网,我们还需要移植iptables。
移植iptables
iptables是功能十分强大的基于linux内核的防火墙,iptables内部集成了filter,nat,mangle三张表。
- filter表负责过滤数据包,包括的规则链有,input,output和forward;
- Nat表则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
- Mangle表则主要应用在修改数据包内容上,用来做流量整形的。
有关iptables更详细的介绍,可以参见这篇博客。
下面开始移植iptables
下载并解压
[lwn@localhost iptables]$ wget https://coding.net/u/sfantree/p/self_use_OSS/git/raw/master/source/iptables-1.4.12.tar.bz2
[lwn@localhost iptables]$ tar -xzvf iptables-1.4.12.tar.bz2
[lwn@localhost iptables]$ cd iptables-1.4.12
[lwn@localhost iptables-1.4.12]$ mkdir install
[lwn@localhost iptables-1.4.12]$ ./configure --host=arm-linux --enable-static --disable-shared --disable-ipv6 --disable-largefile --prefix=`pwd`/install
[lwn@localhost iptables-1.4.12]$ make CC=/opt/dl/buildroot-2012.08/ARM920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static
[lwn@localhost iptables-1.4.12]$ make install
[lwn@localhost install]$ ls
bin include iptab_lib.tar.bz2 lib sbin share
[lwn@localhost install]$ cd sbin/
[lwn@localhost sbin]$ ls
iptables iptables-restore iptables-save xtables-multi
[lwn@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), not stripped
将/install/lib文件夹的文件和xtables-multi打包放到开发板/lib和/bin目录下,赋予可执行权限后将xtables-multi重命名为iptables。
确保开发板连接的路由器能够上网,即开发板的eth0网卡连入互联网。
然后在开发板上对iptables如下配置
/*所有去往internet的流量进行地址伪装,即将源地址改为eth0*/
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/*对内转发,数据包从eth0流向wlan0*/
>: 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
/*启动 dhcp服务*/
>: udhcpd -f udhcpd.conf
此时我们再次将设备连接到『FL2440路由器』上,然后可以上网了。
版权声明:本文为博主Escorpion辛苦原创,转载请注明来源,谢谢理解。 https://blog.youkuaiyun.com/Edroid1530/article/details/72784383