一、整体分层总架构
nf_tables 是 Netfilter 项目下一代数据包过滤/ NAT 框架 ,采用分层模块化、虚拟机化、协议统一架构,整体自上而下分为 5 层:
用户态工具层
↓
Netlink 通信层
↓
nf_tables 内核核心层
↓
Netfilter 钩子挂载层
↓
Linux 网络协议栈 / 网卡驱动
- 用户态层 :
nft工具、libnftables 库、第三方管控程序 - Netlink 层:内核与用户态专用通信通道,承载规则下发、查询、事务提交
- nf_tables 核心层:规则解析、字节码虚拟机、表达式引擎、集合/映射、事务管理
- Netfilter 钩子层:复用内核原生 5 大网络钩子,作为流量接入点
- 网络栈层:L2/L3/L4 协议栈、网卡收发包、路由子系统
核心设计思想:抛弃 iptables 固定表链硬编码,改用「自定义表链 + 通用表达式虚拟机 + 原子事务更新」架构。
二、核心数据模型架构(最核心)
nf_tables 不再像 iptables 内置 filter/nat/mangle/raw 固定表,而是完全由用户自定义 ,层级结构:
协议族 → 表(table) → 链(chain) → 规则(rule) → 表达式(expr) → 动作(verdict)
1. 协议族(Family)
架构上统一多协议,原生支持:
ip:IPv4ip6:IPv6inet:同时兼容 IPv4/IPv6(nft 最大优势)arp:ARP 层过滤bridge:二层桥接过滤netdev:网卡入口直接过滤(旁路、高性能)
2. 表 Table
- 最高级容器,归属某一个协议族
- 逻辑隔离规则集,可创建任意多自定义表
- 无固定业务含义(不像 iptables 强制 filter/nat)
3. 链 Chain 分两类
(1)基链 Base Chain
绑定 Netfilter 钩子 ,是流量进入 nf_tables 的入口
定义三要素:
- 挂载钩子点(input/forward/output/prerouting/postrouting)
- 执行优先级(priority)
- 默认策略(accept/drop)
(2)普通链 Regular Chain
- 不挂钩子,仅用于规则拆分、跳转复用
- 类似函数调用,通过
jump/goto被其他链引用
4. 规则 Rule
由多个匹配表达式 + 最终判决动作 组成。
一条规则:匹配条件1 + 匹配条件2 + ... → 执行动作
5. 表达式 Expression 引擎(架构灵魂)
nf_tables 把所有匹配、取值、运算 全部抽象为模块化表达式:
- 链路层:网卡名、VLAN
- 网络层:源/目的IP、协议版本
- 传输层:端口、TCP 标志
- 连接跟踪:ct state
- 元数据:时间、接口、包长度
- 逻辑运算:and/or/xor、区间比较
特点:可动态扩展,内核不用改核心代码就能加新匹配能力。
6. 集合 Set / 映射 Map 子系统
架构内置高性能数据结构,替代 iptables + ipset 组合:
- Set:无序集合,IP/端口/网段 快速匹配(O(1))
- Map :键值映射,如「端口→跳转链」「IP→限速策略」
支持:哈希、位图、区间、超时、动态元素。
三、nf_tables 内核核心子系统架构
内核核心由 6 大子系统构成,彼此解耦:
1. 规则解析 & 字节码虚拟机(NFT VM)
- 用户态规则文本 → 编译为 nf_tables 内部字节码
- 内核虚拟机解释执行字节码,而非 iptables 那种逐行遍历匹配
- 规则可预编译、优化合并,大规则集性能远高于 iptables
2. 表达式管理子系统
- 所有 match/target 都以插件式表达式注册
- 内核维护表达式注册表,按需加载调用
- 新增业务特征只需开发独立表达式模块,不改动主框架
3. 事务 & 原子更新子系统
这是架构重大升级:
- 规则修改采用事务机制:批量提交、要么全生效、要么全回滚
- 支持增量更新,不用清空整条链
- 高并发/高吞吐场景下无断流、无规则瞬态错乱(iptables 做不到)
4. 集合/映射子系统
独立内存管理:
- 支持静态配置、动态添加删除
- 内核自动选择最优查找算法(哈希/二叉树/位图)
- 支持超时自动过期,适合动态黑名单
5. 连接跟踪集成子系统
深度复用内核 nf_conntrack:
- 原生支持状态检测:new/established/related/invalid
- 不用像 iptables 那样硬编码依赖,架构上松耦合
6. NAT & 路由子系统
- NAT 不再是独立固定表,由表达式+动作灵活实现
- 支持 SNAT/DNAT/端口映射、目的地址改写
- 可与路由策略无缝联动
四、与 Netfilter 钩子集成架构
nf_tables 完全复用 Linux 内核 Netfilter 5 大标准钩子,不新增钩子,兼容性极强:
| 钩子点 | 作用场景 |
|---|---|
| PREROUTING | 数据包入栈后、路由前 |
| INPUT | 目的地是本机的数据包 |
| FORWARD | 本机转发的数据包 |
| OUTPUT | 本机主动发出的数据包 |
| POSTROUTING | 路由后、离开网卡前 |
架构关键点:
- 基链就是把 nft 链挂载到某个钩子
- 可设置
priority优先级,和其他 Netfilter 模块(如路由、QoS)排序执行 - 同钩子下可挂多条 nft 基链,按优先级串行执行
五、数据包完整处理流水线
- 网卡驱动收包 → 进入网络协议栈
- 到达某 Netfilter 钩子点
- 触发挂载的 nf_tables 基链
- 内核 NFT VM 逐条执行规则字节码
- 表达式匹配 L2/L3/L4/ct 状态
- 命中后执行 verdict 动作:accept/drop/reject/jump/log/snat/dnat
- 放行则继续协议栈流程,丢弃则直接终止数据包
六、用户态 ↔ 内核态 通信架构
- 用户态
nft命令行工具- libnftables:封装 Netlink 请求、语法解析、规则编译
- 通信协议
- 基于 Netlink 专用协议
NFNL_SUBSYS_NFTABLES
- 基于 Netlink 专用协议
- 交互流程
语法解析 → 生成规则对象 → Netlink 下发内核 → 内核事务校验 → 字节码加载生效 → 返回结果
全程二进制结构化通信,比 iptables 文本解析更高效可靠。
七、iptables-nft 兼容层架构(解释你之前的警告)
1. 兼容层原理
iptables-nft 不是独立防火墙,而是翻译层:
- 你执行
iptables -A ... - 兼容层把 iptables 老式语法自动翻译成 nf_tables 字节码
- 自动在内核创建
ip filter、ip nat等兼容表 - 交由原生 nf_tables 内核框架执行
2. 为什么警告 do not touch
ip filter这张表是兼容层自动托管的- 你手动用
nft修改,会破坏兼容层规则映射 - 下次 iptables 操作会覆盖、错乱、丢规则
3. 你要的纯原生架构
不用兼容层 → 不创建 ip/ip6 固定表 → 只自建 inet xxx 自定义表 → 系统只有一套原生 nft 规则,无兼容残留。
八、内核模块组织架构
nf_tables 采用主模块 + 插件模块拆分:
- 核心主模块:
nf_tables.ko - 协议族模块:
nf_tables_inet.ko、nf_tables_ipv4.ko、nf_tables_ipv6.ko - 功能插件:
nf_tables_nat.ko、nf_tables_ct.ko、nf_tables_log.ko - 表达式插件:各协议匹配表达式单独模块
按需加载,内核资源占用远低于 iptables 一堆独立 ip_tables 模块。
九、架构本质对比:nf_tables vs iptables-legacy
| 维度 | iptables-legacy 架构 | nf_tables 架构 |
|---|---|---|
| 表链 | 内核硬编码固定表(filter/nat) | 完全自定义表链,无内置约束 |
| 规则执行 | 线性遍历 O(n) | 虚拟机字节码 + 集合哈希 O(1) |
| 协议支持 | IPv4/IPv6/ARP 三套独立工具 | inet 统一管理双栈 |
| 规则更新 | 全量清空重写,无事务 | 原子事务、增量更新 |
| 扩展能力 | 新增 match/target 需改内核 | 插件式表达式,动态扩展 |
| NAT 实现 | 独立 NAT 表硬编码 | 通用表达式灵活实现 |
十、架构总结
- nf_tables 是模块化、虚拟机化、协议统一、事务化的新一代 Netfilter 架构;
- 抛弃 iptables 固定表链硬编码,改用「表-链-规则-表达式」通用数据模型;
- 复用 Netfilter 5 大钩子,兼容现有网络栈;
- 用户态通过 Netlink 与内核事务通信,安全可靠;
- iptables-nft 只是语法翻译兼容层,并非独立架构,这也是你看到警告的根源。