2.2. 从 iptables 迁移到 nftables


如果您的防火墙配置仍然使用 iptables 规则,则您可以将 iptables 规则迁移到 nftables

重要

ipsetiptables-nft 软件包已在 Red Hat Enterprise Linux 9 中弃用。这包括 nft-variants (如 iptablesip6tablesarptablesebtables 工具)的弃用。如果您使用其中任何一个工具,例如,因为您从早期的 RHEL 版本升级,红帽建议迁移到 nftables 软件包提供的 nft 命令行工具。

2.2.1. 何时使用 firewalld 或 nftables

在 Red Hat Enterprise Linux 中,您可以根据您的场景使用以下数据包过滤工具:

  • firewalld:firewalld 工具简化了常见用例的防火墙配置。
  • nftables:使用 nftables 实用程序设置复杂和高性能的防火墙,如为整个网络设置。
重要

要防止不同的防火墙相关服务(firewalldnftables)相互影响,请在 RHEL 主机上运行其中之一,并禁用其他服务。

2.2.2. nftables 框架中的概念

iptables 框架相比,nftables 提供了更加现代化、高效且更灵活的替代选择。nftables 框架比 iptables 提供了高级功能和改进,从而简化规则管理和增强性能。这使得 nftables 成为复杂和高性能网络环境的现代替代方案。

表和命名空间
nftables 中,表代表组织单元或命名空间,它们将相关的防火墙链、集合、流tables 和其他对象分组在一起。在 nftables 中,表提供了一种更灵活的方法来结构防火墙规则和相关组件。在 iptables 中,表更严格地定义在特定目的。
表系列
nftables 中的每个表都与特定系列关联(ipip6inetarpbridgenetdev)。此关联决定了表可以处理哪些数据包。例如,ip 系列中的一个表只处理 IPv4 数据包。另一方面,inet 是表系列的特殊案例。它提供了跨协议的统一方法,因为它可以处理 IPv4 和 IPv6 数据包。特殊表系列的另一个情况是 netdev,因为它用于直接应用到网络设备的规则,从而在设备级别上启用过滤。
基本链

nftables 中的基本链是数据包处理管道中高度可配置的入口点,允许用户指定以下内容:

  • 链的类型,如 "filter"
  • 数据包处理路径中的 hook 点,例如 "input", "output", "forward"
  • 链的优先级

通过这种灵活性,可以精确控制规则在通过网络堆栈时应用到数据包的时间和方式。链的一种特殊情况是 路由 链,用于根据数据包标头影响内核提出的路由决策。

用于规则处理的虚拟机

nftables 框架使用内部虚拟机来处理规则。此虚拟机执行与装配语言操作类似的指令(将数据加载到寄存器中,执行比较等)。这种机制可以实现高度灵活、高效的规则处理。

nftables 中的增强功能可以作为该虚拟机的新指令引入。这通常需要一个新的内核模块,并对 libnftnl 库和 nft 命令行工具进行更新。

或者,您可以通过将现有指令以创新方式结合来引进新功能,而无需进行内核修改。nftables 规则的语法反映了底层虚拟机的灵活性。例如:规则 meta mark set tcp dport map { 22:1, 80:2 } 将数据包的防火墙标记设置为 1 (如果 TCP 目的地端口为 22),如果端口为 80,则设置为 2。这展示了如何简洁地表达复杂逻辑。

复杂的过滤和字典映射

nftables 框架集成并扩展 ipset 工具的功能,用于 iptables 在 IP 地址、端口、其他数据类型上批量匹配,最重要的是,其中的组合。此集成可让您在 nftables 中直接管理大量和动态数据集。接下来,nftables 原生支持基于任何数据类型的多个值或范围匹配的数据包,这增强了其处理复杂过滤要求的能力。使用 nftables,您可以操作数据包中的任何字段。

nftables 中,集合可以命名为 或 anonymous。命名的集合可由多个规则引用并动态修改。匿名集合在规则内内联定义,并且是不可变的。集合可以包含组合不同类型的元素,如 IP 地址和端口号对。此功能在匹配复杂标准方面提供了更大的灵活性。要管理集合,内核可以根据特定要求(性能、内存效率等)选择最合适的后端。设置也可以使用键值对作为映射。value 部分可用作数据点(写入数据包标头的值),或者作为要跳到的链的值。这可启用复杂和动态规则行为,称为"verdict 映射"。

灵活的规则格式

nftables 规则的结构非常简单。条件和操作从左到右应用。这种直观的格式简化了创建和故障排除的规则。

规则中的条件在逻辑上连接(与 AND 运算符)一起,这意味着所有条件都必须评估为 "true" 才能匹配的规则。如果有任何条件失败,评估将移到下一个规则。

nftables 中的操作可以是最终的操作,如 dropaccept,这样可停止对数据包进行进一步处理。非终端操作,如 计数器日志元标记设置 0x3,执行特定的任务(计算数据包、日志记录、设置标记等),但允许评估后续规则。

2.2.3. 弃用的 iptables 框架中的概念

与主动维护的 nftables 框架类似,弃用的 iptables 框架允许您执行各种数据包过滤任务、日志记录和审计、与 NAT 相关的配置任务等。

