2.5. 使用 nftables 命令中的集合


nftables 框架原生支持集合。您可以使用一个集合,例如,规则匹配多个 IP 地址、端口号、接口或其他匹配标准。

2.5.1. 在 nftables 中使用匿名集合

匿名集合包含用逗号分开的值,如 { 22、80、443 },它们直接在规则中使用。您还可以将匿名集合用于 IP 地址以及任何其他匹配标准。

匿名集合的缺陷是,如果要更改集合,则需要替换规则。对于动态解决方案,使用命名集合,如 在 nftables 中使用命名集合 中所述。

先决条件

  • inet 系列中的 example_chain 链和 example_table 表存在。

流程

  1. 例如,要向 example_table 中的 example_chain 添加一条规则,其允许传入流量到端口 2280443

    # nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
    Copy to Clipboard Toggle word wrap
  2. 可选:在 example_table 中显示所有链及其规则:

    # nft list table inet example_table
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport { ssh, http, https } accept
      }
    }
    Copy to Clipboard Toggle word wrap

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 \; }
      Copy to Clipboard Toggle word wrap
    • 要创建可存储 IPv4 地址范围的集合:

      # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
      Copy to Clipboard Toggle word wrap
    重要

    要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。

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

    # nft add rule inet example_table example_chain ip saddr @example_set drop
    Copy to Clipboard Toggle word wrap

    由于 example_set 仍为空,所以该规则目前不起作用。

  3. example_set 中添加 IPv4 地址:

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

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

      # nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }
      Copy to Clipboard Toggle word wrap

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

2.5.3. 使用动态集添加来自数据包路径的条目

nftables 框架中的动态设置允许自动添加来自数据包数据的元素。例如,IP 地址、目标端口、MAC 地址等。通过此功能,您可以实时收集这些元素,并使用它们创建拒绝列表、禁止列表等,以便您能够立即响应安全威胁。

先决条件

  • inet 系列中的 example_chain 链和 example_table 表存在。

流程

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

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

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

      # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
      Copy to Clipboard Toggle word wrap
      重要

      要防止 shell 将分号解释为命令结尾,您必须使用反斜杠转义分号。

  2. 创建一条规则,将传入数据包的源 IPv4 地址添加到 example_set 组中:

    # nft add rule inet example_table example_chain set add ip saddr @example_set
    Copy to Clipboard Toggle word wrap

    命令在 example_chain 规则链中创建了一个新规则,并使用 example_table 将数据包的源 IPv4 地址动态添加到 example_set 中。

验证

  • 确保添加了规则:

    # nft list ruleset
    ...
    table ip example_table {
    	set example_set {
    		type ipv4_addr
    		elements = { 192.0.2.250, 192.0.2.251 }
    	}
    
    	chain example_chain {
        type filter hook input priority 0
    		add @example_set { ip saddr }
    	}
    }
    Copy to Clipboard Toggle word wrap

    命令显示 nftables 中当前载入的整个规则集。它显示 IP 正在主动触发规则,并且使用相关地址更新 example_set

后续步骤

有动态 IP 集后,您可以将它用于各种安全性、过滤和流量控制目的。例如:

  • 块、限制或记录网络流量
  • 与允许列表结合使用,以避免禁止可信用户
  • 使用自动超时来防止过度阻塞
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat