=============================
主机操作系统:Centos 6.5
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: linux-3.0
=============================
一、配置内核支持无线网卡softAP模式
在–Networking support
<*>RF switch subystem support —-> //这个一定要选上不然会出错
二、配置无线网络的软件移植
1、移植Openssl-0.9.8e
下载地址:
http://download.csdn.net/detail/u010944778/8940135
解压后修改Makefile
指定install、CC、AR、RANLIB
[hjiaming@centos6 libnl-1.1.4]$ mkdir install
[hjiaming@centos6 libnl-1.1.4]$ sudo make && make install
2、移植libnl
下载地址:
http://download.csdn.net/detail/u010944778/8940293
解压后创建指定安装目录
[hjiaming@centos6 libnl-1.1.4]$ mkdir install
编译并安装libnl
./configure --prefix=/home/pikaqiu/tools/WIFI/libnl-1.1/install*(指定安装路径)* --host=arm-linux
[hjiaming@centos6 libnl-1.1.4]$ make CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[hjiaming@centos6 libnl-1.1.4]$ sudo make install
将/install下的lib文件夹中的libnl.so.1拷贝到开发板/lib目录下。
3、移植Hostapd
hostapd-1.0.tar.gz
下载地址:http://download.csdn.net/detail/u010944778/8940421
[hjiaming@centos6 hostapd]$ cp defconfig .config
[hjiaming@centos6 hostapd]$ vim .config
[hjiaming@centos6 hostapd]$ vim Makefile
分别添加openssl和libnl的头文件和库路径
[hjiaming@centos6 hostapd]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
[hjiaming@centos6 hostapd]$ sudo make install
生成了hostapd和配置文件hostapd.conf
hostapd主要就在于配置文件:
nterface=wlan0 //网络接口设备名称
driver=nl80211 //默认使用nl80211无线驱动
ssid=hjiaming //热点名称
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准
ignore_broadcast_ssid=0
auth_algs=1 //指定OSA认证算法
wpa=3 //指定WPA/WPA2类型
wpa_passphrase=123454321 //指定认证密钥
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP //启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise
rsn_pairwise=CCMP
(1) ssid:无线路由器发射的wifi名称;
(2) hw_mode:指定802.11协议,包括 a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g;
无线局域网标准 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(理论值)
(3)channel:设定无线频道;
(4)interface:接入点设备名称,注意不要包含ap后缀,即如果该设备称为wlan0ap,填写wlan0即可;
(5)driver:设定无线驱动,我这里是nl80211;
(6)auth_algs=1
其中auth_algs指定采用哪种认证算法,采用位域(bit fields)方式来制定,其中第一位表示开放系统认证(Open System Authentication, OSA),第二位表示共享密钥认证(Shared Key Authentication, SKA)。我这里设置alth_algs的值为1,表示只采用OSA;
(7)wpa:指定WPA类型,这是一个位域值(bit fields),第一位表示启用WPA,第二位表示启用WPA2。在我的配置中,无论设置成1、2或3,都可以正常连接
(8)wpa_passphrase: WPA/WPA2加密需要指定密钥,这个选项就是配置WPA/WPA2的密钥。注意wpa_passphrase要求8~63个字符。另外还可以通过配置wpa_psk来制定密钥,不过要设置一个256位的16进制密钥,不适合我们的需求;
(9)wpa_pairwise/rsn_pairwise:如果启用了WPA,需要指定wpa_pairwise;如果启用了WPA2,需要指定 rsn_pairwise,或者采用wpa_pairwise的设定。
接下来在板子上直接执行
~> hostapd -B hostapd.conf
如果编译过程出现缺少库的错误,请自行检查你hostapd所依赖的libnl库和openssl库是否成功交叉编译。
若出现读取random随机数错误,可采用符号链接的方法解决:
~> mv /dev/random /dev/random.org
~> ln -s /dev/urandom /dev/random
详细的文章链接:http://www.linuxidc.com/Linux/2012-05/60476.htm
4、配置udhcpd
修改 /opt/busybox-1.20.2/examples/udhcp/udhcpd.conf 然后拷贝到开发板 /etc 目录下。
修改地址池、默认网关以及DNS
1、修改IP池
起始IP的后两位可以随意,但必须在一个网段
192.168.x.y
192.168.x.z
2、修改执行dhcp功能的接口
可以用过ifconfig -a或者iwconfig命令来查看接口
3、修改DNS、网关、netmask等
opt dns 8.8.8.8 # DNS地址
option subnet 255.255.255.0 #子网掩码
opt router 192.168.2.1 #网关
其他默认即可
自动分配ip链接wifi
~>: ifconfig wlan0 192.168.3.1 netmask 255.255.255.0 (先把要接入点设备设置好)
~>: udhcpd -f /etc/udhcpd.conf
(注意!!!)这里执行的时候可能会出错!!!
~>: udhcpd -f /etc/udhcpd.conf
udhcpd (v1.20.2) started
udhcpd: can’t open ‘/var/lib/misc/udhcpd.leases’: No such file or directory
解决办法:
可能会提示没有一个叫做udhcpd.release的租赁文件,这个只要在相应的文件夹下创建即可。执行下面两条命令:
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
这时会显示udhcpd (v1.20.2) started
说明wifi可以链接
可以用手机链接wifi,开发板能ping自己的手机。
5、iptables移植
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter、nat和mangle三张表。
五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
filter负责过滤数据包,包括的规则链有,input,output和forward;
nat则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
input匹配目的IP是本机的数据包,forward匹配流经本机的数据包,prerouting用来修改目的地址用来做DNAT,postrouting用来修改源地址用来做SNAT。
iptables-1.4.12.tar.gz
下载地址:http://download.csdn.net/detail/u010944778/8945513
[hjiaming@centos6iptables-1.4.12]$ mkdir install
[hjiaming@centos6iptables-1.4.12]$ ./configure
--host=arm-linux --enable-static --disable-shared --prefix=/home/hjiaming/fl2440/wifi/iptables-1.4.12/install --disable-ipv6 --disable-largefile //这里的文件夹是刚创建的文件夹路径
[hjiaming@centos6iptables-1.4.12]$ make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static //交叉编译器
[hjiaming@centos6 iptables-1.4.12]$ sudo make install
[hjiaming@centos6 iptables-1.4.12]$ cd /install/sbin
[hjiaming@centos6 iptables-1.4.12]$ file *
[hjiaming@centos6 iptables-1.4.12]$ su do /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi //strip减小包的大小
CFLAGS和LDFLAGS:一般我们通过CFLAGS的 -I 选项告诉编译器所依赖的第三方的库的头文件在哪里,通过LDFLAGS的-L选项告诉链接器这些库的库文件在哪里;还有LIBS是告诉链接器要链接哪些库文件。简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。有时候LIBS指定了却找不到库时可以试试LDFLAGS。
此时将/install/lib文件夹和xtables-multi打包放到开发板/lib和/bin目录下,赋予权限后将xtables-multi改名为iptables
有了iptables命令工具之后来配置nat转发表,如下:
~>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 // 配置数据包转发时候的接口
iptables主要参数
iptables定义规则的方式比较复杂:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3个filter nat mangle
COMMAND:定义如何对规则进行管理
chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
CRETIRIA:指定匹配标准
-j ACTION :指定如何进行处理
A 向规则链中添加一条规则,默认被添加到末尾
-T指定要操作的表,默认是filter
-D从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R进行规则替换
-I插入一条规则,默认被插入到首部
-F清空所选的链,重启后恢复
-N新建用户自定义的规则链
-X删除用户自定义的规则链
-p用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,
-s指定源地址
-d指定目的地址
-i进入接口
-o流出接口
-j采取的动作,accept,drop,snat,dnat,masquerade
开启linux 的转发功能! Linux系统是默认进制数据包转发的,所谓的转发就是当主机拥有多块网卡的时候,其中一块收到数据包,根据数据包的目的ip转发到本机的另一张网卡上,该网卡根据路由表继续发送数据包首先保证硬件连通,然后打开系统的转发功能
less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo “1” > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再生效
详情参考http://www.cnblogs.com/argb/p/3535179.html
查看是否已打开 ip 转发(1 表示打开):~>cat /proc/sys/net/ipv4/ip_forward
如果未打开,则用以下命令打开:
~>echo “1”>/proc/sys/net/ipv4/ip_forward
当配置都齐全之后,开机要做的工作是这些
ifconfig wlan0 192.168.3.1 netmask 255.255.255.0 up
mv /dev/random /dev/random.org
ln -s /dev/urandom /dev/random
hostapd -B /apps/hostapd.conf
udhcpd -f /etc/udhcpd.conf &
route add default gw 192.168.1.1
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
按顺序做完连上wifi热点就可以上网了
下面是一个同时实现rt3070的sta模式和ap模式的脚本文件,转自大神博客http://blog.csdn.net/hulu_arm/article/details/50739433
参考shell语法http://tsov.net/sh-script-syntax/
#!/bin/sh
#Copyright (C) 2015 hulu<1334528355qq.com>
#This script is used to start Wifi
export sta=/apps/wireless/sta
export AP=/apps/wireless/ap
read -p "choice Wifi mode(sta or ap):" mode
echo "Worked on $mode now"
DEVICE=${1}
dhcp=${2}
# cp $sta/libcrypto.a /lib
# cp $sta/libcrypto.so.0.9.8 /lib
# cp $sta/libssl.so.0.9.8 /lib
# cp $sta/libssl.a /lib
# cp $sta/wpa_supplicant /bin
# cp $sta/wpa_cli /bin
# cp $sta/wpa_passphrase /bin
# chmod 777 wpa*
# mkdir -p /lib/firmware
# cp $sta/rt2870.bin /lib/firmware
configure_wifi_sta()
{
ifconfig wlan0 up
wpa_supplicant -B -d -Dwext -iwlan0 -c $sta/wpa_supplicant.conf
#ifconfig wlan0 192.168.0.120 broadcast 192.168.0.255 netmask 255.255.255.0 up
# cp $sta/default.script /usr/share/udhcpc/
# chmod 777 default.script
if [ "$dhcp" = "dhcp" ]; then
udhcpc -i wlan0
fi
ifconfig eth0 down
echo "now wifi is active,you can internet."
}
# mkdir /lib/firmware
# cp /apps/wireless/sta/rt2870.bin /lib/firmware/
configure_wifi_ap()
{
mv /dev/random /dev/random.org
ln -s /dev/urandom /dev/random
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
ifconfig wlan0 192.168.2.1
ifconfig eth0 192.168.0.120 netmask 255.255.255.0 up
route add default gw 192.168.0.1
# cp $AP/libnl.so.1 /lib
hostapd -B $AP/hostapd.conf
if [ "$dhcp" = "dhcp" ]; then
udhcpd /etc/udhcpd.conf
fi
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "now ap is active."
}
stop_wifi()
{
#stop DHCP work on this NIC
dhcp_pid=`ps | grep -v grep | grep "udhcp" | awk '{print $1;}'`
if [ -n "$dhcp_pid" ]; then
kill $dhcp_pid
fi
ifconfig $DEVICE 0.0.0.0
#Stop wpa_supplicant work on STA mode
pid=`ps | grep -v grep | grep "wpa_supplicant" | awk '{print $1;}'`
if [ -n "$pid" ]; then
kill $pid
fi
if [ -d /var/run/wpa_supplicant ]; then
rm -rf /var/run/wpa_supplicant
fi
#Stop hostapd work on AP mode
pid=`ps | grep -v grep | grep "hostapd" | awk '{print $1;}'`
if [ -n "$pid" ]; then
kill $pid
fi
}
#begin!!!!!!!!
if [ $mode = ap ]; then
stop_wifi
configure_wifi_ap
else
stop_wifi
configure_wifi_sta
exit
fi