Menu Close
Settings Close

Language and Page Formatting Options

第 2 章 nftables 入门

nftables 框架提供了数据包分类功能。最显著的功能是:

  • 内置查找表而不是线性处理
  • IPv4IPv6 使用同一个协议框架
  • 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
  • 支持在规则集(nftrace)和监控追踪事件(nft)中调试和追踪
  • 更加一致和压缩的语法,没有特定协议的扩展
  • 用于第三方应用程序的 Netlink API

nftables 框架使用表来存储链。链包含执行动作的独立规则。libnftnl 库可用于通过 libmnl 库与 nftables Netlink API 进行低级交互。

要显示规则集变化的影响,请使用 nft list ruleset 命令。由于这些工具将表、链、规则、集合和其他对象添加到 nftables 规则集中,请注意, nftables 规则集操作(如 nft flush ruleset 命令)可能会影响使用之前独立的旧命令安装的规则集。

2.1. 从 iptables 迁移到 nftables

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

重要

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

2.1.1. 使用 firewalld、nftables 或者 iptables 时

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

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

要避免不同的防火墙服务相互影响,在 RHEL 主机中只有一个服务,并禁用其他服务。

2.1.2. 将 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

2.1.3. 将单个 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

2.1.4. 常见的 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 命令不会预先创建表和链。只有当用户手动创建它们时它们才会存在。

    Example:列出 firewalld 生成的规则

    # nft list table inet firewalld
    # nft list table ip firewalld
    # nft list table ip6 firewalld

2.1.5. 其他资源