本文主要讲述linux wifi做中继时使用iptables的方法,及iptables交叉编译时遇到的一些问题
-----再牛逼的梦想,也抵不住傻逼般的坚持! --2024-01-20 13:50
iptables的编译依赖libmnl 库、libnftnl库,因此需要先编译这两个库。
在编译以下开源库时不同编译工具链编译结果可能存在差异(其他编译器可能存在编译不过的情况)
一、libmnl 交叉编译
1.源码获取
https://www.netfilter.org/pub/libmnl/ 下载文件libmnl-1.0.5.tar.bz2(可下载其他版本,个人喜欢在flash资源充足的情况下用最新版本)
2.交叉编译
tar -xvjf libmnl-1.0.5.tar.bz2
cd libmnl-1.0.5
mkdir _install
#ps:host和CC需要修改成自己的,其他版本可能需要先执行autogen.sh脚本
./configure --host=arm-linux-gnueabihf CC=arm-linux-xxx-gcc LDFLAGS=-static --prefix=$PWD/_install
make
make install
二、libnftnl交叉编译
1.源码获取
https://www.netfilter.org/pub/libnftnl/ 下载libnftnl-1.2.6.tar.xz(也可使用其他版本)
2.交叉编译
tar xf libnftnl-1.2.6.tar.xz
cd libnftnl-1.2.6
mkdir _install
#PKG_CONFIG_PATH为libmnl的产物路径libmnl-1.0.5/_install/lib/pkgconfig
./configure --host=arm-linux-gnueabihf CC=arm-linux-xxx-gcc LDFLAGS=-static --prefix=$PWD/_install PKG_CONFIG_PATH=/home/xxx/libmnl-1.0.5/_install/lib/pkgconfig
make
make install
三、iptables交叉编译
1.源码获取
https://www.netfilter.org/pub/iptables/ 下载iptables-1.8.9.tar.xz(也可使用其他版本)
2.交叉编译
tar xf iptables-1.8.9.tar.xz
cd iptables-1.8.9
mkdir _install
./autogen.sh
#PKG_CONFIG_PATH中添加libmnl和libnftnl产物的pkgconfig路径--也可直接加在makefile中
./configure --host=arm-linux-gnueabihf CC=arm-linux-xxx-gcc --enable-static --disable-shared --prefix=$PWD/__install --disable-ipv6 --disable-largefile PKG_CONFIG_PATH="/home/xxx/libmnl-1.0.5/_install/lib/pkgconfig:/home/xxx/libnftnl-1.2.6/_install/lib/pkgconfig"
make
make install
四、iptables的常用命令
#配置启用NAT转发规则 -o配置上行口即sta使用的网卡
1. iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
2. iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
3. iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
4. iptables -nvL -tnat #查看NAT表的规则列表和统计信息
五、交叉编译过程中常见问题
1.iptables运行提示Fatal: can’t open lock file /run/xtables.lock: No such file or directory
问题原因: iptable使用时会创建/run/xtables.lock文件,需要有权限,设备无/run/目录或者无创建文件权限
修改方法: 需在编译iptables前修改makefile中的XT_LOCK_NAME为文件系统中可创建文件的路径
2.提示iptables v1.8.9 (legacy): can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
问题原因: 内核中CONFIG_IP_NF_IPTABLES_FILTER选项未打开
修改方法: 内核编译前,menuconfig开启iptables相关的选项
3.如果iptables配置转发规则成功,但仍不能正常转发网卡的数据包
问题原因: 可能是没有启用ip转发
修改方法: echo 1 > /proc/sys/net/ipv4/ip_forward