思路就是将防火墙规则写进一个脚本,在每次开机的时候执行,很简单。具体步骤如下
1.使用iptables命令控制你的防火墙规则,并写进一个脚本
2.将脚本集成到系统
3.写一个开机服务,调用iptables配置的脚本
本文以RK3588为例
因为Android底层是linux内核,所以可以写一个shell脚本配置防火墙规则
写一个脚本init.iptables.sh
#! /vendor/bin/sh
# init.iptables.sh
# 先清空所有的规则,避免干扰
/system/bin/iptables -F
/system/bin/iptables -X
/system/bin/iptables -Z
/system/bin/iptables -t nat -F
/system/bin/iptables -t nat -X
/system/bin/iptables -t nat -Z
/system/bin/iptables -t mangle -F
/system/bin/iptables -t mangle -X
/system/bin/iptables -t mangle -Z
/system/bin/iptables -P INPUT DROP
/system/bin/iptables -P OUTPUT DROP
/system/bin/iptables -P FORWARD DROP
# 配置你想要的规则
# 这里允许192.168.10.122的tcp 6666端口流量的输入和输出
/system/bin/iptables -A INPUT -p tcp --dport 6666 -s 192.168.10.122 -j ACCEPT
/system/bin/iptables -A OUTPUT -p tcp --dport 6666 -d 192.168.10.122 -j ACCEPT
将脚本放进RK的客制化路径
device/rockchip/common/rootdir/init.iptables.sh
集成到系统里面
在编译文件里加入我们新写的脚本,这里编译后会放到vendor/bin/目录下。存放的路径根据自己的需求,一般可以在TARGET_COPY_OUT_VENDOR或者TARGET_COPY_OUT_SYSTEM
--- a/rootdir/rootdir.mk
+++ b/rootdir/rootdir.mk
@@ -24,6 +24,7 @@ PRODUCT_COPY_FILES += \
$(ROCKCHIP_ROOT_DIR_PATH)/init.rk30board.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(TARGET_BOARD_HARDWARE).rc \
$(ROCKCHIP_ROOT_DIR_PATH)/init.rk30board.usb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(TARGET_BOARD_HARDWARE).usb.rc \
$(ROCKCHIP_ROOT_DIR_PATH)/init.recovery.rk30board.rc:recovery/root/init.recovery.$(TARGET_BOARD_HARDWARE).rc \
+ $(ROCKCHIP_ROOT_DIR_PATH)/init.iptables.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.iptables.sh \
ifneq (,$(filter vehicle car,$(TARGET_BOARD_PLATFORM_PRODUCT)))
PRODUCT_COPY_FILES += \
在init.rc添加开机启动服务,执行脚本
--- a/rootdir/init.rockchip.rc
+++ b/rootdir/init.rockchip.rc
@@ -17,6 +17,9 @@ on post-fs
# set RLIMIT_MEMLOCK to 64MB
setrlimit 8 67108864 67108864
# 在开机完成的时候配置iptables
+on property:sys.boot_completed=1
+ start config_iptables
+
service charger /system/bin/charger
class charger
seclabel u:r:healthd:s0
@@ -138,3 +141,11 @@ service gpsd /system/bin/glgps -c /system/etc/gps/gpsconfig.xml
#service getbootmode /system/bin/getbootmode.sh
# disabled
# oneshot
+
+service config_iptables /vendor/bin/init.iptables.sh
+ class main
+ user root
+ group root system
+ disabled
+ oneshot
+ seclabel u:r:vendor_init:s0 # SElinux标签,不添加脚本不会被执行
编译前最好将脚本权限改成可执行,这里我将脚本权限设置成775
这里还可以用iptables-restore,需要将服务改一下
+service config_iptables /system/bin/iptables-restore < xxx.rules
+ class main
+ user root
+ group root system
+ disabled
+ oneshot
+ seclabel u:r:system_init:s0 # SElinux标签,不添加脚本不会被执行
xxx.rules最好放在system/bin下,并且规则最好不要手写,语法规则不方便人的阅读,将需要配置的防火墙规则用iptables命令设置好后,用iptables-save生成。
想了解具体的用法可以用iptables-restore --help查看
实现在
/system/netd/server/IptablesRestoreController.cpp
Linux系统是通过文件标志来区分文件类型,而不是通过文件尾缀,所以xxx.rules的名字是随便起的