iptables 移植到arm上


1 目標
為了將能夠控制設備的訪問,准備移植iptables到設備上;
2 環境
linux kernel 2.6.18
iptables iptables-1.4.10
3 移植
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}/images

3
將 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.dep

4 將"modules.dep","內核模塊"放到正確位置
cp modules/ /home/mao/disk1/workroom/bj_sdk/ipcam/dbvt/filesys/lib/ -r

3.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.org
iptables 1.4.10 移植編譯 http://blog.sina.com.cn/s/blog_67bccccb01010bnq.html
iptables的移植以及配置 http://hi.baidu.com/wugangseu/blog/item/36767cc9f4f2e81c7e3e6f59.html
iptables限制訪問某個IP地址 http://www.cnblogs.com/happyhotty/articles/1951124.html
modprobe與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.aspx
modules.dep,modprobe,depmod,mkinitrd之間的關系 http://blog.sina.com.cn/s/blog_704836f40100m26d.html
iptables限制訪問某個IP地址(1) http://os.51cto.com/art/201103/249682.htm
【轉】DM365-Openssh移植到MontaVista linux的步驟 http://hi.baidu.com/ruantao1989/blog/item/63cf7d18121484dca6ef3f56.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM