-----------------------------------------------------------------------------------------------------------
主机操作系统:centos 6.7
交叉编译器版本:arm-linux-gcc-4.5.4Author: shaocongshuai <[email protected]>
----------------------------------------------------------------------------------------------------------
RT3070与FL2440实现路由器功能,并使客户端成功联网
一、配置内核支持无线网卡softAP模式
二、配置无线网络的软件移植
Hostapd依赖于openssl与libnl这两个库。所以首先要移植openssl与libnl,openssl我们已经移植过了
libnl是提供基于Linux内核的netlink协议的API的库的套件。 Netlink是内核与用户空间进程之间主要的IPC机制。它相比ioctl设计得更加灵活,并提供了关于内核配置和监视接口的主要的通信方式
1>移植libnl
libnl是为了方便应用程序使用netlink接口而开发的一个库。这个库为原始netlink消息传递以及不同的netlink family专用接口提供了一个统一的接口。移植libnl1.1是hostapd的移植的一部分。hostapd使用的libnl库为1.x版本,2.0版本的API与1.0的并不兼容,故这里移植1.1版本,但2.0移植方式相同。
下载地址 http://www.infradead.org/~tgr/libnl/
至官网下载libnl1.1,解压缩,cd进入libnl目录
[shaocongshuai@localhost libnl-1.1.4]$ mkdir install
[shaocongshuai@localhost libnl-1.1.4]$ ./configure --prefix=/home/shaocongshuai/libnl-1.1.4/install --host=arm-linux
[shaocongshuai@localhost libnl-1.1.4]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[shaocongshuai@localhost libnl-1.1.4]$ sudo make install
将/install下的lib文件夹中的libnl.so.1拷贝到开发板/lib目录下。
2>移植Hostapd
hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动
[shaocongshuai@localhost hostapd-1.0]$ cd hostapd/
[shaocongshuai@localhost hostapd]$ cp defconfig .config
[shaocongshuai@localhost hostapd]$ vim .config
......
22 # Driver interface for drivers using the nl80211 kernel interface
23 CONFIG_DRIVER_NL80211=y
......
[shaocongshuai@localhost hostapd]$ vim Makefile
.....
9 CFLAGS += -I../src
10 CFLAGS += -I../src/utils
11
12 CFLAGS += -I /home/shaocongshuai/libnl-1.1.4/install/include
13 CFLAGS += -I /home/shaocongshuai/openssl-0.9.8e/install/include
14 LIBS += -L /home/shaocongshuai/libnl-1.1.4/install/lib/
15 LIBS += -L /home/shaocongshuai/openssl-0.9.8e/install/lib/
16 LDFLAGS += -L /home/shaocongshuai/libnl-1.1.4/install/lib/
17 LDFLAGS += -L /home/shaocongshuai/openssl-0.9.8e/install/lib/
......
[shaocongshuai@localhost hostapd]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[shaocongshuai@localhost hostapd]$ sudo make install
将生成可执行命令hostapd下载到开发板的/bin目录下
hostapd主要就在于配置文件
对配置文件hostapd.conf的修改
interface=wlan0 //网络接口名称
driver=nl80211 //默认使用nl80211无线驱动
ssid=scs //热点名称
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准 , 有效的值取决于硬件,通常:a, b, g
hw_mode需要你的硬件支持.'g'大多数都支持, 并向前兼容802.11b..channel应该与其他AP被选择在 20mhz (4 channels)之外,或者每边10mhz (2 channels).这就意味着一个在channel 3的一个AP将干涉channel 1或者channel 5的AP.选择一个channel.通常用户的APs默认channel 6, 因此你使用channel 1或channel 11大多数情况下最佳. channels也依赖于本地规则.
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_passphrase=12345678//指定认证密钥
wpa_key_mgmt=WPA-PSK 指定您想支持的加密密钥算法。您的选择有 WPA-PSK、WPA-EAP 或两者均使用。PSK 是预共享密钥。EAP 是可扩展认证协议,是一个支持许多不同身份验证方法的框架。对于小的预共享密钥设置,不需要使用它。
wpa_pairwise=TKIP
//启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。
rsn_pairwise=CCMP
wpa_pairwise 和 rsn_pairwise控制支持加密数据的密钥,您可以使用 CCMP、TKIP 或两者均使用。CCMP 比 TKIP 更强,因此您可以尝试仅支持 CCMP。Windows 客户端以繁琐和棘手的强安全性而闻名,因此您可能想让 TKIP 支持它们。
无线局域网标准IEEE 802.11协议
*IEEE 802.11,1997年,原始标准(2Mbit/s,工作在2.4GHz)。
*IEEE 802.11a,1999年,物理层补充(54Mbit/s,工作在5GHz)。
*IEEE 802.11b,1999年,物理层补充(11Mbit/s工作在2.4GHz)。
*IEEE 802.11g,2003年,物理层补充(54Mbit/s,工作在2.4GHz)。
使用最多的应该是802.11n标准,工作在2.4GHz频段,可达600Mbps(理论值)
~ >: mv /dev/random /dev/random.org
~ >: ln -s /dev/urandom /dev/random
Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。上述两种方式都可以产生随机数,dev/urandom 和dev/random都是产生用不为空的随机字符流,但区别是:
/dev/random设备会封锁,直到系统产生的随机字符流已经充分够用,所以耗用时间较长。/dev/urandom设备不会封锁,数据的随机程度不高,但是一般情况已经够用。
更详细的文件链接http://www.linuxidc.com/Linux/2012-05/60476.htm
~ >: hostapd -B /etc/hostapd.conf
Configuration file: /etc/hostapd.conf
phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt2870.bin'.
phy0 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 0.29.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 3, CWmax: 4, Aifs: 2, TXop: 102.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 4, CWmax: 5, Aifs: 2, TXop: 188.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 5, CWmax: 10, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 5, CWmax: 10, Aifs: 7, TXop: 0.
Using interface wlan0 with hwaddr 00:24:25:50:a9:4d and ssid 'test'
random: Cannot read from /dev/random: Resource temporarily unavailable
random: Only 0/20 bytes of strong random data available from /dev/random
random: Not enough entropy pool available for secure operations
WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 0 - CWmin: 2, CWmax: 3, Aifs: 1, TXop: 47.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 1 - CWmin: 3, CWmax: 4, Aifs: 1, TXop: 94.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 2 - CWmin: 4, CWmax: 6, Aifs: 3, TXop: 0.
phy0 -> rt2x00mac_conf_tx: Info - Configured TX queue 3 - CWmin: 4, CWmax: 10, Aifs: 7, TXop: 0.
3>配置udhcpd
因为是实现最基础的功能,所以我们只要简单的修改地址池、默认网关以及dns即可。
[shaocongshuai@localhost busybox-1.20.2]$ vim examples/udhcp/udhcpd.conf
.....
4 # The start and end of the IP lease block
5 start 192.168.2.100
6 end 192.168.2.254
7
8 # The interface that udhcpd will use
9 interface wlan0
....
64 opt dns 8.8.8.8
65 option subnet 255.255.255.0
66 opt router 192.168.2.1
...
# udhcpd /etc/udhcpd.conf //就可以启动dhcp服务器了。
Udhcpd在执行的时候可能会提示没有一个叫做udhcpd.release的租赁文件,这个只要在相应的文件夹下创建即可。执行下面两条命令:
#mkdir -p /var/lib/misc/
#touch /var/lib/misc/udhcpd.leases
4>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。
详细的iptables的介绍 http://blog.chinaunix.net/uid-26495963-id-3279216.html
[shaocongshuai@localhost iptables-1.4.12]$ ./configure --host=arm-linux --enable-static --disable-shared --prefix=/home/shaocongshuai/iptables-1.4.12/install --disable-ipv6 --disable-largefile
[shaocongshuai@localhost iptables-1.4.12]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static
[shaocongshuai@localhost iptables-1.4.12]$ sudo make install
再理解一次CFLAGS和LDFLAGS:一般我们通过CFLAGS的-I选项告诉编译器所依赖的第三方的库的头文件在哪里,通过LDFLAGS的-L选项告诉链接器这些库的库文件在哪里;还有LIBS是告诉链接器要链接哪些库文件。简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。有时候LIBS指定了却找不到库时可以试试LDFLAGS。
[shaocongshuai@localhost iptables-1.4.12]$ cd install/sbin/
[shaocongshuai@localhost sbin]$ file *
[shaocongshuai@localhost sbin]$ sudo /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi
strip减轻点重量
此时将/install/lib文件夹和xtables-multi打包放到开发板/lib和/bin目录下,赋予权限后将xtables-multi改名为iptables
有了iptables命令工具之后我们便要来配置nat转发表,如下
关于iptables的nat参考:
MASQUERADE是SNAT网络地址转换的一种,SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定destination的ip.如果eth0是动态拨号获取IP,那就需要MASQUERADE来实现SNAT。而我的eth0是接到路由器VAN上的,虽然路由器是拨号上网,但是我的eth0是自己指定的IP,每次都不会变,所以应该也可以使用SNAT的方式来配置iptables。不过我觉得MASQUERADE更方便,这就当为3G动态拨号直连做预热吧。
由开头知我GCC编译器先是静态编译生成静态库文件最后静态链接生成的可执行程序。起初我是放任它编译,动态链接生成可执行文件,然后直接把install下的/lib和/extensive里的.so全部拷贝到开发板上,再全放进文件系统的/lib和/bin目录下。
这样提示我出错:
>: iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables v1.4.12: Couldn't load target `MASQUERADE':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
-A:追加,在当前链的最后新增一个规则
而报错的MASQUERADE库我的lib下是存在的,在反复检查内核配置MASQUERADE相关选项后我怀疑是有些相互依赖的库没有被拷贝到开发板上。因为我一时找不到到底是哪些库,于是直接在make时指定环境变量静态链接。问题解决。
所有的准备就绪后,我们一定要记得先实现eth0能上网。还以为是ipables的nat转发命令的问题。连上路由器如果eth0都上不了网,自然谈不上转发。eth0要上网的话我们只要再给网关和DNS就可以了。
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
// 将局域网内地址通过eth0接口伪装后转发出去
# iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
//对于已经建立连接的包以及该连接相关的包都允许通过!
# iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
// 配置数据包转发时候的接口
#route add default gw 192.168.1.1 //设置默认网关为192.168.1.1 ;只有eth0联网,这个缺省就行。
至于DNS,linux系统并没有直接配置DNS的命令行。网上都说在/etc/resolv.conf中修改,我们回顾STA模式DHCPC自动分配IP的时候打印信息也有个recreating /etc/resolv.conf因为我在做根文件系统的时候并没有在/etc目录下创建resolv.conf,于是我又到文件系统目录树里面创建了一个。在新建的resolv.conf里面添加nameserver:114.114.114.114//DNS
然后连上的wifi热点就可以上网了。至此使用hostapd+udhcpd+iptables等工具基于内核mac80211驱动框架就实现了RT3070无线网卡的softAP!!!