嵌入式 iptables静态编译与动态编译

2019-07-12 22:07发布

注意虽然编译后在file中看到是依赖共享库,但是不要担心: ./configure --with-kbuild --disable-shared --enable-static --disable-ipv6
你可以看一下ldd的结果:
linux-gate.so.1 =>  (0xb76f4000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76af000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7505000)
/lib/ld-linux.so.2 (0xb76f5000)
这就是静态的啊!

目录:"iptables-1.4.12/iptables" file xtables-multi
xtables-multi: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x29f16df7bd3bbfe502ae548cbb87df2140d5b71c, not stripped

如果编译还有问题就静下来看一下configure吧,下面是借鉴的其他人编译的详细过程: iptables的移植:     Linux下支持netfilter机制的配置工具就是iptables,它也就相当与一个应用程序,可以对netfilter进行配置(包过滤规则,NAT等等)。所以要实现netfilter(iptables)就要从两方面来着手:1)内核支持netfilter;2)用户层的iptables配置命令。
1)        编译内核,支持netfilter 
在宿主机上进入Linux内核目录,配置所需的内核模块: 
cd /usr/src/linux 
make menuconfi 
iptables的移植 
Linux下支持netfilter机制的配置工具就是iptables,它也就相当与一个应用程序,可以对netfilter进行配置(包过滤规则,NAT等等)。所以要实现netfilter(iptables)就要从两方面来着手:1)内核支持netfilter;2)用户层的iptables配置命令。 
1)        编译内核,支持netfilter 
在宿主机上进入Linux内核目录,配置所需的内核模块: 
cd  /usr/src/linux 
make  menuconfig 
选中如下内核选项: 
General setup ---> 
[*] Sysctl support (在ROMFS文件系统中/proc/sys/net/ipv4/出现ip_forward) 
Networking options ---> 
[*] Network packet filtering (replaces ipchains) 
IP: Netfilter Configuration --->(全部选择即可) 
这样在内核中就选择支持了netfilter。接下来只需编译并生成内核映像文件并烧写到嵌入式系统即可。如果烧写后重起成功进入Linux,则说明新的支持netfiter的内核已经正常运行。(注意,这里的内核选项只是一些支持netfilter/iptables的选项。这里假设原有内核已支持嵌入式系统的相关硬件,并能在嵌入式平台上运行)。 
2)        编译生成iptables命令 
iptables工具包可以免费从网上获得。下载iptables工具包后,进入下载目录,进行编译生成可执行文件,编译方法具体可以参考iptables目录下的INSTALL文件: 
cd /root/iptables 
make KERNEL_DIR = /usr/src/linux(指定内核目录) 
make NO.SHARED_LIBS=1(静态链接编译生成可执行文件) 
把生成的iptables可执行文件copy到ramdisk再下载到嵌入式系统中就可以运行。 好了,重新启动板子后,就可以用iptables这个命令了。
3)        动态编译iptables 
如果觉得静态编译出来的iptables太大了(717K),可以采用动态库编译模式。 
        配置内核 
[*] Network packet filtering (replaces ipchains) 
IP: Netfilter Configuration --->(全部选为模块即可) 
编译好内核后,制作内核镜像,重启设备,加载新的内核。 
        模块加载 
编译好内核后,我们需要的库文件在net/ipv4/netfilter里面,包括: 
ip_tables.ko             
iptable_filter.ko         
ip_conntrack.ko         
iptable_nat.ko           
ipt_conntrack.ko         
iptable_raw.ko           
ipt_state.ko             
…. 
等等,很多的模块。用户可以根据自己的需要来进行添加不同的功能模块。将需要的模块放到设备上,加载后才能运行iptables。因为模块之间有一定的依赖关系,所以添加模块要有一定的顺序,ip_tables.ko必须首先添加。 
        添加动态库 
在新的内核的基础上还有对iptables进行重新编译,这次是将iptables编译成动态库的形式,所以不需要make NO.SHARED_LIBS = 1这个命令选项了,直接make就可以了。编译成功后在iptables/extension 目录下有很多动态库文件也是必须要放到嵌入式设备上的。 
libipt_tcp.so 
libipt_SNAT.so 
libipt_DNAT.so 
libipt_standard.so 
        … 
等等。同样用户要根据自己的需要来将动态库拷贝到嵌入式设备上/usr/local/lib/iptables/下面,这个路径是iptables 运行时查找库文件的默认路径。如果不觉得麻烦的话,就这样使用。要是想改路径,可以修改源代码。
注意:编译前可能还需要根据嵌入式系统中的处理器类型,如arm,powerPC,来修改makefile中的CC标志。CC默认等于gcc。