平滑迁移nftables的关键是“先并行、再切换、最后收口”:先确认兼容模式,再双轨运行新建表并严格对齐hook与priority,用set/map压缩重复规则,最后通过原子加载、连接跟踪压测和5分钟安全锁确保上线安全。

直接替换规则会断网,平滑迁移的关键是“先并行、再切换、最后收口”。不靠一键转换,而靠分阶段验证、集合压缩和原子加载来守住业务连续性。
摸清底子:确认当前是不是兼容模式
很多系统看似在跑 iptables,实际已走 nftables 内核接口。先执行:iptables-save | head -1 —— 若显示 # Generated by nftables,说明已是兼容层,可安全增量替换;nft list ruleset | wc -l —— 若返回 0 但 iptables-save 有输出,说明仍是纯 legacy 模式,需先停用旧服务再建新表。
还要检查是否用了 ipset、geoip 或 recent 模块:nftables 中没有直接对应项,ipset 必须转为 nft set,geoip 需对接 GeoIP2 或外部脚本。
双轨运行:新建表,旧规则暂留但降权
不要清空或覆盖原规则。正确做法是:
- 新建独立表,例如
inet filter-migrate,把原 INPUT/FORWARD 规则逐条重写进去,hook 位置和 priority(如priority 0)必须严格对齐 - 将原 iptables 链默认策略临时设为
ACCEPT,避免冲突 - 在原 INPUT 链末尾加一条跳转规则:
-j MIGRATE,对应 nft 中jump to migrate_chain - 用
nft monitor trace发测试包,确认流量真实流经新链且动作符合预期
重构逻辑:用 set/map 替代重复规则
上千条规则膨胀主因是重复匹配。nftables 的原生结构能大幅简化:
- 把几十个封禁 IP 合成一个 set:
nft add set inet filter blocked_ips { type ipv4_addr\; },再用ip saddr @blocked_ips drop - 端口白名单写成
tcp dport { 22, 80, 443, 8080 } accept,比 iptables multiport 更直观 - NAT 场景下用 map 实现动态 DNAT,例如按源 IP 分配后端,避免写上百条静态
--to-destination
上线前必过三关:原子、可观测、可回滚
配置写完不等于上线成功,必须验证这三项:
-
原子加载:所有规则写入
/etc/nftables.conf后,用nft -f /etc/nftables.conf加载;失败则整批回退,无中间态 -
连接跟踪压测:模拟并发连接,检查
ct state established,related是否稳定生效,避免新建连接被误拦 -
5 分钟安全锁:远程操作时加一行
(sleep 300; iptables-restore ,失联自动恢复
迁移不是语法替换,而是规则组织方式的升级。用好 set、map 和声明式结构,才能真正释放 nftables 的性能与可维护性优势。











