nftables代替iptables的新一代防火墙配置指南
前言
nftables 是 Linux 防火墙子系统的框架(从 Linux 3.13 开始引入),它用于替代旧的 iptables/ip6tables/arptables/ebtables 等工具,提供更统一、更灵活、更高效的防火墙规则管理方式。
nftables 提供了强大的防火墙管理能力,同时简化了配置。对于初学者,掌握常用的 “增删改查” 命令、表链规则逻辑和持久化操作基本就能满足日常需求。在实际生产环境中,你可以根据需求编写更复杂的规则脚本来实现流量控制、NAT 转发、端口映射等功能。
相比于传统的 iptables:
- 规则更简洁:nftables 用一条规则可以处理多个协议字段,而 iptables 往往需要多条规则。
- 可读性更好:nftables 使用类似编程语言的写法,支持批量编辑。
- 性能更佳:规则的执行更高效,占用更少的系统资源。
更多信息也可以直接访问nftables官方wiki
http://wiki.nftables.org/
更新历史
2025年11月23日 - 初稿
阅读原文 - https://wsgzao.github.io/post/nftables/
nftables安装
不同发行版安装方式略有差异
1 | # Debian / Ubuntu 系列: |
安装完成后,可以启用服务并设置开机启动
1 | # 启动服务 |
nftables基础概念
Netfilter & nftables
- Netfilter 是 Linux 内核中的网络数据包处理子系统,nftables 则是其新一代的用户态工具,用来管理防火墙和 NAT 规则。
- 它替代了传统的 iptables、ip6tables、arptables、ebtables,提供统一的配置方式和更灵活的语法。
要想理解 nftables,需要了解三个核心概念:表(table)、链(chain) 和 规则(rule)。
Table(表)
用于逻辑分组规则。类似 iptables 中的 filter、nat 表。
nftables 中可以自己命名表,比如 inet filter、ip nat 等。
Chain(链)
每个表里可以包含多个链。链中定义了处理数据包的流程(例如 input, forward, output 等)。
也可以自定义用户链,用来按需编排复杂逻辑。
Rule(规则)
具体的防火墙匹配逻辑和处理动作都写在规则中,挂载在某个表的某条链里。
动作可以是:accept, drop, reject, log, redirect, masquerade 等。
常见命令行
- sudo nft add table
:创建表 - sudo nft add chain
{ … }:创建链,指定类型、hook、priority、policy 等 - sudo nft add rule
:添加规则 - sudo nft list ruleset:查看当前完整配置
- sudo nft delete rule/chain/table …:删除对应对象
- sudo nft flush ruleset:清空所有规则(谨慎操作)
协议族 (family)
- ip(仅 IPv4),ip6(仅 IPv6),inet(同时管理 IPv4/IPv6),arp,bridge 等。
- 一般推荐使用 inet 统一管理 IPv4/IPv6 防火墙规则(但NAT 通常只能使用 ip 或 ip6)。
常见 hook
- prerouting:数据包刚进来,还没决定路由
- input:发往本机的数据包
- forward:要转发给其他目的地的数据包
- output:本机发出的数据包
- postrouting:数据包即将离开本机,常用于 SNAT
- ingress:更早阶段的过滤,在协议栈处理之前
默认策略 (policy)
- accept:默认放行
- drop:默认丢弃
- 常用做法:在关键链(如 input、forward 等)上设置 policy drop,然后再加特定的放行规则(白名单式)
优先级 (priority)
- 每个 hook 可以设置 priority,以决定规则生效的先后顺序。
- 常见做法:
- prerouting(DNAT)常用 priority -100
- filter(如 input、forward)常用 priority 0
- postrouting(SNAT)常用 priority 100
nftables 的基本操作示例
下面是一些常见的 nftables 命令操作示例,帮助快速上手。
1 | # 查看当前配置 |
该命令含义:
type filter:表明这是一个过滤链。
hook input:该链挂载在 “input” 钩子上,处理进来(进入本机)数据包。
priority 0:优先级,数值越小,越先处理。
常见的 hook:
input:处理发往本机的数据包。
forward:处理转发数据包(主机作为路由器或转发流量时)。
output:处理本机发送的数据包。
prerouting / postrouting:常用于 NAT 场景。
添加规则
在链中添加规则,语法一般类似:
1 | sudo nft add rule <协议簇> <表名> <链名> <匹配条件> <动作> |
修改 / 删除 规则
修改规则 一般先删除再添加。nftables 也支持一些原子操作,比如直接替换,但对小白而言,删除+添加更简单。
1 | 列出规则行号 |
持久化
编辑完规则后,如果你想让它们在系统重启后仍然生效,需要持久化配置。
1 | 有些发行版会在启动时自动加载 /etc/nftables.conf 中的内容。可以将规则直接写进这个文件。 |
nft 命令行实例小结
下面汇总一下常见的命令及含义:
| 命令 | 作用 |
|---|---|
sudo nft list ruleset |
列出当前 nftables 的全部配置 |
sudo nft add table inet mytable |
创建名为 mytable 的表 (协议簇 inet) |
sudo nft add chain inet mytable mychain {...} |
在 mytable 中创建一条链 (指定 hook & priority) |
sudo nft add rule inet mytable mychain ... |
在 mychain 中添加规则 |
sudo nft delete rule inet mytable mychain handle X |
删除句柄为 X 的规则 |
sudo nft flush chain inet mytable mychain |
清空 mychain 链中所有规则 |
sudo nft flush table inet mytable |
清空 mytable 表中所有规则 |
sudo nft delete chain inet mytable mychain |
删除 mychain 链 |
sudo nft delete table inet mytable |
删除 mytable 表 |
更多示例与技巧
IPv4 NAT 示例
1 | sudo nft add table ip nat |
IPv6 NAT 示例
1 | nft add table inet nat |
记录日志
有时需要排查防火墙是否匹配到某条规则,可使用 log 动作:
1 | sudo nft add rule inet mytable mychain tcp dport 80 log prefix "HTTP_PORT80: " drop |
简要工作流程图
1 | flowchart LR |
当数据包到达内核后,会根据不同阶段(hook)进入相应的 nftables 链匹配规则,并执行对应的动作。
常见问题
iptables 与 nftables 冲突吗?
大多数发行版已经将 iptables 的后端替换成了 nftables,但仍保留 iptables-nft 兼容包。如果你使用了传统的 iptables 命令,实际上也在调用 nftables 后端。
建议统一使用 nftables 命令管理,以免混淆。
如何调试规则?
- 使用 sudo nft list ruleset 确认最终规则
- dmesg 或 journalctl -k 查看日志
- 同时注意网络接口名、IP 地址是否正确;经常出现 NAT 链类型不匹配、priority 值冲突、IPv4/IPv6 混淆等问题
发行版文档
部分发行版可能对 nftables 做了额外封装(如 Debian/Ubuntu 的 nftables 服务、Red Hat 系的 nftables.conf 位置等),请查看对应发行版的官方指南。
为什么规则不生效或重启后丢失?
需要确认服务是否开启并在开机启动,以及是否将规则持久化保存到 /etc/nftables.conf 等对应文件里。
总结
- nftables 的基本结构始终是:表(table) → 链(chain) → 规则(rule)。
- 应用场景决定是做 过滤(type filter) 还是 NAT(type nat),以及要挂载到哪个 hook(如 input、prerouting、postrouting、ingress 等)。
- 常见匹配包括源/目的 IP、端口、协议、接口名、连接状态 (ct state)、MAC 地址等;动作可为 accept, drop, reject, snat, dnat, masquerade, log 等。
- 高级用法如 set(批量黑白名单)、map(值→动作映射)、log(记录日志)、limit/meter(限速或计数)能够减少重复规则,提高可读性和性能。
- 注意发行版、内核版本、Docker/k8s 等环境差异,以免默认配置或自动生成的规则与手动写的规则冲突。也要关注持久化方式和服务启动脚本的配置。

