========================================================
作者: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内置了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最新的源码包在编译的时候总是出问题,可能是因为内核版本不匹配或者是交叉编译器的原因,后来选用的是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