8.2. 从 iptables 迁移到 nftables


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

8.2.1. 使用 firewalld、nftables 或者 iptables 时

以下是您应该使用以下工具之一的概述:

  • firewalld :对简单的防火墙用例使用 firewalld 工具。此工具易于使用,并涵盖了这些场景的典型用例。
  • nftables :使用 nftables 工具来设置复杂和性能关键的防火墙,如用于整个网络。
  • iptables :Red Hat Enterprise Linux 上的 iptables 工具使用 nf_tables 内核 API 而不是 传统的 后端。nf_tables API 提供了向后兼容性,以便使用 iptables 命令的脚本仍可在 Red Hat Enterprise Linux 上工作。对于新的防火墙脚本,红帽建议使用 nftables
重要

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

8.2.2. nftables 框架中的概念

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

nftables 框架包含以下组件:

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

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

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

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

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

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

或者,您可以通过将现有指令以创新方式结合来引进新功能,而无需进行内核修改。nftables 规则的语法反映了底层虚拟机的灵活性。例如,规则 元标记设置 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,执行特定的任务(计算数据包、日志记录、设置标记等),但允许评估后续规则。

8.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 (8) 手册页

8.2.4. 将 iptables 和 ip6tables 规则集转换为 nftables

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

前提条件

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

流程

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

    # iptables-save >/root/iptables.dump
    # ip6tables-save >/root/ip6tables.dump
  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
  3. 检查,如果需要,手动更新生成的 nftables 规则。
  4. 要启用 nftables 服务来加载生成的文件,请在 /etc/sysconfig/nftables.conf 文件中添加以下内容:

    include "/etc/nftables/ruleset-migrated-from-iptables.nft"
    include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
  5. 停止并禁用 iptables 服务:

    # systemctl disable --now iptables

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

  6. 启用并启动 nftables 服务:

    # systemctl enable --now nftables

验证

  • 显示 nftables 规则集:

    # nft list ruleset

8.2.5. 将单个 iptables 和 ip6tables 规则转换为 nftables

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

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

    # iptables-translate -A INPUT -j CHECKSUM --checksum-fill
    nft # -A INPUT -j CHECKSUM --checksum-fill

其他资源

  • iptables-translate --help

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

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

  • 列出所有规则:

    iptablesnftables

    iptables-save

    nft list ruleset

  • 列出某个表和链:

    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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.