惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
爱范儿
爱范儿
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
B
Blog RSS Feed
博客园 - 聂微东
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
WordPress大学
WordPress大学
Scott Helme
Scott Helme
AI
AI
S
Security Affairs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
AWS News Blog
AWS News Blog
T
Threatpost
Cyberwarzone
Cyberwarzone
www.infosecurity-magazine.com
www.infosecurity-magazine.com
U
Unit 42
V
Vulnerabilities – Threatpost
J
Java Code Geeks
博客园 - Franky
月光博客
月光博客
Blog — PlanetScale
Blog — PlanetScale
NISL@THU
NISL@THU
D
Docker
小众软件
小众软件
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
Forbes - Security
Forbes - Security
量子位
PCI Perspectives
PCI Perspectives
美团技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
腾讯CDC
P
Proofpoint News Feed
S
Security @ Cisco Blogs
G
Google Developers Blog
C
Cisco Blogs

HelloDog

字节跳动和TikTok内推 新加坡女佣申请中国签证 新加坡信用卡cashback和miles的使用心得 关于AI的基础知识和第三方AI应用 新加坡政府小学报名和学区房义工的选择分析 新加坡幼儿园和托儿所的报名准备经验分享 新加坡政府学校和国际学校的上学路径分析 新加坡聘请女佣的流程和注意事项 AdGuard过滤规则分享 新加坡宽带套餐选择推荐和路由器配置经验分享 MacBook从mac intel升级到apple silicon 使用GitHub和Hexo搭建免费静态Blog macOS使用iterm2启用rz与sz功能 Git常用命令和Git团队使用规范指南 新加坡保险和理财规划 新加坡生娃和养娃的重要时间线记录 新加坡申请LTVP的流程介绍 MySQL使用mysqldump导出和导入数据常用命令 新加坡生小孩的医院和流程费用介绍
nftables代替iptables的新一代防火墙配置指南
wsgzao · 2025-11-23 · via HelloDog

前言

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 防火墙配置指南:从入门到高级