Red Hat Training

A Red Hat training course is available for RHEL 8

7.6.2. 在 nftables 中使用命名映射

nftables 框架支持命名映射。您可以在表中的多个规则中使用这些映射。匿名映射的另一个优势在于,您可以更新命名映射而不替换使用它的规则。

在创建命名映射时,您必须指定元素类型:

  • ipv4_addr 用于匹配部分包含 IPv4 地址的映射,如 192.0.2.1
  • ipv6_addr 用于匹配部分包含 IPv6 地址的映射,如 2001:db8:1::1
  • 匹配部分包含介质访问控制(MAC)地址的映射的 ether_addr,如 52:54:00:6b:66:42
  • inet_proto 用于匹配部分包含 Internet 协议类型(如 tcp )的映射。
  • 匹配部分包含互联网服务名称端口号(如 ssh22 )的映射的 inet_service
  • 为匹配部分包含数据包标记的映射添加标记。数据包标记可以是任意正 32 位整数值(02147483647)。
  • 映射的计数器,其匹配部分包含计数器值。计数器值可以是任意正 64 位整数值。
  • 匹配部分包含配额值的映射配额。配额值可以是任意正 64 位整数值。

这个示例论述了如何根据源 IP 地址允许或丢弃传入的数据包。使用命名映射时,您只需要一条规则来配置这种情况,同时 IP 地址和操作会动态存储在映射中。此流程还描述了如何从映射中添加和删除条目。

流程

  1. 创建表。例如,要创建一个名为 example_table 的表来处理 IPv4 数据包:

    # nft add table ip example_table
  2. 创建链。例如,要在 example_table 中创建一个名为 example_chain 的链:

    # nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
    重要

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

  3. 创建一个空的映射。例如,要为 IPv4 地址创建映射:

    # nft add map ip example_table example_map { type ipv4_addr : verdict \; }
  4. 创建使用该映射的规则。例如,以下命令为 example_ table 中的 example_chain 添加了一个规则,它把操作应用到 example_map 中定义的 IPv4 地址:

    # nft add rule example_table example_chain ip saddr vmap @example_map
  5. example_map 中添加 IPv4 地址和对应的操作:

    # nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }

    这个示例定义了 IPv4 地址到操作的映射。根据上述规则,防火墙接受来自 192.0.2.1 的数据包并丢弃来自 192.0.2 的数据包。

  6. 另外,还可添加另一个 IP 地址和 action 语句来增强映射:

    # nft add element ip example_table example_map { 192.0.2.3 : accept }
  7. (可选)从映射中删除条目:

    # nft delete element ip example_table example_map { 192.0.2.1 }
  8. 另外,还可显示规则集:

    # nft list ruleset
    table ip example_table {
      map example_map {
        type ipv4_addr : verdict
        elements = { 192.0.2.2 : drop, 192.0.2.3 : accept }
      }
    
      chain example_chain {
        type filter hook input priority filter; policy accept;
        ip saddr vmap @example_map
      }
    }