问题描述
有一个代码位于 /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
不生效的问题。这需要在实际设备中进行细致测试和调试以适应不同环境的需求。
正文完