平滑迁移nftables的核心是“可控”与“可退”:先识别兼容模式,再双轨并行重建规则,善用set/map压缩拓扑,最后通过原子加载、连接跟踪压测和5分钟安全锁确保上线安全。

直接用 iptables-translate 一键转,不现实。上千条规则的拓扑往往含自定义链、ipset、nat跳转、状态标记、LOG+limit组合等复杂逻辑,机器翻译只能覆盖基础结构,关键语义和执行顺序必须人工重审。平滑迁移的核心不是“快”,而是“可控”和“可退”。
一、先摸清真实底子,别被表象骗
很多系统看似在跑 iptables,实际是 iptables-nft 兼容层——命令走的是 iptables 语法,底层调用的是 nftables 内核接口。这会影响迁移路径:
- 运行
iptables-save | head -1:若显示# Generated by nftables,说明已是兼容模式,可逐步替换规则,无需停服务 - 运行
nft list ruleset | wc -l:若返回 0,但iptables-save有输出,说明仍是纯 legacy 模式,必须先清理残留再建新表 - 检查是否用了
ipset、geoip、recent等模块:nftables 中没有 direct对应项,ipset要转为nft set,geoip需换为 GeoIP2 + nft ct helper 或外部脚本联动
二、分阶段重建,不碰生产链
别试图一次性 dump → translate → restore。正确做法是“双轨并行”:
- 新建一个独立表,比如
inet filter-migrate,把原 INPUT/FORWARD 规则逐条重写进去,hook 位置和 priority 严格对齐(如 INPUT 链对应hook input priority 0) - 原 iptables 规则暂时保留,但把默认策略设为
ACCEPT(避免冲突),让新表通过jump方式接入关键链(例如在原 INPUT 链末尾加一条-j MIGRATE,对应 nft 的 jump 到新链) - 用
nft monitor trace抓包验证:发测试流量,确认它确实流经新链且动作符合预期,再逐步把旧规则禁用
三、用好 nftables 原生能力压缩拓扑
上千条 iptables 规则常因重复匹配而膨胀。nftables 的集合(set)、映射(map)和 ct state 表达式能大幅简化:
- 把几十条同类 IP 封禁规则合并成一个
set:nft add set inet filter blocked_ips { type ipv4_addr\; },再用ip saddr @blocked_ips drop - 将端口白名单(如只放行 22/80/443/8080)写成
tcp dport { 22, 80, 443, 8080 } accept,比 iptables 的multiport更直观高效 - NAT 场景下,用
map实现动态 DNAT:例如按源 IP 分配不同后端,避免写上百条静态DNAT --to-destination
四、上线前必须过的三道关
迁移不是配置完就结束,要确保原子性、可观测性和兜底能力:
-
原子加载:所有新规则写入
/etc/nftables.conf后,用nft -f /etc/nftables.conf加载——失败则整批回滚,不会出现半截规则 -
连接跟踪压测:执行
cat /proc/sys/net/netfilter/nf_conntrack_count,对比迁移前后数值;若接近nf_conntrack_max的 75%,说明旧 iptables 的 conntrack 开销大,nftables 的轻量 ct 处理会明显释放压力 -
5 分钟安全锁:远程操作时加一行
(sleep 300; nft -f /root/iptables-backup.nft) &,万一失联,5 分钟后自动切回备份规则