iptables 框架由多个表组成,每个表都为特定目的设计:

filter
默认表确保常规数据包过滤
nat
对于网络地址转换(NAT),包括更改数据包的源和目标地址
mangle
对于特定的数据包更改,您可以针对高级路由决策对数据包标头进行修改
raw
对于在连接跟踪前需要发生的配置

这些表作为单独的内核模块实施,其中每个表都提供一组固定的内置链,如 INPUTOUTPUTFORWARD。链是指对数据包进行评估的规则序列。这些将 hook 链在内核中数据包处理流中的特定点。链在不同的表中具有相同的名称,但它们的执行顺序由相应的 hook 优先级决定。优先级由内核在内部管理,以确保规则以正确的序列应用。

最初,iptables 旨在处理 IPv4 流量。但是,由于 IPv6 协议的出现,需要引入 ip6tables 工具来提供可比较功能(作为 iptables),并允许用户创建和管理 IPv6 数据包的防火墙规则。使用相同的逻辑,创建了 arptables 工具来处理地址解析协议(ARP),并且为处理以太网桥接帧而开发了 ebtables 工具。这些工具可确保您可以在各种网络协议中应用 iptables 的数据包过滤功能,并提供全面的网络覆盖。

为增强 iptables 的功能,可以开始开发的扩展。功能扩展通常作为与用户空间动态共享对象(DSO)配对的内核模块实现。扩展引入了"匹配"和"目标",您可以在防火墙规则中使用它们来执行更复杂的操作。扩展可以启用复杂的匹配和目标。例如,您可以匹配或操作特定的第 4 层协议标头值,执行速率限制、强制实施配额等。某些扩展旨在解决默认的 iptables 语法中的限制,如"多端口"匹配扩展。此扩展允许单个规则与多个非安全端口匹配,以简化规则定义,从而减少所需的单个规则数量。

ipsetiptables 的特殊功能扩展。这是一个内核级别的数据结构,它与 iptables 一起使用来创建与数据包匹配的 IP 地址、端口号和其他与网络相关的元素集合。这些设置可显著简化、优化并加快编写和管理防火墙规则的过程。

使用 iptables-restore-translateip6tables-restore-translate 实用程序将 iptablesip6tables 规则集转换为 nftables

先决条件

  • 已安装 nftablesiptables 软件包。
  • 系统配置了 iptablesip6tables 规则。

流程

  1. iptablesip6tables 规则写入一个文件:

    # iptables-save >/root/iptables.dump
    # ip6tables-save >/root/ip6tables.dump
    Copy to Clipboard Toggle word wrap
  2. 将转储文件转换为 nftables 指令:

    # iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft
    # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
    Copy to Clipboard Toggle word wrap
  3. 检查,如果需要,手动更新生成的 nftables 规则。
  4. 要启用 nftables 服务来加载生成的文件,请在 /etc/sysconfig/nftables.conf 文件中添加以下内容:

    include "/etc/nftables/ruleset-migrated-from-iptables.nft"
    include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
    Copy to Clipboard Toggle word wrap
  5. 停止并禁用 iptables 服务:

    # systemctl disable --now iptables
    Copy to Clipboard Toggle word wrap

    如果您使用自定义脚本加载 iptables 规则,请确保脚本不再自动启动并重新引导以刷新所有表。

  6. 启用并启动 nftables 服务:

    # systemctl enable --now nftables
    Copy to Clipboard Toggle word wrap

验证

  • 显示 nftables 规则集:

    # nft list ruleset
    Copy to Clipboard Toggle word wrap

Red Hat Enterprise Linux 提供了 iptables-translateip6tables-translate 工具来将 iptablesip6tables 规则转换为与 nftables 相等的规则。

先决条件

  • 已安装 nftables 软件包。

流程

  • 使用 iptables-translateip6tables-translate 程序而不是 iptablesip6tables 显示对应的 nftables 规则,例如:

    # iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT
    nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept
    Copy to Clipboard Toggle word wrap

    请注意,一些扩展可能缺少响应的转换支持。在这些情况下,实用程序会输出以 # 符号为前缀的未转换规则,例如:

    # iptables-translate -A INPUT -j CHECKSUM --checksum-fill
    nft # -A INPUT -j CHECKSUM --checksum-fill
    Copy to Clipboard Toggle word wrap

2.2.6. 常见的 iptables 和 nftables 命令的比较

以下是常见 iptablesnftables 命令的比较:

  • 列出所有规则:

    Expand
    iptablesnftables

    iptables-save

    nft list ruleset

  • 列出某个表和链:

    Expand
    iptablesnftables

    iptables -L

    nft list table ip filter

    iptables -L INPUT

    nft list chain ip filter INPUT

    iptables -t nat -L PREROUTING

    nft list chain ip nat PREROUTING

    nft 命令不会预先创建表和链。只有当用户手动创建它们时它们才会存在。

    列出 firewalld 生成的规则:

    # nft list table inet firewalld
    # nft list table ip firewalld
    # nft list table ip6 firewalld
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat