nf_tables 是 Linux 内核自 3.13 版本(2014年1月) 引入的新一代网络过滤框架,作为 Netfilter 子系统的核心组件,旨在替代传统的 iptables/ip6tables/arptables/ebtables 工具链,提供更高效、灵活、统一的网络数据包处理能力。它通过内核态虚拟机(VM)执行规则,支持原子化规则更新,大幅提升性能与可维护性。
一、核心定位与设计理念
1.1 解决的核心问题
传统 iptables 存在四大痛点:
- 碎片化管理:IPv4/IPv6/ARP/桥接过滤需独立工具(iptables/ip6tables/arptables/ebtables)
- 性能瓶颈:规则线性匹配(O(n)),规则数量增多时性能急剧下降
- 内核模块冗余:依赖多个独立内核模块(ip_tables、ip6_tables 等),维护复杂
- 规则更新低效:修改规则需全量替换整条链,高负载环境可能引发短暂中断
1.2 设计哲学
nf_tables 的核心设计目标:
- 统一框架:单一套工具管理所有网络协议族的过滤规则
- 高性能:通过优化数据结构(集合、映射)实现 O(1) 时间复杂度匹配
- 模块化:内核态虚拟机执行规则,支持动态扩展功能
- 原子更新:规则集修改无需重启服务,避免中断网络连接
二、内核架构与核心组件
2.1 三层核心架构
nf_tables 采用清晰的三层结构,完全兼容 Netfilter 钩子机制:
| 层级 | 作用 | 关键特性 |
|---|---|---|
| 表(Tables) | 规则的顶层容器,与协议族绑定 | 支持 inet(同时处理 IPv4/IPv6)、ip、ip6、arp、bridge 等协议族 |
| 链(Chains) | 规则的执行容器,分为基链和常规链 | 基链绑定 Netfilter 钩子点(如 input、forward),常规链用于规则组织 |
| 规则(Rules) | 数据包匹配条件与处理动作 | 支持复杂表达式、集合匹配、映射查询等高级功能 |
2.2 关键内核组件
- nf_tables 内核模块:单内核模块替代传统多模块,减少内存占用
- Netlink API:用户态与内核态通信接口,支持原子化规则更新
- 内核虚拟机(VM):将规则集编译为字节码执行,提升匹配效率
- 表达式系统:模块化设计,支持动态添加匹配条件与动作
- 集合(Sets)与映射(Maps):高性能数据结构,实现 O(1) 匹配
2.3 Netfilter 钩子集成
nf_tables 完全复用 Netfilter 的五大钩子点,确保与现有网络协议栈兼容:
- PREROUTING:数据包进入内核后,路由决策前
- INPUT:数据包目标为本机时
- FORWARD:数据包转发时
- OUTPUT:本机生成的数据包发送前
- POSTROUTING:路由决策后,数据包发送到网卡前
三、核心功能与技术优势
3.1 统一协议族管理
-
inet 协议族 :创建一个表即可同时处理 IPv4 和 IPv6 流量,无需分别配置
bashnft add table inet my_firewall # 同时管理 IPv4/IPv6 -
支持 arp、bridge、netdev 等协议族,实现全网络栈过滤
3.2 高性能规则处理
-
集合(Sets) :替代传统 ipset,支持范围匹配、位图、哈希等多种类型
bashnft add set inet my_firewall allowed_ports { type inet_service; elements = { 22, 80, 443 } } nft add rule inet my_firewall input tcp dport @allowed_ports accept -
映射(Maps) :实现键值对匹配,支持复杂策略路由
bashnft add map inet my_firewall port_to_chain { type inet_service : chain; elements = { 22 : ssh_chain, 80 : web_chain } } nft add rule inet my_firewall input tcp dport map @port_to_chain -
规则优化:内核自动合并相似规则,减少匹配次数
3.3 原子化规则更新
- 支持批量添加/删除规则,修改时无需重启服务
- 事务性操作:要么全部成功,要么全部失败,避免规则集不一致
- 增量更新:只修改变化的部分,大幅提升大规则集的更新效率
3.4 强大的表达式系统
-
条件匹配:支持任意组合的匹配条件(协议、端口、IP、状态、接口等)
-
动作丰富:accept、drop、reject、jump、goto、log、nat 等,支持自定义动作
-
状态跟踪 :内置连接跟踪(conntrack)支持,轻松实现状态过滤
bashnft add rule inet my_firewall input ct state { established, related } accept
3.5 灵活的规则组织
- 无预定义表和链:用户可自定义任意数量的表和链,实现规则隔离
- 链跳转:支持 jump(可返回)和 goto(不可返回),优化规则结构
- 命名空间:通过表名实现规则集的逻辑隔离,便于管理复杂环境
四、与 iptables 的核心对比
| 特性 | iptables(legacy) | nf_tables | 优势说明 |
|---|---|---|---|
| 内核模块 | 多模块(ip_tables、ip6_tables 等) | 单模块(nf_tables) | 减少内存占用,简化维护 |
| 协议管理 | IPv4/IPv6/ARP 分离 | 统一管理(inet 协议族) | 配置更简洁,减少重复工作 |
| 规则匹配 | 线性链表(O(n)) | 集合/映射(O(1)) | 规则数量越多,性能优势越明显 |
| 规则更新 | 全量替换链 | 原子增量更新 | 无中断,适合高负载环境 |
| 语法风格 | 过程式(命令式) | 声明式 | 更易读、易维护,支持复杂规则 |
| 扩展性 | 有限(依赖内核模块) | 高(表达式系统) | 支持动态添加功能,无需修改内核 |
| 兼容性 | 传统脚本兼容 | 支持 iptables-nft 兼容层 | 平滑迁移,保护现有投资 |
五、基础使用与配置示例
5.1 核心操作流程
-
创建表 :
bashnft add table inet my_fw # 创建 inet 协议族表 -
创建基链 :
bashnft add chain inet my_fw input { type filter hook input priority 0; policy drop; } nft add chain inet my_fw forward { type filter hook forward priority 0; policy drop; } nft add chain inet my_fw output { type filter hook output priority 0; policy accept; } -
添加规则 :
bash# 放行回环接口 nft add rule inet my_fw input iifname lo accept # 放行已建立/相关连接 nft add rule inet my_fw input ct state { established, related } accept # 放行 SSH 端口 nft add rule inet my_fw input tcp dport 22 accept # 放行 ICMP 回显请求 nft add rule inet my_fw input icmp type echo-request accept -
保存规则 :
bashnft list ruleset > /etc/nftables.conf -
启用开机自启 :
bashsystemctl enable --now nftables
5.2 常用管理命令
| 命令 | 功能 |
|---|---|
nft list tables |
列出所有表 |
nft list table <表名> |
列出指定表的所有链和规则 |
nft flush chain <表名> <链名> |
清空指定链的规则 |
nft delete rule <表名> <链名> <位置> |
删除指定位置的规则 |
nft flush ruleset |
清空所有规则 |
六、内核配置与部署要点
6.1 内核编译选项
确保内核启用以下配置(通常默认启用):
CONFIG_NF_TABLES=y
CONFIG_NF_TABLES_INET=y # 支持 inet 协议族
CONFIG_NF_TABLES_IPV4=y
CONFIG_NF_TABLES_IPV6=y
CONFIG_NF_TABLES_ARP=y
CONFIG_NF_TABLES_BRIDGE=y
CONFIG_NF_CONNTRACK=y # 连接跟踪支持
Debian 13 查看内核编译:
bash
cat /boot/config-6.12.57+deb13-cloud-arm64 |grep CONFIG_NF_
6.2 系统部署建议
-
禁用 iptables 相关服务 ,避免规则冲突:
bashsystemctl stop iptables ip6tables firewalld systemctl disable iptables ip6tables firewalld -
删除 iptables-nft 兼容表 ,消除 "do not touch!" 警告:
bashnft delete table ip filter nft delete table ip6 filter -
使用原生 nft 规则 ,避免创建
ip filter等兼容表名 -
定期备份规则集,确保系统重启后规则不丢失
七、总结与未来展望
nf_tables 作为 Linux 内核网络过滤的未来方向,已经成为主流发行版的默认选择(如 RHEL 8+、Ubuntu 20.04+)。它通过统一框架、高性能匹配、原子更新等特性,解决了传统 iptables 的诸多痛点,同时保持对 Netfilter 钩子机制的完全兼容,为用户提供了更强大、更灵活的网络安全管理能力。
随着内核版本的不断更新,nf_tables 持续引入新功能(如 flowtable 加速、更复杂的表达式支持),进一步巩固其在 Linux 防火墙领域的主导地位。对于需要构建高性能、可扩展网络安全架构的用户,迁移到 nftables 是必然趋势。