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 只是语法翻译兼容层,并非独立架构,这也是你看到警告的根源。
相关推荐
YaBingSec1 小时前
玄机网络安全靶场:Apache HTTPD 解析漏洞(CVE-2017-15715)WP
java·笔记·安全·web安全·php·apache
志栋智能1 小时前
跨越人机边界:超自动化巡检如何重塑工作流程?
运维·网络·人工智能·安全·自动化
XX風1 小时前
三维点云处理环境相关-ubuntu安装numpy、open3d
linux·ubuntu·numpy
zzipeng1 小时前
IMX6ULL CAN通讯应用学习
linux·运维·网络
代码中介商1 小时前
Linux多线程编程完全指南(下):线程同步与互斥锁
linux·redis·线程·互斥锁
一个人旅程~1 小时前
Win旧版或win10部分版本如何解除260字符长路径名限制?
linux·windows·经验分享·电脑
乌托邦的逃亡者1 小时前
Ubuntu主机中,为一个网卡设置多个IP地址
服务器·网络·ubuntu
iEdHu1 小时前
LinuxDO | L站 | Linux.do邀请码2026最新获取方式【邀请链接每日分享】
linux·经验分享·其他·社交电子
中国lanwp2 小时前
CentOS 7 搭建 NFS Server 服务端 + 客户端 完整一键配置
linux·运维·centos