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