system/etc/init/fw.sh 中`iptables-restore`不生效的问题分析与解决方法

74次阅读
没有评论

问题描述

有一个代码位于 /system/etc/init/fw.sh ,原本正常运行:

on post-fs-data
exec u:r:magisk:s0 -- /system/bin/iptables -P INPUT DROP

但在该脚本中添加以下一行时无法生效:

exec u:r:magisk:s0 -- /system/bin/iptables-restore /data/test/fw.rules

fw.rules 文件的权限设置为750,且超级用户上下文(u:r:magisk:s0)应满足执行需求。值得注意的是,从终端输入/system/bin/iptables-restore /data/test/fw.rules 来加载规则时会正常工作。

解决方案

方案1: 检查规则文件的表名

参照问答数据中的评论,可以观察到 iptables-restore 可能无法正确处理某些规则表。建议先将规则拆分为具体表来验证是否适用。
例如:

# 这行可能不生效
exec u:r:magisk:s0 -- /system/bin/iptables-restore < /data/test/fw.rules

# 直接指定需要加载的表
exec u:r:magisk:s0 -- /system/bin/iptables-restore < /data/test/rules.filter # 只读写过滤表

通过这种方法逐个加载特定规则,在确认哪些表能正确应用后,再结合实际设备的情况逐步调整其他规则。

方案2: 触发条件

检查触发事件。根据问答数据中的评论:

# 我们应该确保在属性值为 1 时执行此命令
if [ "$(getprop property.dev.bootcomplete)" == "1" ]; then 
    exec u:r:magisk:s0 -- /system/bin/iptables-restore < /data/test/fw.rules
fi

在设置 iptables-restore 触发条件后,再次尝试运行脚本。确保所有必要规则都在 property.dev.bootcomplete=1 时被正确加载。

方案3: 日志记录与调试

由于命令没有立即生效且缺乏有效日志输出来排查问题原因,可以在相关位置添加以下语句来帮助定位:

exec u:r:magisk:s0 -- /system/bin/logger -t Iptables "规则文件路径为: /data/test/fw.rules"
exec u:r:magisk:s0 -- /system/bin/iptables-restore < /data/test/fw.rules

通过日志记录,可以发现iptables-restore过程中可能存在的错误和问题。

方案4: 依赖关系检查

确保所有相关的服务都已经加载,并处于可用状态。可以通过修改 init.rc 文件来控制其他相关服务的启动顺序和状态:

service restore_ip_rules /
      class main
      user root
      service restart onrestart ignore
do {
    start my_firewall_service
    ...
} < /data/test/fw.rules

通过这些方法,可以逐步定位并解决 iptables-restore 不生效的问题。这需要在实际设备中进行细致测试和调试以适应不同环境的需求。

正文完