RT3070无线网卡AP模式——开发板实现路由功能

时间:2024-03-28 18:17:30

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

对于我的内核版本来说,需要将<>   IP set support和<>   IP virtual server support 先选上以后在Core Netfilter Configuration才会出现那些不需要选的选项。

 

前期移植准备:

具体移植过程楼主不加说明,和之前的类似,可参考博客: 
http://blog.csdn.net/Edroid1530/article/details/72784383

需要移植的库,以及应用程序如下: 
- Openssl库 
-  linbl库 
- Hostapd 
- iptables

1、Openssl库


  1     介绍 
  OpenSSL是使用非常广泛的SSL的开源实现。由于其中实现了为SSL所用的各种加密算法,因此OpenSSL也是被广泛使用的加密函数库。 
  1.1   SSL 
  SSL(Secure Socket Layer)安全协议是由Netscape公司首先提出,最初用在保护Navigator浏览器和Web服务器之间的HTTP通信(即HTTPS)。后来SSL协议成为传输层安全通信事实上的标准,并被IETF吸收改进为TLS(Transport Layer Security)协议。 
  SSL/TLS协议位于TCP协议和应用层协议之间,为传输双方提供认证、加密和完整性保护等安全服务。SSL作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC算法等密码算法实现安全服务。
  
  1.2   OpenSSL 
  OpenSSL是著名的SSL的开源实现,是用C语言实现的。 
  OpenSSL的前身是SSLeay,一个由Eric Young开发的SSL的开源实现,支持SSLv2/v3和TLSv1。 
  伴随着SSL协议的普及应用,OpenSSL被广泛应用在基于TCP/Socket的网络程序中,尤其是OpenSSL和Apache相结合,是很多电子商务网站服务器的典型配置。

 


2、libnl库

libnl 库封装了netlink socket 底层操作,提供了一系列高级API,简化了netlink编程。 libnl 包含四个主要的lib


libnl
libnl-genl
libnl-route
libnl-nf 
参考:http://www.tuicool.com/articles/j6f6z2

 

 


3、Hostapd

hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。在Linux系统中,使用hostapd可以实现WIFI的无线接入热点(AP)。

关于IEEE 802.11协议具体可参考: 
http://blog.csdn.net/Peter_tang6/article/details/72850513

hostapd.conf配置文件是用来设置wifi热点信息的文件,我们可以对hostapd目录下的hostapd.conf文件进行拷贝到开发板然后进行修改。也可以在开发板/etc目录下创建hostapd.conf配置文件

 

interface=wlan0 //网络接口
ssid=qicheng //设置SSID为qicheng
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 或两者均使用*/12345678910111213

 

 

4、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。

 

 

启动wlan0


  : ifconfig wlan0 up

 

 


远程连接开发板:

 要是开发板实现路由功能,需将我们的开发板插到路由器上。然后将我们的eth0的IP地址和路由器设置子同一网段,当前连接的路由器网关为192.168.2.1
RT3070无线网卡AP模式——开发板实现路由功能

 

所以我们需要将开发板eth0设置在这个网段才能通过ssh远程登录开发板。我们的RT3070网卡只能一次实现一种模式,所以不能够既做路由器用,又做为设备连接互联网用,所以开发板连接到路由器必须采用有线的方式,即将网线插到路由器上,通过et0来连接 

RT3070无线网卡AP模式——开发板实现路由功能

 


启动守护进程:


  : hostapd -B hostapd.conf  
  RT3070无线网卡AP模式——开发板实现路由功能


你打开手机就可以发现有一个热点名为qicheng,但是现在还不能上网,因为此时还没分配IP地址。


  >ifconfig                      

RT3070无线网卡AP模式——开发板实现路由功能

 

 


配置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.1123456

IP地址分配范围是在2~254之间,开始的值最好不要太大,否则会出现问题。这里192.168.3.x是我们自己定义的,因为路由器默认网关为192.168.2.1所以我们不能再用2了,也可以设为192.168.4.x,这代表我们开发板作为路由器所在的网段。

然后设置并启动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
12345678910

此时,我们可以将手机连接到”qicheng”这个wifi,然后试着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


此时依旧不能上网,还需要用iptables工具进行相关配置。

 

iptable工具使用:

将上文中一直好的iptable,/install/lib文件夹下的所有库文件(所以.a或者.so)的文件到开发板/lib和将xtables-multi打包放/bin目录下,赋予可执行权限后将xtables-multi重命名为iptables。

确保开发板连接的路由器能够上网,即开发板的eth0网卡连入互联网。  
然后在开发板上对iptables如下配置:

 

/*将局域网内地址通过eth0接口伪装后转发出去*/
>:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

/*开启转发功能,允许已建立连接及相关连接对内转发*/
>: 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.conf1234567891011121314151617

然后可以在windons下打开cmd进行测试:

 

>ping 192.168.3.1         //检查网关是否可达
>ping 114.114.114.114     //检查外网是否可达
>ping www.baidu.com       //检查DNS是否可用123

RT3070无线网卡AP模式——开发板实现路由功能

引用的是别人的图,我的板子默认网关应该是192.168.3.1。eth0和LAN之间为192.168.2.0

流程总结: 
 
内核配置—>工具以及库移植—>创建hostapd.conf配置文件(设置wifi信息)—>启动wlan0—>启动守护进程(可找连接wifi)—>配置DHCP(可连接并分配IP)—>iptables相关配置(手机可上网)

原文链接:https://blog.csdn.net/qicheng777/java/article/details/72882960