移植iptables到mini2440
一、首先安装好交叉编译环境。
1.将板子自带的arm-linux-gcc-4.4.3放到/usr/local目录下,并用tar命令解压出来,按照/usr/local/arm/4.4.3目录路径来安放。
2.配置环境变量,在主目录下创建.bash_profile文件,在里面输入export PATH=$PATH:/usr/local/arm/4.4.3/bin。
3.需要使用交叉编译工具时执行~/. .bash_profile,或者执行source ~/.bash_profile,在终端下输入arm-linux-按两下tab键看能否出来一系统arm-linux命令,或者输入arm-linux-gcc -v看能否显示出arm-linux-gcc的版本信息。
二、重新配置内核选项,编译内核支持netfilter
Netfilter是内核态提供的包过滤框架,其中包含了各种各样的过滤表,默认的内核配置一般不包含这个框架,所以我们要先配置内核选项让其支持netfilte才行。
1.将飞凌开发板光盘自带的linux-2.6.32.2-mini2440-20110304内核拷贝到虚拟机的/usr/src目录下,使用命令sudo tar -zxvf linux-...解压到当前目录,得到“linux2.6.32.2”文件夹。
2.方便起见,为“linux2.6.32.2”文件夹建立链接。右键选中linux2.6.32.2文件夹->创建链接,将新建的链接重命名为“linux”。
3.打开终端,切换到“linux”目录下,cd /usr/src/linux
4.将板子自带的配置文件改名为.config,执行sudo cp config_mini2440_t35 .config,接下来就需要进入图形选择相应的选项了,如果是第一次编译内核,则需要安装ncurses包,使用sudo apt-get install libncurses5-dev安装,安装完后运行make menuconfig,飞凌开发板的大部分内核选项(包括系统类型等)都已经选择好了,现在只需将netfilter选项选中。
Networking support --->
Networking options --->
Network packet filtering framework (Netfilter) -->
Core Netfilter configuration --->
全选为built-in [*]
IP: Netfilter configuration --->
全选为built-in [*]
注意:这里的所有选项一定选为built-in [*],而不能选为Module [M],如果选为Module,重新烧制的系统内核里用modprobe ip_tables 命令将不能找到iptables模块。(为了有备无患,我们这里把Netfilter所有的选项都选上)。上一步还有一点要注意的是IP: Netfilter configuration中的FULL NAT选项 一定要选中,否则将不能使用 iptables -t nat命令。
5.配置完成后,将配置文件保存。
6.直接在这个目录下用超级用户的身份编译是无法找到arm-linux-gcc命令的,所以最好是将其拷贝到主目录下,然后开始编译内核make clean;make depend;make bzImage.
7.编译完成后,生成的新内核"zImage"保存在/usr/src/linux/arch/arm/boot文件夹下。
三、交叉编译iptables
Iptables是用户态提供的更改过滤规则的便捷工具,通过使用这个工具,可以方便的改变内核下netfilter的默认规则,也可以根据自己的需求添加自定的规则。
1.到netfilter官方网站下载iptables-1.4.3.1.tar.bz2并解压,用sudo chmod -R 777命令将目录的权限改为最大,编译方法具体可以参考iptables目录下的INSTALL文件
2. 首先一定要确保当前终端下能识别出arm-linux-gcc命令,接着在/home目录下创建plg目录,并将目录的权限更改为777,在终端下切换到iptables-1.4.3.1文件夹。运行./configure --prefix=/home/plg/iptables --host=arm-linux --with-curnel=/usr/src/linux。
说明:选项—prefix=/home/plg/iptables是指定安装路径,为了避免出错,以及避免使用sudo而出现找不到arm-linux-gcc,这里还是把安装路径的权限改为最大,这一步很关键,我移植了很多次在执行iptables命令时都是提示语法错误,步骤1改权限也是避免使用sudo。安装路径选择/home/plg/iptables的原因还有就是为了移植到板子上能够找到相应目录下的动态库,换句话说就是保证两边存放动态库文件的目录一定要一致。--host=arm-linux是指定iptables的运行环境,也就是通知configure在生快成Makefile的时候,编译器选用arm-linux-gcc进行交叉编译。
3.进行编译安装
make KERNEL_DIR=/usr/src/linux(指定内核目录)
make NO.SHARED_LIBS=1(静态链接编译生成可执行文件)
make
make install进行最终的安装
4.目录结构分析如下(列出了开发板需要的最基本文件):
1.4.3.1
lib目录:
libiptc.so.0.0.0,libxtables.so.1.0.0,指向这两个文件的链接libiptc.so.0, libxtables.so.1。
sbin目录:
ip6tables-multi,ip6tables,ip6tables-restore,ip6tables-save,iptables-multi,iptables,iptables-restore,iptables-save。
xtables目录:
libipt_DNAT.so,libipt_SNAT.so,libxt_standard.so(创建链接或者改名为libipt_standard.so),libxt_standard.so(同上libipt_standard.so),libxt_tcp.so(同上libipt_tcp.so),libxt_state(同上libipt_state),…,其他动态库最好也下载到开发板中,以防需要某个匹配选项时提示找不到动态库文件,当出现找不到某个库文件*ipt_*.so的时候,先看看是否存在一个与它相似仅只有中间换成xt的库文件,如果存在将其改成ipt即可,因为其本质是一样的,只是名称不同而已。
四、下载新系统内核和交叉编译好的iptables到板子
1.这一步需要在windows下操作,将开发板的串口,USB接口,电源都连接好后,首先安装2440/windows平台工具/USB下载驱动/FriendlyARM USB download driver驱动,接着将S2开关拨到NOR上,打开S1开关,windows提示发现新硬件,按照提示将驱动安装完,这时在设备管理器里的通用串行总线里就能看到FriendlyARM USB,说明驱动安装正确,再打开windows平台工具下的dnw,设置好串口等一些设置后就可以点USB,串口里的连接了,看到com:OK,USB:OK就说明连接正确,如果不能看到BIOS启动界面再次重启,进入BIOS界面后选择k将bzImage烧到板子上即可。
2.使用优盘方式下载iptables,将优盘插到mini2440上,在/mnt下创建一个目录u留作挂载优盘,执行mount -t vfat /dev/sda4 /mnt/u(优盘第一次插上去的时候是sda4,但当没有安全卸载后再插上去如果挂载不上的话可能是已经变成了sdb4)
3.切换到优盘的目录下,将上面列出的三个目录下的文件(包括要创建的链接文件)分别复制到/lib、/sbin、/home/plg/iptables/libexec/xtables(后三级的目录需要自己创建), 必要时把源代码extensions目录下所有的so文件copy到/home/plg/iptables/libexec/xtables中去,这是为了最大限度的使用工具的命令。
(或者也可以使用超级终端拷贝文件,打开超级终端,连接开发板所在的COM口)
注: (1)当使用目标操作(如-j ACCEPT时)提示找不到libipt_standard.so库文件,这时可以将../libexec/xtables/目录下的libxt_standard.so重命名为libipt_standard.so,这两个库文件从本质上讲是一样的。
(2)运行iptables命令 发现错误iptables: error while loading shared libraries: libiptc.so.0: cannot open shared object file: No such file or directory 原因是缺少libiptc.so.0动态库文件,从lib目录中可以找到,并找到libxtables.so.1将这两个动态库文件下载到板子的/lib下。
(3)这些动态库是在用 iptables的一些选项时调用的。如libipt_SNAT.so,libipt_DNAT.so 支持 “--to”、“-j SNAT”和 “-j DNAT”选项,libipt_tcp.so支持“-- dport”选项。如果用到其他命令选项,自行查找是哪个动态库支持,将其下载到开发板的/home/plg/iptables/libexec/xtables目录。
(4)执行iptables -L 命令,执行成功。但是当添加规则“iptables -A INPUT -t tcp --dport 80 -j ACCEPT”时提示找不到libipt_standard.so文件。而这个文件在编译生成的动态库中是没有的,只有一个“libxt_standard.so”。其实这两个库是一样的。重命名libxt_standard.so为 libipt_standard.so,将其下载到/usr/local/libexec/xtables。
注:文章部分内容摘自http://blog.csdn.net/hanzengyi/archive/2010/11/06/5991917.aspx,其中根据自己执行过程加以修改。