nftables是规则模型的彻底重构,非iptables增强版;它以表、链、规则三层架构统一管理IPv4/IPv6,支持集合、范围表达式及自动模块加载,6行即可构建最小安全策略,Ubuntu 22.04+等主流系统已默认启用其后端。

nftables 不是 iptables 的“增强版命令行”,而是整套规则模型的重构。它用统一语法覆盖 IPv4/IPv6、自动加载匹配逻辑、支持集合与范围表达式,一条规则就能替代 iptables 多条指令。主流发行版(Ubuntu 20.04+、RHEL 8+、Debian 10+)已默认启用其后端,iptables 命令实际走的是兼容层(iptables-nft),迁移不是“要不要做”,而是“如何做得干净高效”。
理解表、链、规则三层结构
nftables 把防火墙逻辑拆成三个清晰层级:
-
表(table):仅作命名空间,不绑定功能。推荐用
inet表同时管理 IPv4 和 IPv6,避免重复配置;ip表只管 IPv4,ip6只管 IPv6 -
链(chain):分基础链(挂载到 netfilter 钩子,如
input、forward)和普通链(用于跳转复用)。每个基础链必须指定hook(如input)和priority(数字越小越早执行) -
规则(rule):匹配条件与动作写在同一行。不再需要
-m conntrack这类模块加载,直接写ct state { established, new };端口可用{ 22, 80, 443 }或80-8080表达
快速搭建最小安全策略
6 行规则即可构建生产级白名单模型:
-
nft 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—— 开放 SSH/HTTP/HTTPS -
nft add rule inet filter input icmp type echo-request accept—— 允许 ping 探测
相比 iptables 同等逻辑,规则更少、语义更直白,且无需额外加载模块。
处理 Docker 等容器干扰
Docker 默认操作 iptables 链,容易与手动 nftables 规则冲突。稳妥做法有两种:
- 启动 dockerd 时加
--iptables=false,然后显式管理容器网桥流量,例如:nft add rule inet filter forward iifname "docker0" oifname "eth0" ct state new accept - 为容器流量单独建表(如
inet nat做 DNAT),或用nft list ruleset定期检查是否出现意外插入的规则,及时清理
确保规则重启不失效
nftables 不会自动保存规则,需主动持久化:
- 导出当前规则:
nft list ruleset > /etc/nftables.conf - 启用 systemd 服务自动加载:
sudo systemctl enable nftables - 部分系统(如 Debian/Ubuntu)支持
nftables-persistent包,安装后运行sudo nftables-persistent save即可
注意:不要依赖 iptables-save 导出再转换,应直接用 nft list ruleset 输出标准格式,避免兼容层引入冗余。

















