S3C2440开发板+RT3070无线网卡 基于hostapd+udhcpd+iptables实现softAP模式(路由器)

来源:互联网 发布:自学办公自动化软件 编辑:程序博客网 时间:2024/06/15 02:42

*********************************************************

主机开发环境:Centos6.5

交叉编译器:arm-linux-gcc

Linux内核版本:Linux-3.0

开发平台:FL2440开发板

作者:ZhengNice<shizhengzhu@126.com>

*********************************************************

开发说明:基于RT3070网卡实现softAP模式是在FL2440开发板已经成功移植Linux-3.0内核并且已经做好可读写ubifs文件系统的基础上,另外在进行此次开发之前开发板已经成功移植DM9000网卡和USB驱动的移植,这个可以参考的我之前的博客进行。另外感谢http://blog.csdn.net/u010944778/article/details/46969437和http://blog.csdn.net/hulu_arm/article/details/50739433两篇博客为本次开发提供的宝贵经验。


一、linux内核配置支持无线网卡softAP模式

[*] Networking support  --->  

           Networking options  ---> 

 [*] Network packet filtering framework (Netfilter)  --->  //主要的配置都在这里

[ ]   Network packet filtering debugging

[*]   Advanced netfilter configuration 

 [*]     Bridged IP/ARP packets filtering 

        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

< >   "TCPOPTSTRIP" target support (EXPERIMENTAL)

< >   "dscp" and "tos" match support

< >   "ipvs" match support


<*>   IP set support  --->

(256) Maximum number of IP sets 

<*>   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 

< >   SIP persistence engine


IP: Netfilter Configuration  ---> //全选


<*>   RF switch subsystem support  ---> //注意要选不然在使用hostapd命令时会出错


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

1.移植openssl

1.1下载好openssl-1.0.1p源码并解压之后,在该文件下创建新的文件夹install

mkdir install

2.2修改Makefile文件

29 INSTALLTOP=/opt/openssl-1.0.1p/install

32 OPENSSLDIR=/opt/openssl-1.0.1p/install

62 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc

69 AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar $(ARFLAGS) r

70 RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib

1.3编译 sudo make & make install 并拷贝libcrypto.a  libssl.a到开发板的/lib


2.移植libnl

2.1下载好libnl-1.1源码并解压之后,在该文件下创建新的文件夹install

2.2编译&安装

./configure --prefix=/home/wwl/fl2440/3rdparty/libnl-1.1/install(指定安装路径) --host=arm-linux 

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

# sudo make install 

2.3将/install下的lib文件夹中的libnl.so.1拷贝到开发板/lib目录下


3.移植hostapd

3.1下载好hostapd-1.0源码并解压之后

3.2复制和修改配置文件 cp defconfig .config &vim .config

修改如下:

 23 CONFIG_DRIVER_NL80211=y

修改Makefile文件:

 11 CFLAGS += -I/home/wwl/fl2440/3rdparty/openssl-1.0.1p/install/include/
  12 CFLAGS += -I/home/wwl/fl2440/3rdparty/libnl-1.1/install/include/
14 LDFLAGS += -L/home/wwl/fl2440/3rdparty/openssl-1.0.1p/install/lib/
15 LIBS += -L /home/wwl/fl2440/3rdparty/openssl-1.0.1p/install/lib/
16 LDFLAGS += -L/home/wwl/fl2440/3rdparty/libnl-1.1/install/lib/
17 LIBS += -L/home/wwl/fl2440/3rdparty/libnl-1.1/install/lib/

3.3编译和安装

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

# sudo make install

3.4将生成可执行命令hostapd和配置文件hostapd.conf

hostapd主要就在于配置文件,以下是我的基本配置:

interface=wlan0   //网络接口名称

driver=nl80211 //默认使用nl80211无线驱动

ssid=Mywifi_test  //热点名称

channel=3  //设定无线频道

hw_mode=g //使用80211g协议标准

ignore_broadcast_ssid=0 //

auth_algs=1 //指定OSA认证算法

wpa=3 //指定WPA/WPA2类型

wpa_passphrase=11111111//指定认证密钥

wpa_key_mgmt=WPA-PSK 

wpa_pairwise=TKIP

//启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。

rsn_pairwise=CCMP

3.5在板子上直接执行hostapd -B hostapd.conf 即可;

如果编译过程出现缺少库的错误,请自行检查你hostapd所依赖的libnl库和openssl库是否成功交叉编译。

若出现读取random随机数错误,可采用符号链接的方法解决:
# 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


4.配置udhcpd

