nf_tables 架构深度详解(内核级完整架构)

一、整体分层总架构

nf_tables 是 Netfilter 项目下一代数据包过滤/ NAT 框架 ,采用分层模块化、虚拟机化、协议统一架构,整体自上而下分为 5 层:

复制代码
用户态工具层
   ↓
Netlink 通信层
   ↓
nf_tables 内核核心层
   ↓
Netfilter 钩子挂载层
   ↓
Linux 网络协议栈 / 网卡驱动
  1. 用户态层nft 工具、libnftables 库、第三方管控程序
  2. Netlink 层:内核与用户态专用通信通道,承载规则下发、查询、事务提交
  3. nf_tables 核心层:规则解析、字节码虚拟机、表达式引擎、集合/映射、事务管理
  4. Netfilter 钩子层:复用内核原生 5 大网络钩子,作为流量接入点
  5. 网络栈层:L2/L3/L4 协议栈、网卡收发包、路由子系统

核心设计思想:抛弃 iptables 固定表链硬编码,改用「自定义表链 + 通用表达式虚拟机 + 原子事务更新」架构


二、核心数据模型架构(最核心)

nf_tables 不再像 iptables 内置 filter/nat/mangle/raw 固定表,而是完全由用户自定义 ,层级结构:
协议族 → 表(table) → 链(chain) → 规则(rule) → 表达式(expr) → 动作(verdict)

1. 协议族(Family)

架构上统一多协议,原生支持:

  • ip:IPv4
  • ip6:IPv6
  • inet同时兼容 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 基链,按优先级串行执行

五、数据包完整处理流水线

  1. 网卡驱动收包 → 进入网络协议栈
  2. 到达某 Netfilter 钩子点
  3. 触发挂载的 nf_tables 基链
  4. 内核 NFT VM 逐条执行规则字节码
  5. 表达式匹配 L2/L3/L4/ct 状态
  6. 命中后执行 verdict 动作:accept/drop/reject/jump/log/snat/dnat
  7. 放行则继续协议栈流程,丢弃则直接终止数据包

六、用户态 ↔ 内核态 通信架构

  1. 用户态
    • nft 命令行工具
    • libnftables:封装 Netlink 请求、语法解析、规则编译
  2. 通信协议
    • 基于 Netlink 专用协议 NFNL_SUBSYS_NFTABLES
  3. 交互流程
    语法解析 → 生成规则对象 → Netlink 下发内核 → 内核事务校验 → 字节码加载生效 → 返回结果

全程二进制结构化通信,比 iptables 文本解析更高效可靠。


七、iptables-nft 兼容层架构(解释你之前的警告)

1. 兼容层原理

iptables-nft 不是独立防火墙,而是翻译层

  • 你执行 iptables -A ...
  • 兼容层把 iptables 老式语法自动翻译成 nf_tables 字节码
  • 自动在内核创建 ip filterip nat 等兼容表
  • 交由原生 nf_tables 内核框架执行

2. 为什么警告 do not touch

  • ip filter 这张表是兼容层自动托管
  • 你手动用 nft 修改,会破坏兼容层规则映射
  • 下次 iptables 操作会覆盖、错乱、丢规则

3. 你要的纯原生架构

不用兼容层 → 不创建 ip/ip6 固定表 → 只自建 inet xxx 自定义表 → 系统只有一套原生 nft 规则,无兼容残留。


八、内核模块组织架构

nf_tables 采用主模块 + 插件模块拆分:

  1. 核心主模块:nf_tables.ko
  2. 协议族模块:nf_tables_inet.konf_tables_ipv4.konf_tables_ipv6.ko
  3. 功能插件:nf_tables_nat.konf_tables_ct.konf_tables_log.ko
  4. 表达式插件:各协议匹配表达式单独模块

按需加载,内核资源占用远低于 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 表硬编码 通用表达式灵活实现

十、架构总结

  1. nf_tables 是模块化、虚拟机化、协议统一、事务化的新一代 Netfilter 架构;
  2. 抛弃 iptables 固定表链硬编码,改用「表-链-规则-表达式」通用数据模型;
  3. 复用 Netfilter 5 大钩子,兼容现有网络栈;
  4. 用户态通过 Netlink 与内核事务通信,安全可靠;
  5. iptables-nft 只是语法翻译兼容层,并非独立架构,这也是你看到警告的根源。
相关推荐
来让爷抱一个7 分钟前
2026 智能体安全实战:把护栏写进SPEC,MonkeyCode 云端跑通
人工智能·安全·机器学习
sungtv25 分钟前
大型厂房钢结构施工安全生产动画聚焦哪些风险点
安全·安全生产动画
Neighbor_OldY36 分钟前
云上安全配置审计与误配置修复实战:从安全组、OSS、RAM到数据库的全栈排查复盘
大数据·运维·安全·云计算
开心大爆炸2 小时前
xrdp 连接 登录对话框输入密码后闪退
linux·运维·服务器
oushaojun22 小时前
大厂 C++ 面试:深度剖析 Linux Signal 信号机制(转)
linux
苏生Susheng3 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
曹牧3 小时前
C#:文本文件读取
服务器·前端·c#
Ruiery3 小时前
Linux 6.6内核 IOMMU 深度解析(七):DMA API 与 IOMMU 集成 — 从 dma_map_single 到 iommu_map
linux·运维·服务器
分支预测失败3 小时前
RISC-V AIA 中断架构实战:从 PLIC 到 APLIC 与 IMSIC 的迁移
linux·后端
GeW3 小时前
RHCE学习拿证计划:锁定核心考点,实现备考效率最大化
linux