基于飞凌2440开发板rt3070工作在AP模式 ( 二)

本文详细介绍iptables的移植过程及配置方法,包括iptables的基本介绍、移植步骤、常见命令参数及nat表配置,并提供了一个ifup-wlan命令脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

作者:guanlei<995318056@qq.com>

内核版本:linux-3.0

交叉编译器:arm-linux  4.5.4

开发平台:fl2440

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


iptables移植

下载地址

http://www.netfilter.org/projects/iptables/downloads.html

  iptables简介

iptables是基于内核的防火墙,功能非常强大,iptables内置了filternatmangle三张表。

五个规则链。

1.PREROUTING (路由前)

2.INPUT (数据包流入口)

3.FORWARD (转发管卡)

4.OUTPUT(数据包出口)

5.POSTROUTING(路由后)

 

filter负责过滤数据包,包括的规则链有,inputoutputforward

nat则涉及到网络地址转换,包括的规则链有,preroutingpostroutingoutput

mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUTOUTPUTNATPOSTROUTINGPREROUTING

input匹配目的IP是本机的数据包,forward匹配流经本机的数据包,prerouting用来修改目的地址用来做DNATpostrouting用来修改源地址用来做SNAT

一次移植时使用的iptables最新的源码包在编译的时候总是出问题,可能是因为内核版本不匹配或者是交叉编译器的原因,后来选用的是iptables-1.4.12.tar.bz2这个版本

[guanlei@centos6 iptables-1.4.12]$mkdir install

[guanlei@centos6iptables-1.4.12]$ ./configure  --host=arm-linux --enable-static --disable-shared --prefix=/home/pikaqiu/tools/iptables-1.4.12/install --disable-ipv6 --disable-largefile

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

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

[guanlei@centos6 iptables-1.4.12]$cd /install/sbin

[guanlei@centos6 iptables-1.4.12]$ file *

[guanlei@centos6 iptables-1.4.12]$sudo /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi     //strip 减少大小用的

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

在上的步骤完成之后配置nat表 。

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

使用iptables命令工具之后我们便要来配置nat转发表

 

/*将局域网内地址通过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 

/*开启linux 的转发功能! Linux系统是默认进制数据包转发的,所谓的转发就是当主机拥有多块网卡的时候,其中一块收到数据包,根据数据包的目的ip转发到本机的另一张网卡上,该网卡根据路由表继续发送数据包首先保证硬件连通,然后打开系统的转发功能

less /proc/sys/net/ipv4/ip_forward,该文件内容为0,表示禁止数据包转发,1表示允许,将其修改为1。可使用命令echo "1" > /proc/sys/net/ipv4/ip_forward 修改文件内容,重启网络服务或主机后效果不再*/

>:echo "1" >/proc/sys/net/ipv4/ip_forward

详情可以参考http://www.cnblogs.com/argb/p/3535179.html这篇文章

编写ifup-wlan 命令脚本

#!/bin/sh

export network_cfg_dir=/apps/etc/network   //导出要用的配置网络的文件的目录

 

#set -x    //调试

 

DEVICE=${1}

 

 

if [ -z "$DEVICE " ] ; then

  echo "Usage :$0 <input the device name such as wlan0" >&2

  exit

fi

 

if [ ! -d /sys/class/net/$DEVICE/ ] ; then

   echo "wireless network $DEVICE does not exit ,please build it"

   exit

fi

 

#set  ip and gateway 

cd  $network_cfg_dir

. ifcfg-${DEVICE}     /*这里相当于创建了一个子进程,里边的设置的参数可以作为全局变量来使用*/

 

#chose the net work on sta or ap and Change in capital

WORKMODE=$(echo $WORKMODE | awk '{ print toupper ($0) }' )

if [ "$WORKMODE" != "AP" ]; then

   WORKMODE="STA"

fi

 

set_ip()

{

   

   ipaddr=$(eval "echo \$IPADDR_$WORKMODE")

   netmask=$(eval "echo \$NETMASK_$WORKMODE")

}

 

 

stop_wifi()

{

   #stop DHCP work on this NIC

   dhcp_pid=`ps | grep -v grep | grep "dhcp" | grep $DEVICE | 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" | grep $DEVICE | 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

 

}

 

configure_wifi_sta()

{  

   set_ip

   ifconfig wlan0 up 

   wpa_supplicant -B -d -Dwext -iwlan0 -c/apps/etc/wireless/wpa_supplicant.conf&

   if [  "$DHCP"  ! =  yes  ] ; then

     ifconfig wlan0  $ipaddr  netmask $netmask up  

     route add default gw 192.168.1.1

     echo "You can surf the Internet now."

   else

     udhcpc  -i wlan0

     ifconfig eth0 down 

     echo "You can surf the Internet now."

    fi

}

 

configure_wifi_ap()

{   

    set_ip

    ifconfig wlan0 up 

#hostapd may have  Error

    mv /dev/random /dev/random.org                                  

    ln -s /dev/urandom /dev/random  

#udhcp may have Error

    mkdir -p /var/lib/misc/                                                      

    touch /var/lib/misc/udhcpd.leases 

   ifconfig wlan0 $ipaddr netmask $netmask up

   ifconfig eth0 192.168.1.244 netmask 255.255.255.0 up  

   route add default gw 192.168.1.1  

   hostapd -B /apps/hostapd.conf

   udhcpd -f /etc/udhcpd.conf

   iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

   iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j  

   iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

   echo "1" >/proc/sys/net/ipv4/ip_forward  

}

  if [ $WORKMODE == "STA" ]; then

   stop_wifi   /*再每次只用ifup-wlan 这个命令的时候都需要把之前你相关的进程杀死,否者推提醒你一个文件被使用多次,执行的时候会出现错误*/

   configure_wifi_sta

else    

   stop_wifi

   configure_wifi_ap

fi

 

 

>: cd  /apps/etc/network   /*开始配置的网络的ip等参数*/

>: vi ifcfg-wlan0 

 

#the wifi work on ap or sta

WORKMODE=AP

 

#work on sta mode ip address

IPADDR_STA=192.168.1.55

NETMASK_STA=255.255.255.0

 

#work on ap mode ip address

IPADDR_AP=192.168.2.1

NETMASK_AP=255.255.255.0

 

#gateway setting

GATEWAY=192.168.2.1

 

#STA or AP mode depend on dhcp

DHCP=yes  

 

编写DNS依赖的文件resolv.conf ,该文件在/apps

>: vi resolv.conf 

 

nameserver 4.2.2.2

 

nameserver 8.8.8.8

在我开发板开机的时候会执行 /apps/etc/init.d/S??* 以大写S开头的文件,所以编写一个开机启动的脚本用于RT3070使用时所依赖一些库,文件和固件。

>: vi Srt_3070 

 

mkdir -p /lib/firmware

mkdir -p /usr/share/udhcpc

cp /apps/simple.script /usr/share/udhcpc

mv /usr/share/udhcpc/simple.script /usr/share/udhcpc/default.script

ln -s /apps/resolv.conf /etc/

ln -s /apps/firmware/rt2870.bin  /lib/firmware/

ln -s /apps/libnl.so.1 /lib/

ln -s /apps/hostapd.conf /etc

ln -s /apps/hostapd /bin

ln -s /apps/udhcpd.conf /etc

ln -s /apps/sbin/iptables /bin

ln -s /apps/ifup-wlan  /bin


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值