修改/opt/busybox-1.20.2/examples/udhcp/udhcpd.conf然后拷贝到开发板/etc目录下。

因为是实现最基础的功能,所以我们只要简单的修改地址池、默认网关以及dns即可

以下是我的配置

  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 202.120.2.101
 65 option  subnet  255.255.255.0
 66 opt router  192.168.2.1
 67 #opt    wins    192.168.10.10
 68 #option dns 129.219.13.81   # appended to above DNS servers for a total of 3
 69 option  domain  local
 70 option  lease   18000       # default: 5 hours
 71 option  msstaticroutes  10.0.0.0/8 10.127.0.1       # single static route
 72 option  staticroutes    10.0.0.0/8 10.127.0.1, 10.11.12.0/24 10.11.12.1


因为udhcpd和udhcpc一样都是busybox里面自带的命令。所以我直接把配置文件放到开发板上再执行命令

# udhcpd /etc/udhcpd.conf    //就可以启动dhcp服务器了。

Udhcpd在执行的时候可能会提示没有一个叫做udhcpd.release的租赁文件,这个只要在相应的文件夹下创建即可。执行下面两条命令:

#mkdir -p /var/lib/misc/
#touch /var/lib/misc/udhcpd.leases


5.iptables移植

5.1iptables简介

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。

5.2下载好iptables-1.4.20源码并解压之后,在该文件下创建新的文件夹install

5.3配置和安装

[pikaqiu@centos6iptables-1.4.12]$ ./configure 

--host=arm-linux --enable-static --disable-shared --prefix=/home/wwl/fl2440/3rdparty/iptables-1.4.20/install --disable-ipv6 --disable-largefile

[pikaqiu@centos6iptables-1.4.12]$make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFLAGS=--static LDFLAGS=-static

[pikaqiu@centos6 iptables-1.4.12]$sudo make install

进入install/sbin/文件夹 sudo /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi  strip减轻点重量

此时将/install/lib文件夹和xtables-multi打包放到开发板/lib/bin目录下,赋予权限后将xtables-multi改名为iptables

5.4开发板的上的配置

配置nat转发表,如下:

# /apps/wireless/softAP/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

// 将局域网内地址通过eth0接口伪装后转发出去

# /apps/wireless/softAP/iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT 

//对于已经建立连接的包以及该连接相关的包都允许通过!

# /apps/wireless/softAP/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

// 配置数据包转发时候的接口 

====================================================================================

关于iptables的nat参考:

MASQUERADE是SNAT网络地址转换的一种,SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定destination的ip.如果eth0是动态拨号获取IP,那就需要MASQUERADE来实现SNAT。而我的eth0是接到路由器VAN上的,虽然路由器是拨号上网,但是我的eth0是自己指定的IP,每次都不会变,所以应该也可以使用SNAT的方式来配置iptables。不过我觉得MASQUERADE更方便,这就当为3G动态拨号直连做预热吧。

====================================================================================

参考文档:

http://soft.zdnet.com.cn/techupdate/2008/0317/772069.shtml

http://www.cnblogs.com/argb/p/3535179.html

http://blog.chinaunix.net/uid-26495963-id-3279216.html  iptables详解

所有的准备就绪后,我们一定要记得先实现eth0能上网。连上路由器如果eth0都上不了网,自然谈不上转发。eth0要上网的话我们只要再给网关和DNS就可以了。


实现开发板路由的整个流程

>: mv /dev/random /dev/random.org 
>:ln -s /dev/urandom /dev/random
>:hostapd -B /apps/hostapd/hostapd.conf 

Configuration file: /apps/hostapd/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 48:5d:60:40:77:02 and ssid 'mywifi_tset'
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.
>:ifconfig wlan0 192.168.2.1 netmask 255.255.255.0 
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
>:iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT 
>:iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 
>:echo "1" >/proc/sys/net/ipv4/ip_forward
>:route add default gw 192.168.1.1
>:udhcpd -f /apps/udhcpd/udhcpd.conf 

udhcpd (v1.20.2) started
udhcpd: max_leases=235 is too big, setting to 155
Sending OFFER of 192.168.2.100 //第一个用户
Sending ACK to 192.168.2.100
phy0 -> rt2800_txdone_entry_check: Warning - TX status report missed for queue 2 entry 2
phy0 -> rt2800_txdone_entry_check: Warning - TX status report missed for queue 2 entry 3
phy0 -> rt2800_txdone_entry_check: Warning - TX status report missed for queue 2 entry 5
Sending OFFER of 192.168.2.101  //第二个用户
Sending OFFER of 192.168.2.101
Sending ACK to 192.168.2.101








0 0