nftables是iptables的全面升级而非简单命令替换,它以统一语法管理双栈及多表功能,Ubuntu 22.04+默认启用其后端,iptables仅作为兼容层运行;其核心由表、链、规则三层构成,支持inet协议族、原子操作与集合语法,6行即可实现最小安全策略,规则量减少40%且语义更清晰。
nftables 不是 iptables 的简单“命令替换”,而是整套规则模型的升级。它用统一语法管理 IPv4/IPv6、filter/NAT/mangle,规则更少、语义更直、执行更快。Ubuntu 22.04+ 默认已启用其后端,iptables 命令实际走的是兼容层(iptables-nft),所以迁移不是可选项,而是系统推荐路径。
nftables 围绕三个基础元素组织:
inet(IPv4+IPv6 同时生效,推荐)、ip(仅 IPv4)、ip6(仅 IPv6)input、forward,挂载在内核 hook 点)和普通链(用于模块化跳转)。创建时需指定 hook 和 priority(数字越小越先执行){22, 80, 443}、端口范围 80-8080、状态直写 ct state established,无需 -m conntrack 等额外模块加载6 行命令即可构建白名单式防护框架:
nft add table inet filternft add chain inet filter input { type filter hook input priority 0 ; policy drop ; }nft add rule inet filter input iifname "lo" acceptnft add rule inet filter input ct state { established, related } acceptnft add rule inet filter input tcp dport { 22, 80, 443 } ct state new acceptnft add rule inet filter input icmp type echo-request accept这套配置默认拒绝所有入站流量,只放行回环通信、已建立连接、SSH/HTTP/HTTPS 及 ping 请求,规则量比 iptables 减少约 40%,逻辑清晰无歧义。
Docker 默认操作 iptables 链,易与手动规则冲突。nftables 下有两种稳妥方案:
dockerd 时加 --iptables=false,再显式将容器网桥流量纳入 nftables,例如:nft add rule inet filter forward iifname "docker0" oifname "eth0" ct state new accept
inet nat 表,或定期运行 nft list ruleset 检查是否出现意外插入的规则nft 命令默认只影响运行时,需持久化保存:
sudo nft list ruleset > /etc/nftables.conf
sudo systemctl enable nftables
sudo nft -f /etc/nftables.conf
sudo systemctl disable --now iptables ip6tables
不复杂但容易忽略。