1 目标
为了将能够控制设备的访问,准备移植iptables到设备上;2 环境 linux kernel 2.6.18 iptables iptables-1.4.103 移植 3.1 内核配置和编译====通过make menuconfig,配置使其支持netfilter:
Networking --->
Networking options ---> [*] Network packet filtering (replaces ipchains) ---> [*] Bridged IP/ARP packets filtering Core Netfilter Configuration ---> IP: Netfilter Configuration --->其中 “Core Netfilter Configuration”和“IP: Netfilter Configuration”下面还有很多,将需要的都配上;
这里我还要说一下,我都是将其配置成“动态加载”的模式,主要是依据这个的言论,我直接引用人家的{
iptables的移植以及配置 http://hi.baidu.com/wugangseu/blog/item/36767cc9f4f2e81c7e3e6f59.html 2009-12-25 10:01 弄了一晚上,发现iptables这个软件比较bt,它在运行的时候会自动加载一些它所需要的模块文件如果没有发现这个模块的话,就运行不起来,提示你的内核或者iptables需要更新,即使你把这些它所需要的模块编译进了内核,它也是人不出来的,也就是说,这些内核文件必须编译成模块。 另外一个是这些模块的依赖关系,大概有十来个模块,有几个相对最底层的模块,比如x_tables是可以直接编进内核的,而其他的一些模块,比如ip_tables就必须依赖于这个x_tables。我在编译的时候就直接把x-table编进了内核,因为我发现iptables在运行的时候并不会modprobe这个模块,iptables所modprobe的最底层的模块应该是ip_table,其他的模块都依赖于这个ip_table 但在我要执行modprobe ip_table的时候,却发现加载不上去,而是报了一个错误。一开始,我认为这是因为我编译进内核的文件对ip_table的支持还不够,肯定是少编了什么东西。然后就在那尝试再多添加些文件进内核,但是,试了很多次都没结果。弄了几次结果都是不行,好吧,上网查查,发现我用的这个开发板在modprobe的时候都有这个错误,于是乎打了个补丁,然后重新编译内核,重新下载ko文件进文件系统,再运行iptables的时候就ok了。 接下来研究这个iptables怎么用 这个iptables在执行的时候,会自动modprobe它所需要的ko文件,因此就不必手动modprobe这些ko文件了。 我所要实现的功能是在开发板上实现nat功能,也就是一个最基本的路由器。现在开发板通过拨号生成了一个ppp0的连接,开发板还有一个eth0,直接连在电脑上。 好吧,查了许久iptables是怎么用的,发现基本只要3个操作就ok了,真是方便啊! #改变源地址范围,也就是电脑所应该设置的ip地址范围 iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.5-192.168.1.250 #伪装所有由ppp0送出的东西 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE #开启IP转发 echo "1">/proc/sys/net/ipv4/ip_forward 执行这三条指令后,在执行一条iptables -t nat -L 就可以看到这两个规则被添加到了nat table的postrouting chain中去了。 最后,修改电脑上网卡的配置,ip地址在所设置的范围内,gw为isp给ppp0分配的ip,dns也是isp给ppp0分配的ip ,然后ping一下百度,就通啦。这样就基本实现了最简单的路由功能了吧 测试时发现的问题 : 经常会掉线,一掉线无论是在pc上还是在板子上都ping不同外网了 }3.2 编译iptables
====配置编译 参考“iptables 1.4.10 移植编译”http://blog.sina.com.cn/s/blog_67bccccb01010bnq.html ./configure --prefix=/home/iptables --host=arm_v5t_le { 出现这个错误的话checking host system type ....invalid configuration 'arm-vet_le': machine 'arm_v5t_le' not recognized 用下面解决办法: 修改config.sub 把arm_v5t_le加上。 | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | arm_v5t_le \ } make KERNEL_DIR=/home/mao/disk1/workroom/bj_sdk/ipcam/lsp10/ti-davinci make NO.SHARED_LIBS=1 make make install ====将iptables以及相关的copy到设备中正确位置 { [root@FriendlyARM /etc]# cd /home/plg [root@FriendlyARM plg]# ls iptables iptables.tar [root@FriendlyARM plg]# cd iptables/ [root@FriendlyARM iptables]# ls bin include lib libexec sbin share [root@FriendlyARM iptables]# cd lib [root@FriendlyARM lib]# cp * /lib -r [root@FriendlyARM lib]# cd ../sbin [root@FriendlyARM sbin]# cp * /sbin -r [root@FriendlyARM sbin]# iptables -v iptables v1.4.9: no command specified Try `iptables -h' or 'iptables --help' for more information. [root@FriendlyARM sbin]# }3.3 加载iptables相关模块
由于相关模块比较多,并且他们之间还具有依赖关系,所以用insmod去手工加载模块就变得无法忍受; 所以这里就必须要用的modprobe,在我设备中用到的是modprobe-bin; 要用到modprobe的话,那么就必须要有modules.dep;而modules.dep又是由depmod生成的; 但很可惜,我的设备中没有depmod;要理解modpobe,depmod,modules.dep的用途和关系,可参考: modules.dep,modprobe,depmod,mkinitrd之间的关系 http://blog.sina.com.cn/s/blog_704836f40100m26d.html====所以这里再明确一下,我的目标是能够加载iptables相关模块;这里要用到modpobe,最终在设备上面要有,"modules.dep","内核模块","iptables以及相关的";
其中"iptables以及相关的"已由3.2生成并放到正确位置; ===="modules.dep","内核模块" modules.dep生成主要参考 “《我也来学做嵌入式Linux系统V0.1》(1)http://club.techtarget.com.cn/showtopic-4807.aspx” 以下是具体步骤: 1 mkdir prjroot export PROJECT=/home/mao/disk1/workroom/prjroot cd prjroot 2 cp vmlinux ${PRJROOT}/images cp System.map ${PRJROOT}/images cp .config ${PRJROOT}/images3
将 busybox-1.19.4/examples/depmod.pl拷贝到${PRJROOT}下面; make ARCH=arm CROSS_COMPILE=arm_v5t_le- INSTALL_MOD_PATH=/home/mao/disk1/workroom/prjroot/images/modules modules_install ./depmod.pl ./vmlinux -F ./System.map -b /home/mao/disk1/workroom/prjroot/images/modules/lib/modules > /home/mao/disk1/workroom/prjroot/images/modules.dep4 将"modules.dep","内核模块"放到正确位置
cp modules/ /home/mao/disk1/workroom/bj_sdk/ipcam/dbvt/filesys/lib/ -r3.4 验证
目前新设备上面需要更新的是:内核,iptables以及相关模块,3.3中生成的"modules.dep""内核模块"; cd /lib/modules/2.6.18_pro500-davinci_IPNC_1.0/kernel/net/ipv4/netfilter modprobe-bin iptable_filter { 运行该命令时发生错误,说是找不到那些模块,于是我修改了modules.dep,将kernel换成了绝对地址/lib/modules/2.6.18_pro500-davinci_IPNC_1.0/kernel; } 限制一个网段IP iptables -A INPUT -i eth0 -p TCP -s 192.168.8.20/24 -j DROP 清除所有的限制 iptables -F 可以参考: iptables限制访问某个IP地址 http://www.cnblogs.com/happyhotty/articles/1951124.html 3.5 问题 目前我每次调用iptables都会打印非常多的: Usage: /sbin/modprobe-bin [-v] [-V] [-C config-file] [-n] [-i] [-q] [-o <modname>] <modname> [parameters...] /sbin/modprobe-bin -r [-n] [-i] [-v] <modulename> ... 需要调查解决;参考:netfilter官方网站 http://www.netfilter.orgiptables 1.4.10 移植编译 http://blog.sina.com.cn/s/blog_67bccccb01010bnq.htmliptables的移植以及配置 http://hi.baidu.com/wugangseu/blog/item/36767cc9f4f2e81c7e3e6f59.htmliptables限制访问某个IP地址 http://www.cnblogs.com/happyhotty/articles/1951124.htmlmodprobe与depmod http://hi.baidu.com/mismis/item/af8ae40ae3a2eb046c904810移植iptables到powerpc开发板 http://blog.csdn.net/ixful/article/details/2493517《我也来学做嵌入式Linux系统V0.1》 http://club.techtarget.com.cn/showtopic-4807.aspxmodules.dep,modprobe,depmod,mkinitrd之间的关系 http://blog.sina.com.cn/s/blog_704836f40100m26d.htmliptables限制访问某个IP地址(1) http://os.51cto.com/art/201103/249682.htm【转】DM365-Openssh移植到MontaVista linux的步骤 http://hi.baidu.com/ruantao1989/blog/item/63cf7d18121484dca6ef3f56.html