nftables替代iptables核心是切换至统一高效规则模型,ubuntu 22.04+已默认启用其后端,iptables命令实为兼容层;它以表、链、规则三元素重构架构,支持inet双栈、原子匹配、集合语法与自动模块加载,最小安全策略仅需6行,规则量减40%且语义更清晰。

直接用 nftables 替代 iptables,核心不是“换命令”,而是切换到更统一、更高效的规则管理模型。Ubuntu 22.04 及更新版本已默认启用 nftables 后端,iptables 命令实际走的是兼容层(iptables-nft),所以迁移不仅是可行的,更是系统推荐的做法。
理解底层模型差异
nftables 不再沿用 iptables 的“四表五链”硬划分,而是围绕三个基础元素组织规则:
-
表(Table):仅作命名空间用途,可按协议族定义(如
inet同时覆盖 IPv4/IPv6,ip仅 IPv4),不再绑定功能类型 -
链(Chain):分为基础链(挂载在内核 hook 点,如
input、forward)和普通链(用于模块化跳转),支持自定义优先级控制执行顺序 -
规则(Rule):匹配条件与动作写在同一行,支持集合
{ }、范围80-8080、状态字段直写(如ct state established),无需额外加载模块(-m conntrack这类写法已淘汰)
快速部署最小安全策略
一条命令就能建好基础防护框架:
nft add table inet filter<br>nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }<br>nft add rule inet filter input iifname "lo" accept<br>nft add rule inet filter input ct state { established, related } accept<br>nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new accept<br>nft add rule inet filter input icmp type echo-request accept
这段配置实现了白名单模式:默认拒绝所有入站,只放行回环、已建立连接、SSH/HTTP/HTTPS 和 ping 请求。相比 iptables 同等逻辑,规则行数减少约 40%,且语义更清晰。
处理 Docker 等容器场景
Docker 默认操作 iptables 链,容易与手动规则冲突。nftables 下推荐两种稳妥方式:
-
禁用 Docker 自动操作:启动 dockerd 时加
--iptables=false,然后把容器网桥流量显式纳入 nftables 管理,例如:nft add rule inet filter forward iifname "docker0" oifname "eth0" ct state new accept -
保留 Docker 管理但隔离规则空间:为容器流量单独建表(如
inet nat处理 DNAT),避免与主机filter表混用;或使用nft list ruleset定期检查是否出现意外插入的规则
确保规则持久生效
nftables 不自动保存规则,需手动导出并配置开机加载:
- 导出当前规则:
nft list ruleset > /etc/nftables.conf - 启用 systemd 服务:
sudo systemctl enable nftables - 验证重启后是否生效:
sudo systemctl restart nftables && nft list ruleset | head -5
注意:不要依赖 iptables-save 或旧版脚本,它们输出的是兼容格式,无法体现 nftables 原生结构优势。











