您的位置:首页 > 运维架构 > Linux

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

2016-06-16 21:44 603 查看
*********************************************************

主机开发环境: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/46969437http://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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux wifi iptables