第 6 章 nftables 入门


nftables 框架提供数据包分类工具,它是 iptablesip6tablesarptablesebtablesipset 工具的指定成功者。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
  • 内置查找表而不是线性处理
  • IPv4IPv6 协议的单一框架
  • 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
  • 支持在规则集(nftrace)和监控追踪事件( nft )中调试和追踪
  • 更加一致和压缩的语法,没有特定协议的扩展
  • 用于第三方应用程序的 Netlink API
iptables 类似,nftables 使用表来存储链。链包含执行动作的独立规则。nft 工具替换了之前数据包过滤框架中的所有工具。libnftnl 库可用于通过 libmnl 库与 nftables Netlink API 进行低级交互。
要显示规则集变化的影响,请使用 nft list ruleset 命令。由于这些工具将表、链、规则、集合和其他对象添加到 nftables 规则集,请注意 nftables 规则集操作(如 nft flush ruleset 命令)可能会影响使用之前独立的旧命令安装的规则集。

何时使用 firewalld 或 nftables

  • firewalld :将 firewalld 工具用于 简单的防火墙 用例。此工具易于使用,并涵盖了这些场景的典型用例。
  • nftables :使用 nftables 工具来设置复杂和性能关键的防火墙,如用于整个网络。
重要
要避免不同的防火墙服务相互影响,在 RHEL 主机中只有一个服务,并禁用其他服务。

6.1. 编写和执行 nftables 脚本

nftables 框架提供了一个原生脚本环境,它比使用 shell 脚本维护 防火墙规则 提供了主要优势:执行脚本是原子的。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。
另外,nftables 脚本环境使管理员能够:
  • 添加评论
  • 定义变量
  • 包含其他规则集文件
本节介绍如何使用这些功能,以及创建和执行 nftables 脚本。
当您安装 nftables 软件包时,Red Hat Enterprise Linux 会在 /etc/nftables/ 目录中自动创建 If nft 脚本。这些脚本包含为不同目的创建表和空链的命令。

6.1.1. 支持的 nftables 脚本格式

nftables 脚本环境支持以下格式的脚本:
  • 您可以以与 nft list ruleset 命令相同的格式编写脚本,显示规则集:
    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    table inet example_table {
      chain example_chain {
        # Chain for incoming packets that drops all packets that
        # are not explicitly allowed by any rule in this chain
        type filter hook input priority 0; policy drop;
    
        # Accept connections to port 22 (ssh)
        tcp dport ssh accept
      }
    }
    
  • 您可以使用与 nft 命令相同的语法:
    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    # Create a table
    add table inet example_table
    
    # Create a chain for incoming packets that drops all packets
    # that are not explicitly allowed by any rule in this chain
    add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; }
    
    # Add a rule that accepts connections to port 22 (ssh)
    add rule inet example_table example_chain tcp dport ssh accept
    

6.1.2. 运行 nftables 脚本

您可以通过将脚本传递给 nft 工具或直接执行脚本来运行 nftables 脚本。

先决条件

  • 本节的流程假设您在 /etc/ nftables /example_firewall.nft 文件中存储了一个 nftables 脚本。

过程 6.1. 使用 nft 工具运行 nftables 脚本

  • 要通过将其传给 nft 工具来运行 nftables 脚本,请输入:
    # nft -f /etc/nftables/example_firewall.nft

过程 6.2. 直接运行 nftables 脚本:

  1. 只需要执行一次的步骤:
    1. 确保脚本以以下 shebang 序列开头:
      #!/usr/sbin/nft -f
      重要
      如果省略 -f 参数,nft 工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。
    2. 可选:将脚本的所有者设置为 root
      # chown root /etc/nftables/example_firewall.nft
    3. 使脚本可以被其所有者执行:
      # chmod u+x /etc/nftables/example_firewall.nft
  2. 运行脚本:
    # /etc/nftables/example_firewall.nft
    如果没有输出结果,系统将成功执行该脚本。
重要
即使 nft 成功地执行了脚本,在脚本中错误放置的规则、缺失的参数或其他问题都可能会导致防火墙的行为不符合预期。

其他资源

6.1.3. 使用 nftables 脚本中的注释

nftables 脚本环境将 # 字符右侧的所有内容解释为注释。

例 6.1. nftables 脚本中的注释

注释可在一行的开始,也可以在命令后:
...
# Flush the rule set
flush ruleset

add table inet example_table  # Create a table
...

6.1.4. 使用 nftables 脚本中的变量

要在 nftables 脚本中定义一个变量,请使用 define 关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用命名集或 verdict 映射。

只有一个值的变量

以下示例定义了名为 INET_DEV 的变量,其值为 enp1s0
define INET_DEV = enp1s0
您可以通过在 $ 符号后跟变量名称来在脚本中使用变量:
...
add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept
...

包含匿名集合的变量

以下示例定义了一个包含匿名集合的变量:
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
您可以通过在 $ 符号后跟变量名称来在脚本中使用变量:
add rule inet example_table example_chain ip daddr $DNS_SERVERS accept
注意
请注意,在规则中使用大括号时具有特殊的意义,因为它们表示变量代表一个集合。

其他资源

6.1.5. 在 nftables 脚本中包含文件

nftables 脚本环境可让管理员使用 include 语句包含其他脚本。
如果您只指定了文件名,而没有绝对路径或相对路径,那么 nftables 将包含默认搜索路径中的文件,在 Red Hat Enterprise Linux 上,该路径设为 /etc

例 6.2. 包含默认搜索目录中的文件

从默认搜索目录中包含一个文件:
include "example.nft"

例 6.3. 包括一个 目录中的所有 Ifnft 文件

要包含在 /etc/nftables/rulesets/ 目录中以 If nft 结尾的所有文件:
include "/etc/nftables/rulesets/*.nft"
请注意,include 语句不匹配以点开头的文件。

其他资源

  • 详情请查看 nft (8) 手册页中的 Include files 部分。

6.1.6. 系统引导时自动载入 nftables 规则

nftables systemd 服务加载包含在 /etc/sysconfig/nftables.conf 文件中的防火墙脚本。这部分论述了如何在系统引导时载入防火墙规则。

先决条件

  • nftables 脚本存储在 /etc/nftables/ 目录中。

过程 6.3. 系统引导时自动载入 nftables 规则

  1. 编辑 /etc/sysconfig/nftables.conf 文件。
    • 如果您在安装 nftables 软件包时增强了在 /etc/nftables/ 中创建的 If nft 脚本,请取消对这些脚本的 include 语句的注释。
    • 如果您从头编写脚本,请添加 include 语句来包括这些脚本。例如,要在 nftables 服务启动时载入 /etc/nftables/example.nft 脚本,请添加:
      include "/etc/nftables/example.nft"
  2. (可选)启动 nftables 服务来加载防火墙规则,而不重启系统:
    # systemctl start nftables
  3. 启用 nftables 服务。
    # systemctl enable nftables

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.