简介
nftables
是 Linux 内核中用于数据包分类的现代框架,用来替代旧的 iptables
(包括 ip6tables
, arptables
, ebtables
等,统称为 xtables)架构。nftables
提供了更强大、更灵活以及更易于管理的规则集配置方式,使得网络过滤和路由决策变得更加高效
适用范围:nftables 可在 Linux 内核版本 >= 3.13 上使用。
新的命令行实用程序:nftables 提供了一个名为 nft 的新命令行实用程序,其语法与 iptables 不同。
兼容性层:nftables还提供了一个兼容性层,允许在新的 nftables 内核框架上运行 iptables 命令。
通用集合基础设施:nftables 提供了一种通用的集合基础设施,允许构建映射和串联结构。可以利用这些新结构来将规则集安排在多维树中,从而大幅减少需要检查的规则数量,直到达到对数据包的最终操作。
nftables特点
nftables 的开发是为了解决 iptables 框架存在的一些限制,并提供增强功能来进行数据包过滤和分类。
以下是选择 nftables 而非 iptables 的一些原因:
-
避免代码重复:
iptables
中的许多扩展都是特定于协议的,这意味着没有一种统一的方式来匹配数据包字段。相反,每种支持的协议都有自己的扩展。这导致代码库中充斥着执行类似任务的非常相似的代码,使得代码库变得庞大且难以维护。nftables
通过更通用和一致的框架来整合这些功能。 -
更快的数据包分类: nftables 提供增强的通用集合和映射基础设施,相比 iptables,可以实现更快的数据包分类。
-
简化的双栈 IPv4/IPv6 支持: nftables 引入了 inet 家族,使得在同一条链内管理 IPv4 和 IPv6 流量变得更加简单。
-
更好的动态规则集更新支持: nftables 提供了改进的动态规则集更新支持,使得更容易管理和修改防火墙规则。
-
Netlink API 支持: nftables 为第三方应用程序提供了 Netlink API,类似于其他 Linux 网络和 Netfilter 子系统。这样可以更轻松地将外部工具和应用程序集成到 nftables 中。
-
语法改进: nftables 解决了 iptables 中存在的语法不一致问题,提供了更干净、更紧凑的语法来定义规则和配置。
nftables和iptables的主要区别
语法不同
- iptables 使用基于 getopt_long() 的解析器,其中关键字总是以双破折号(--)开头,例如 --key,或者单个破折号(-)后跟一个字母,例如 -p tcp。
- nftables 则使用了一种受 tcpdump 启发的紧凑语法。这种语法更加直观和灵活,让用户能够更轻松地编写和理解规则。
表和链的完全可配置性
- iptables 预设了多个表和基础链,即使你只需要其中的一个,所有的表和链都会被注册。这可能导致性能问题,即使未使用的基础链也可能对性能产生负面影响。
- nftables 没有预设的表和链。你需要显式地定义每个表,并且只向其中添加你明确需要的对象(链、集合、映射、流表和状态对象)。这样,你就可以只注册你需要的基础链,并根据你的特定数据包处理管道选择表和链的名称以及 netfilter 钩子优先级。
单个规则可以执行多个操作
- iptables 的规则由匹配条件和单个目标动作组成。一旦匹配条件满足,就会执行目标动作(如接受、拒绝或跳转到另一个链)。
- nftables 的规则由零个或多个表达式后跟一个或多个语句组成。每个表达式测试数据包是否与特定的负载字段或数据包/流元数据匹配。多个表达式从左到右线性评估:如果第一个表达式匹配,则评估下一个表达式,依此类推。如果所有表达式都匹配,则执行该规则的语句。每个语句执行一个操作,如设置 netfilter 标记、计数数据包、记录数据包或做出裁决(如接受、丢弃数据包或跳转到另一个链)。与表达式一样,多个语句也是从左到右线性评估的:单个规则可以通过使用多个语句来执行多个操作。但请注意,裁决语句会自然结束规则的执行。
没有内置的每链和每规则计数器
-
在 iptables 中,计数器是内置的,用于跟踪每个链和规则的匹配次数。但在 nftables 中,计数器是可选的,可以根据需要启用它们。这种灵活性允许用户只在需要时跟踪特定规则或链的性能指标,从而节省系统资源。
更好的动态规则集更新支持
-
iptables 使用一个整体的数据块(monolithic blob)来存储其规则集,这意呀着在添加或删除规则时,可能需要重新加载整个规则集,这可能会影响系统的性能。而 nftables 的规则集在内部以链表的形式表示,这使得添加或删除规则时只影响相关的部分,而不会影响整个规则集的其余部分,从而简化了内部状态信息的维护。
简化的双栈 IPv4/IPv6 管理
-
nftables 的 inet 家族允许注册能够同时查看 IPv4 和 IPv6 流量的基础链。这意味着不再需要依赖脚本来复制你的规则集以同时支持 IPv4 和 IPv6,从而简化了配置和管理过程。
新的通用集合基础设施
-
nftables 引入了与核心紧密集成的新的通用集合基础设施,它允许高级配置,如映射(maps)、决策映射(verdict maps)和间隔(intervals),以实现面向性能的包分类。最重要的是,可以使用任何受支持的选择器来对流量进行分类,这为复杂的网络场景提供了更多的灵活性和控制力。
支持拼接
-
自 Linux 内核 4.1 版本以来,nftables 支持将多个关键字拼接起来,并将它们与映射和裁决映射组合使用。
无需内核升级即可支持新协议
- 在传统的防火墙配置中,支持新协议通常需要升级内核。而 nftables 采用了新的虚拟机方法,使得支持新协议通常不需要新的内核版本,而只需要相对简单的 nft 用户空间软件更新。这降低了维护成本,并提高了系统的灵活性和可扩展性。
nftables概念
表链的含义和我们前面所介绍的iptables是类似的,更多表与链相关的内容可以参考iptables基本概念
表(Tables):Nftables配置由表组成,表是规则的容器。有四种类型的表:filter、nat、mangle、和raw。
链(Chains):表包含多个链,链是规则的集合。Nftables中有五种默认链:input、output、forward、prerouting和postrouting。这些链用于不同的网络包处理阶段。
规则(Rules):规则是定义如何处理网络包的指令。规则由条件(匹配条件)和操作(对匹配的包执行的操作)组成。
集合(sets):集合是一种数据结构,用于存储IP地址、端口号等信息,以便在规则中引用。
当涉及到Nftables时,理解其基本概念和语法是非常重要的。
iptables表
表包含链,与 iptables 中的表不同,nftables 中没有内置表。表的数量及其名称由用户决定。不过,每个表只有一个地址族,并且仅适用于该族的数据包。
表可以指定五个族之一:
nftables 族 | iptables 实用程序 |
---|---|
ip | iptables |
ip6 | ip6tables |
inet | iptables 和 ip6tables |
arp | arptables |
bridge | ebtables |
ip
(即 IPv4)是默认族,如果未指定族,则将使用该族。
要创建同时适用于 IPv4 和 IPv6 的规则,请使用 inet
。inet
允许统一 ip
和 ip6
族,从而使同时定义两者的规则更加容易。
安装nftables
我目前使用的系统是debian 12,以下直接使用apt install nftables安装。
配置文件
nftables包附带了一个简单而安全的防火墙配置,存储在 /etc/nftables.conf
文件中。
nftables.service
将在启动或启用时从该文件加载规则。
保存配置
查看当前的 nftables 配置规则:
nft list ruleset
将输出重定向到 /etc/nftables.conf
文件中:
nft list ruleset > /etc/nftables.conf
重新加载配置文件
nft -f /etc/nftables.confsystemctl restart nftables//也可通过该命令重启nftables