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 小时前
企业软件供应链安全优选:Gitee CodePecker SCA核心能力与选型参考
安全·gitee
黎阳之光7 小时前
黎阳之光:视频孪生智慧厂网一体化解决方案|污水处理全场景智能化升级
大数据·人工智能·物联网·安全·数字孪生
LN花开富贵7 小时前
Ubuntu aarch64 架构安装 NoMachine 远程控制 避坑与实战
linux·运维·笔记·学习·ubuntu·嵌入式
取经蜗牛7 小时前
Windows 11 WSL + Ubuntu 24.04 安装指南
linux·windows·ubuntu
杨云龙UP7 小时前
Oracle RAC/ODA环境下如何准确查询PDB表空间已分配大小?一次说清Oracle表空间逻辑大小和ASM三副本实际占用_2026-05-19
linux·运维·数据库·sql·oracle·ffmpeg
东湖山上7 小时前
GTAC: A Generative Transformer for Approximate Circuits
服务器·人工智能·深度学习·transformer·gpu算力
2023自学中7 小时前
imx6ull开发板,Linux-c编程,识别 键盘、鼠标、触摸屏坐标
linux·嵌入式·开发板·应用编程
步十人8 小时前
【Linux】环境配置
linux·运维·服务器
念恒123068 小时前
MySQl安装
linux·运维·服务器
kaoa0008 小时前
Linux入门攻坚——77、虚拟化技术基础原理-2
linux·服务器·网络