新手迁移iptables规则的关键是“先看、再试、后切”,须备份规则、确认防火墙管理服务、设置5分钟自动回滚;按目标选firewalld/nftables/同平台迁移路径;上线前验证端口通断、连接跟踪及拦截效果;最后通过service或netfilter-persistent实现持久化。

新手在不中断业务的前提下迁移 iptables 规则,关键不是“一步换掉”,而是“先看、再试、后切”。重点在于保留原有规则效力的同时,逐步验证新配置的可用性与安全性。下面分几步讲清楚怎么做。
一、迁移前必须做的三件事
这三步不做,后面容易连 SSH 都断掉。
-
备份当前全部规则:执行
sudo iptables-save > /root/iptables-before.rules和sudo ip6tables-save > /root/ip6tables-before.rules,确保 IPv4/IPv6 都覆盖。 -
确认当前防火墙是否被其他服务管理:运行
systemctl is-active firewalld或systemctl is-active nftables。如果返回active,说明 iptables 可能只是兼容层,真实策略由 firewalld 或 nftables 控制,不能直接 restore 规则。 -
设置超时自动回滚机制:用一行命令加个“安全锁”——
(sleep 300; iptables-restore <br> 这样即使新规则导致失联,5 分钟后也会自动恢复原状(适合远程操作)。
二、规则迁移的核心方法选型
根据你的目标环境决定走哪条路:
-
迁移到 firewalld(如 CentOS 7/8):不要硬套 iptables 命令。先用
firewall-cmd --get-zones看可用 zone,再把原 iptables 的 INPUT 链规则按“端口+协议+来源”拆解成firewall-cmd --add-port=80/tcp --permanent、--add-source=192.168.1.0/24等语句;NAT 规则需改用 rich rules 或直接写进 zone 的 xml 文件。 -
迁移到 nftables(如 Debian 12/RHEL 9):用
iptables-translate -f /root/iptables-before.rules生成初步 nft 脚本,但注意它对 LOG、physdev、自定义链等支持不全,必须人工检查 priority、hook 位置和 ct state 表达式是否完整。 -
同为 iptables,仅换服务器或重装系统:直接
iptables-restore 即可,但要提前在新系统安装并启用 <code>iptables-services(CentOS)或netfilter-persistent(Debian),否则重启即失效。
三、上线前的最小化验证步骤
别跳过验证,尤其涉及 NAT、转发、状态跟踪的规则。
-
逐条比对关键端口通断:用
curl -v telnet://本机IP:端口或nc -zv 本机IP 端口测试 SSH、HTTP、数据库等核心端口是否仍响应。 -
检查连接跟踪是否异常:执行
cat /proc/sys/net/netfilter/nf_conntrack_count,若数值接近nf_conntrack_max的 80%,说明新规则可能引发连接堆积,需调整 ct timeout 或删减冗余状态匹配。 -
模拟攻击流量测试拦截效果:从另一台机器用
hping3 -S -p 2222 目标IP发包,再查iptables -L INPUT -n -v | grep 2222看计数是否增长,确认 DROP/REJECT 规则生效。
四、让规则真正持久生效
很多新手卡在这步:规则当时生效了,重启就没了。
-
RHEL/CentOS 6:执行
service iptables save,规则存入/etc/sysconfig/iptables,开机由iptables服务加载。 -
RHEL/CentOS 7+:手动保存到
/etc/sysconfig/iptables后,启用服务:systemctl enable iptables && systemctl start iptables。 -
Debian/Ubuntu:推荐用
netfilter-persistent,安装后执行netfilter-persistent save,它会把规则写入/etc/netfilter/nf_tables.conf并注册 systemd 服务。 -
容器或云主机环境:避免依赖系统服务,改用启动脚本(如 cloud-init 或 rc.local)中加入
iptables-restore ,确保每次初始化都加载。










