Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 6 章 nftables 入门

nftables 框架提供数据包分类工具,它是 iptables、ip6tables、arptables、ebtables ipset 工具的指定后继设备。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
  • 内置查找表而不是线性处理
  • IPv4 和 IPv 6 协议的单一框架
  • 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
  • 支持在规则集(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/ 目录中自动创建 *.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 脚本

  • 要运行 nftables 脚本,请将其传递给 nft 实用程序,请输入:
    # nft -f /etc/nftables/example_firewall.nft

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

  1. 只需要执行一次的步骤:
    1. 确保脚本以以下 shebang 序列开头:
      #!/usr/sbin/nft -f
      重要
      如果省略 -f 参数,nft 程序不会读取脚本并显示:Error: syntax error, unexpected newline, expecteding 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 关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用命名的 set 或 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. 包含目录中的所有 *.nft 文件

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

其它资源

  • 详情请查看 nft(8)man page 中的 包含文件 部分。

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

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

先决条件

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

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

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

其它资源