Menu Close
Settings Close

Language and Page Formatting Options

2.5.2. 在 nftables 中使用命名集

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

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

  • 包含 IPv4 地址或范围的集合的 ipv4_addr,如 192.0.2.1192.0.2.0/24
  • 包含 IPv6 地址或范围的集合的 ipv6_addr,如 2001:db8:1::12001:db8:1::1/64
  • 包含介质访问控制(MAC)地址列表的集合的 ether_addr ,如 52:54:00:6b:66:42
  • 包含互联网协议类型列表的集合的 inet_proto ,如 tcp
  • 包含互联网服务列表的集合的 inet_service ,如 ssh
  • 包含数据包标记列表的集合的 mark。数据包标记可以是任意正 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