前言

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
2
3
4
5
6
7
8
9
10
11
# Debian / Ubuntu 系列:
sudo apt-get update
sudo apt-get install nftables

# CentOS / RHEL 系列:
sudo yum install nftables

# Fedora:
sudo dnf install nftables


安装完成后,可以启用服务并设置开机启动

1
2
3
4
5
6
7
8
9
# 启动服务
sudo systemctl start nftables

# 查看 nftables 状态
sudo systemctl status nftables

# 设置开机启动
sudo systemctl enable nftables

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
2
3
4
5
6
7
8
9
10
11
12
13
# 查看当前配置
sudo nft list ruleset

# 该命令会列出当前系统已生效的所有 nftables 规则集,包括表、链、规则等内容。

# 新建表
sudo nft add table inet mytable

# 这里示例了在 “inet” 协议簇中新建一个名为 mytable 的表。
# “inet” 协议簇表示同时支持 IPv4 和 IPv6,你也可以使用 ip, ip6, arp, bridge 等协议簇。

# 新建链
sudo nft add chain inet mytable mychain { type filter hook input priority 0\; }

该命令含义:
type filter:表明这是一个过滤链。
hook input:该链挂载在 “input” 钩子上,处理进来(进入本机)数据包。
priority 0:优先级,数值越小,越先处理。

常见的 hook:
input:处理发往本机的数据包。
forward:处理转发数据包(主机作为路由器或转发流量时)。
output:处理本机发送的数据包。
prerouting / postrouting:常用于 NAT 场景。

添加规则
在链中添加规则,语法一般类似:

1
2
3
4
5
6
7
8
9
10
sudo nft add rule <协议簇> <表名> <链名> <匹配条件> <动作>

示例:允许 SSH 连接
sudo nft add rule inet mytable mychain tcp dport ssh accept

允许 TCP 端口为 22(ssh) 的连接通过。

示例:丢弃某个 IP 地址的访问
sudo nft add rule inet mytable mychain ip saddr 192.168.1.100 drop
匹配源 IP 为 192.168.1.100 的数据包,直接丢弃(drop)。

修改 / 删除 规则

修改规则 一般先删除再添加。nftables 也支持一些原子操作,比如直接替换,但对小白而言,删除+添加更简单。

1
2
3
4
5
6
7
8
9
10
11
列出规则行号
sudo nft list chain inet mytable mychain -a

-a 参数用于显示规则的句柄(handle),帮助我们精确定位规则。
删除规则

通过句柄删除
sudo nft delete rule inet mytable mychain handle <句柄号>

先通过列出规则的句柄,然后再用该句柄删除想要的规则。

持久化

编辑完规则后,如果你想让它们在系统重启后仍然生效,需要持久化配置。

1
2
3
4
5
有些发行版会在启动时自动加载 /etc/nftables.conf 中的内容。可以将规则直接写进这个文件。
也可通过命令行导出当前规则到 nftables.conf:
sudo nft list ruleset > /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
2
3
4
5
6
7
8
9
sudo nft add table ip nat
sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0\; }
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100\; }

# 例如:将所有发往 192.168.0.100:80 的流量重定向到 8080
sudo nft add rule ip nat prerouting tcp dport 80 redirect to 8080

# 例如:源地址伪装
sudo nft add rule ip nat postrouting ip saddr 192.168.0.0/24 oif "eth0" masquerade

IPv6 NAT 示例

1
2
3
4
5
6
7
8
9
nft add table inet nat
nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule inet nat postrouting oif eth0 masquerade

# 将当前规则输出到配置文件
nft list ruleset > /etc/nftables.conf
# 启用并立即启动nftables服务(重启后自动加载规则)
systemctl enable nftables --now

记录日志

有时需要排查防火墙是否匹配到某条规则,可使用 log 动作:

1
2
sudo nft add rule inet mytable mychain tcp dport 80 log prefix "HTTP_PORT80: " drop

简要工作流程图

1
2
3
4
5
6
flowchart LR
A[网络数据包] --> B[内核 netfilter]
B --> C[匹配 nftables hook]
C --> D[查找对应表 & 链]
D --> E[规则匹配 / 执行动作]
E --> F[accept, drop, log等结果]

当数据包到达内核后,会根据不同阶段(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 等对应文件里。

总结

  1. nftables 的基本结构始终是:表(table) → 链(chain) → 规则(rule)。
  2. 应用场景决定是做 过滤(type filter) 还是 NAT(type nat),以及要挂载到哪个 hook(如 input、prerouting、postrouting、ingress 等)。
  3. 常见匹配包括源/目的 IP、端口、协议、接口名、连接状态 (ct state)、MAC 地址等;动作可为 accept, drop, reject, snat, dnat, masquerade, log 等。
  4. 高级用法如 set(批量黑白名单)、map(值→动作映射)、log(记录日志)、limit/meter(限速或计数)能够减少重复规则,提高可读性和性能。
  5. 注意发行版、内核版本、Docker/k8s 等环境差异,以免默认配置或自动生成的规则与手动写的规则冲突。也要关注持久化方式和服务启动脚本的配置。

参考文档

nftables官方wiki

nftables 入门:简洁高效的 Linux 防火墙管理

面向实战的 nftables 防火墙配置指南:从入门到高级

文章目录
  1. 1. 前言
  2. 2. 更新历史
  3. 3. nftables安装
  4. 4. nftables基础概念
    1. 4.1. nftables 的基本操作示例
    2. 4.2. nft 命令行实例小结
  5. 5. 更多示例与技巧
  6. 6. 常见问题
  7. 7. 总结
  8. 8. 参考文档