移植iptables至嵌入式设备
因开发工作中,信息安全需要,需要使用iptables实现车载以太网网络隔离
iptables移植
- 下载iptables源码
https://www.netfilter.org/pub/iptables/
或者
git clone git://git.netfilter.org/iptables - cd iptables
- 执行autogen.sh,得到configure文件
- 配置交叉编译环境和安装路径,执行编译和安装
#!/bin/sh
./configure CC=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc \
--prefix=$(pwd)/__install \
--host=aarch64-linux-gnu \
CFLAGS=-I/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/include \
LDFLAGS=-L/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/lib \
--disable-nftables \
--enable-static \
--disable-shared \
--disable-ipv6 \
--disable-largefile
make -j40
make install
- 进入指定的安装目录,进入sbin
- 拷贝图中编译生成的工具至设备的/bin中
- 进入设备中,执行iptables --version,至此,iptables工具移植完成
问题
- 执行iptables -L,提示找不到ip_tables模块
- 进入到对应的目录下查看modules.order,缺失无该模块,查找网上资料,得知需要内核增加配置重新编译才能解决
配置内核增加iptables所需的模块
-
通常需要在原有的内核config文件基础上新增配置,所以要确保我们是基于最新的config文件上新增配置,首先应执行
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- s32v234_defconfig
生成.config文件 -
根据现有的.config进行menuconfig,需要指定交叉编译工具,进入Networking support
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- menuconfig
-
进入Networking options->Network packet filtering framework (Netfilter)
-
首先将Core Netfilter Configuration的子项目都选中,能编译成模块的选择编译成模块,不能的选择编译至内核
-
IP: Netfilter Configuration的子项目都选中,能编译成模块的选择编译成模块,不能的选择编译至内核
-
保存当前配置进.config
-
这时候需要将.config格式的配置文件转换为defconfig
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- savedefconfig
-
config文件一般会放在arch/arm64/configs/中
-
cp ./defconfig arch/arm64/configs/s32v234_defconfig
-
这时候内核配置完成,我们使用最新的配置文件,生成.config,然后执行image编译,modules编译,modules安装
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- s32v234_defconfig
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- -j40
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- modules
make ARCH=arm64 CROSS_COMPILE=/usr/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=/home/thor/Desktop/patch_kernel/linux-eth/arch/arm64/boot/output/
- 将生成的image,modules放入嵌入式设备中,modules需要放在/lib/
- 查看modules.order,新增许多netfilter模块
- 此时在设备运行iptabels -L,不再报错,可以使用iptables命令新建过滤规则了