nftables 入门:简洁高效的 Linux 防火墙管理
nftables 基础学习笔记
1. 什么是 nftables
nftables 是 Linux 防火墙子系统的框架(从 Linux 3.13 开始引入),它用于替代旧的 iptables/ip6tables/arptables/ebtables 等工具,提供更统一、更灵活、更高效的防火墙规则管理方式。
相比于传统的 iptables:
- 规则更简洁:nftables 用一条规则可以处理多个协议字段,而 iptables 往往需要多条规则。
- 可读性更好:nftables 使用类似编程语言的写法,支持批量编辑。
- 性能更佳:规则的执行更高效,占用更少的系统资源。
2. 安装与启用
2.1 安装
不同发行版安装方式略有差异,常见的:
- Debian / Ubuntu 系列:
sudo apt-get update sudo apt-get install nftables
- CentOS / RHEL 系列:
sudo yum install nftables
- Fedora:
sudo dnf install nftables
2.2 启动与开机自启
安装完成后,可以启用服务并设置开机启动:
# 启动服务
sudo systemctl start nftables
# 查看 nftables 状态
sudo systemctl status nftables
# 设置开机启动
sudo systemctl enable nftables
3. 基础概念
要想理解 nftables,需要了解三个核心概念:表(table)、链(chain) 和 规则(rule)。
-
Table(表)
- 用于逻辑分组规则。类似 iptables 中的 filter、nat 表。
- nftables 中可以自己命名表,比如
inet filter
、ip nat
等。
-
Chain(链)
- 每个表里可以包含多个链。链中定义了处理数据包的流程(例如
input
,forward
,output
等)。 - 也可以自定义用户链,用来按需编排复杂逻辑。
- 每个表里可以包含多个链。链中定义了处理数据包的流程(例如
-
Rule(规则)
- 具体的防火墙匹配逻辑和处理动作都写在规则中,挂载在某个表的某条链里。
- 动作可以是:
accept
,drop
,reject
,log
,redirect
,masquerade
等。
4. nftables 的基本操作示例
下面是一些常见的 nftables 命令操作示例,帮助快速上手。
4.1 查看当前配置
sudo nft list ruleset
- 该命令会列出当前系统已生效的所有 nftables 规则集,包括表、链、规则等内容。
4.2 新建表与链
4.2.1 新建表
sudo nft add table inet mytable
- 这里示例了在 “inet” 协议簇中新建一个名为
mytable
的表。 - “inet” 协议簇表示同时支持 IPv4 和 IPv6,你也可以使用
ip
,ip6
,arp
,bridge
等协议簇。
4.2.2 新建链
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 场景。
4.3 添加规则
在链中添加规则,语法一般类似:
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)。
4.4 修改 / 删除 规则
- 修改规则 一般先删除再添加。nftables 也支持一些原子操作,比如直接替换,但对小白而言,删除+添加更简单。
-
列出规则行号
sudo nft list chain inet mytable mychain -a
-a
参数用于显示规则的句柄(handle),帮助我们精确定位规则。
-
删除规则
# 通过句柄删除 sudo nft delete rule inet mytable mychain handle <句柄号>
- 先通过列出规则的句柄,然后再用该句柄删除想要的规则。
4.5 持久化
编辑完规则后,如果你想让它们在系统重启后仍然生效,需要持久化配置。
- 有些发行版会在启动时自动加载
/etc/nftables.conf
中的内容。可以将规则直接写进这个文件。 - 也可通过命令行导出当前规则到
nftables.conf
:sudo nft list ruleset > /etc/nftables.conf
- 重启后,系统会自动读取并应用其中的规则。
5. 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 表 |
6. 更多示例与技巧
6.1 NAT 示例
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
6.2 记录日志(log)
有时需要排查防火墙是否匹配到某条规则,可使用 log
动作:
sudo nft add rule inet mytable mychain tcp dport 80 log prefix "HTTP_PORT80: " drop
## 7. 简要工作流程图
```mermaid
flowchart LR
A[网络数据包] --> B[内核 netfilter]
B --> C[匹配 nftables hook]
C --> D[查找对应表 & 链]
D --> E[规则匹配 / 执行动作]
E --> F[accept, drop, log等结果]
- 当数据包到达内核后,会根据不同阶段(hook)进入相应的 nftables 链匹配规则,并执行对应的动作。
8. 常见问题
-
iptables 与 nftables 冲突吗?
- 大多数发行版已经将 iptables 的后端替换成了 nftables,但仍保留
iptables-nft
兼容包。如果你使用了传统的 iptables 命令,实际上也在调用 nftables 后端。 - 建议统一使用 nftables 命令管理,以免混淆。
- 大多数发行版已经将 iptables 的后端替换成了 nftables,但仍保留
-
如何调试规则?
- 建议先使用
sudo nft list ruleset
查看规则是否如预期; - 再检查系统日志、
dmesg
、或者使用log
动作排查是否匹配到规则。
- 建议先使用
-
为什么规则不生效或重启后丢失?
- 需要确认服务是否开启并在开机启动,以及是否将规则持久化保存到
/etc/nftables.conf
等对应文件里。
- 需要确认服务是否开启并在开机启动,以及是否将规则持久化保存到
9. 结语
nftables 提供了强大的防火墙管理能力,同时简化了配置。对于初学者,掌握常用的 “增删改查” 命令、表链规则逻辑和持久化操作基本就能满足日常需求。在实际生产环境中,你可以根据需求编写更复杂的规则脚本来实现流量控制、NAT 转发、端口映射等功能。
建议进一步学习:
- 官方文档 (英文)
- [各发行版的 nftables 手册]
- 关于 nft 语言的高级用法,包含映射(maps)、链式多重条件、计数器(counter)等。