跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何利用Nftables替代Iptables实现更高效的防火墙规则

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
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 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 原生结构优势。

相关文章