iptables规则默认仅存于内存,重启即清空;需先验证规则生效,再保存至/etc/iptables/rules.v4等文件,并配置systemd服务开机自动加载。

iptables 规则默认只存在内存中,系统重启后自动清空——这不是故障,是内核设计如此。要让它重启后自动生效,核心就两步:把当前有效的规则存成文件,再让系统在启动时自动读回来。
先确认规则真正在起作用
别急着保存,很多“持久化失败”其实是规则压根没生效。
- 运行 sudo iptables -L -n --line-numbers,检查 INPUT 链里是否真有你加的规则(比如
-A INPUT -p tcp --dport 22 -j ACCEPT) - 用 sudo ss -tlnp | grep ':22' 确认 sshd 监听的是
0.0.0.0:22,不是仅127.0.0.1:22 - 务必提前插入连接状态放行规则:sudo iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT,避免自己被锁在外面
把规则保存到标准路径
推荐统一使用 /etc/iptables/ 目录,兼容性强、不易出错。
- 保存 IPv4 规则:sudo iptables-save > /etc/iptables/rules.v4
- 保存 IPv6 规则(如启用):sudo ip6tables-save > /etc/iptables/rules.v6
- 若提示目录不存在,先创建:sudo mkdir -p /etc/iptables
- 执行 sudo cat /etc/iptables/rules.v4 | head -n 3,确认文件非空且格式正常(开头应为
# Generated by iptables-save)
配置 systemd 服务开机自动加载
不依赖第三方包,原生 systemd 方式,适用于 Ubuntu、Debian、麒麟OS、CentOS 7+ 等主流发行版。
- 新建服务文件:sudo nano /etc/systemd/system/iptables-restore.service
- 填入以下内容(注意路径与权限):
Description=Restore iptables rules
After=network.target
Wants=network.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore ExecStart=/sbin/ip6tables-restore RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
- 启用服务:sudo systemctl daemon-reload && sudo systemctl enable iptables-restore.service
- 立即测试:sudo systemctl start iptables-restore.service,再运行 sudo iptables -L -n 看是否恢复
日常更新规则只需重新保存
改完规则后不用重启服务或系统,热加载一步到位。
- 执行 sudo iptables-save > /etc/iptables/rules.v4(IPv6 同理)
- 再手动触发一次加载:sudo systemctl restart iptables-restore.service
- 或者更轻量:sudo iptables-restore










