Red Hat Training

A Red Hat training course is available for RHEL 8

7.5.2. 在 nftables 中使用命名集

nftables 框架支持 mutable 命名集。命名集是一个列表或一组元素,您可以在表中的多个规则中使用。匿名集合的另外一个好处在于,您可以更新命名的集合而不必替换使用集合的规则。

当您创建一个命名集时,必须指定集合包含的元素类型。您可以设置以下类型:

  • 包含 IPv4 地址或范围的集合的 ipv4_addr,如 192.0.2.1192.0.2.0/24
  • 包含 IPv 6 地址或范围的集合的 ipv6_addr,如 2001:db8:1::12001:db8:1::1/64
  • ether_addr,用于包含介质访问控制(MAC)地址列表的集合,如 52:54:00:6b:66:42
  • inet_proto,用于包含 Internet 协议类型列表的集合,如 tcp
  • 包含互联网服务列表集合的 inet_service,如 ssh
  • 包含数据包标记列表的集合标记。数据包标记可以是任意正 32 位整数值(02147483647)。

先决条件

  • example_chain 链和 example_table 表存在。

流程

  1. 创建一个空集。以下示例为 IPv4 地址创建了一个集合:

    • 要创建可存储多个独立 IPv4 地址的集合:

      # nft add set inet example_table example_set { type ipv4_addr \; }
    • 要创建可存储 IPv4 地址范围的集合:

      # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
    重要

    要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。

  2. 另外,还可创建使用该集合的规则。例如,以下命令向 example_ table 中的 example_chain 添加一条规则,该规则将丢弃来自 example_ set 中的 IPv4 地址的所有数据包。

    # nft add rule inet example_table example_chain ip saddr @example_set drop

    因为 example_set 仍然为空,因此该规则目前无效。

  3. example_set 中添加 IPv4 地址:

    • 如果您创建存储单个 IPv4 地址的集合,请输入:

      # nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
    • 如果您创建存储 IPv4 范围的集合,请输入:

      # nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }

      当您指定 IP 地址范围时,也可以使用无类别域间路由(CIDR)标记,如上例中的 192.0.2.0/24