麒麟OS重启后iptables规则丢失需持久化,可通过五种方法解决:一、iptables-save/restore配合systemd服务;二、netfilter-persistent工具;三、网络钩子脚本;四、kylin-firewall兼容导入;五、systemd timer定期校验重载。

如果您在麒麟OS上已配置iptables临时规则,但重启后规则丢失,则说明规则尚未持久化。以下是将iptables规则永久保存并确保其在系统启动时自动加载的多种方法:
一、使用iptables-save与iptables-restore保存规则
该方法通过将当前运行中的iptables规则导出为文本文件,并在系统启动时自动导入,适用于所有麒麟OS版本(含V10 SP1/SP2/SP3),无需额外安装组件。
1、以root权限执行命令,将当前规则保存至指定路径:sudo iptables-save > /etc/iptables/rules.v4
2、确认目录存在,若提示“No such file or directory”,则创建目录及文件:sudo mkdir -p /etc/iptables && sudo touch /etc/iptables/rules.v4
3、验证文件是否写入成功:sudo cat /etc/iptables/rules.v4 | head -n 5
4、配置systemd服务,在系统启动时自动恢复规则:创建服务文件 /etc/systemd/system/iptables-restore.service,内容如下:
[Unit]
Description=Restore iptables rules
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore < /etc/iptables/rules.v4
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
5、启用该服务:sudo systemctl daemon-reload && sudo systemctl enable iptables-restore.service
二、通过netfilter-persistent工具管理规则
该工具提供统一接口管理iptables/ip6tables规则,支持自动加载、多表同步及版本回滚,在麒麟OS V10桌面版SP2及以上版本中预装或可通过apt安装。
1、检查是否已安装:dpkg -l | grep netfilter-persistent
2、若未安装,执行:sudo apt update && sudo apt install netfilter-persistent iptables-persistent
3、保存当前规则(自动写入/etc/iptables/rules.v4和rules.v6):sudo netfilter-persistent save
4、验证保存结果:sudo netfilter-persistent reload
5、确认服务已启用并运行:sudo systemctl is-enabled netfilter-persistent && sudo systemctl status netfilter-persistent
三、修改网络服务启动脚本注入规则
该方式直接嵌入系统网络初始化流程,在NetworkManager或systemd-networkd启动后立即加载规则,适合对启动顺序有强依赖的定制化环境。
1、编辑网络服务启动后钩子脚本:sudo nano /etc/network/if-up.d/iptables-load
2、写入以下内容(确保可执行):
#!/bin/sh
if [ "$IFACE" = "lo" ] || [ "$MODE" != "start" ]; then
exit 0
fi
/sbin/iptables-restore < /etc/iptables/rules.v4 2>/dev/null || true
3、设置脚本权限:sudo chmod +x /etc/network/if-up.d/iptables-load
4、测试脚本是否可被触发:sudo ifdown lo && sudo ifup lo
5、验证规则是否生效:sudo iptables -nvL | head -n 10
四、使用kylin-firewall兼容iptables规则导入
在启用了KYSEC安全框架的麒麟OS信创环境中,kylin-firewall支持以iptables语法导入规则并生成审计日志,满足等保合规要求。
1、确认kylin-firewall服务状态:sudo systemctl status kylin-firewall
2、将现有iptables规则导出为兼容格式:sudo iptables-save | sed 's/-A INPUT/kylin-firewall --add-rule "allow tcp in port/g; s/--dport \([0-9]\+\).*/\1"/' > /tmp/kylin-rules.sh
3、手动校验并修正转换后的规则(如协议类型、链名映射):sudo nano /tmp/kylin-rules.sh
4、逐条执行导入命令(示例):sudo kylin-firewall --add-rule "allow tcp in port 22"
5、列出当前生效规则并比对原始iptables输出:sudo kylin-firewall --list-rules | grep -E "(22|80|443)"
五、基于systemd timer实现规则定期校验与重载
该方案用于高可用场景,防止因人工误操作或异常导致规则失效,通过定时任务检查规则一致性并自动修复。
1、创建校验脚本:sudo nano /usr/local/bin/iptables-consistency-check.sh
2、写入内容:
#!/bin/bash
CURRENT=$(iptables-save)
SAVED=$(cat /etc/iptables/rules.v4 2>/dev/null || echo "")
if ! diff <(echo "$CURRENT") <(echo "$SAVED") > /dev/null; then
echo "$(date): Rules mismatch, restoring..." >> /var/log/iptables-sync.log
iptables-restore < /etc/iptables/rules.v4
fi
3、赋予执行权限:sudo chmod +x /usr/local/bin/iptables-consistency-check.sh
4、创建timer单元文件:sudo nano /etc/systemd/system/iptables-consistency.timer
5、写入内容:
[Unit]
Description=Check and restore iptables rules every 10 minutes
[Timer]
OnCalendar=*:0/10
Persistent=true
[Install]
WantedBy=timers.target

















