Red Hat Training

A Red Hat training course is available for RHEL 8

10.10. 调试 nftables 规则

nftables 框架为管理员提供了不同的选项来调试规则,以及数据包是否匹配。

10.10.1. 创建带有计数器的规则

在识别规则是否匹配时,可以使用计数器。

前提条件

  • 您要添加该规则的链已存在。

流程

  1. 向链中添加一条带有 counter 参数的新规则。以下示例添加一个带有计数器的规则,它允许端口 22 上的 TCP 流量,并计算与这个规则匹配的数据包和网络数据的数量:

    # nft add rule inet example_table example_chain tcp dport 22 counter accept
  2. 显示计数器值:

    # nft list ruleset
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
      }
    }

10.10.2. 在现有规则中添加计数器

在识别规则是否匹配时,可以使用计数器。

前提条件

  • 您要添加计数器的规则已存在。

流程

  1. 在链中显示规则及其句柄:

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
      }
    }
  2. 通过使用 counter 参数替换规则来添加计数器。以下示例替换了上一步中显示的规则并添加计数器:

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
  3. 显示计数器值:

    # nft list ruleset
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
      }
    }

10.10.3. 监控与现有规则匹配的数据包

nftables 中的追踪功能与 nft monitor 命令相结合,使管理员能够显示与某一规则匹配的数据包。您可以为规则启用追踪,使用它来监控与此规则匹配的数据包。

先决条件

  • 您要添加计数器的规则已存在。

流程

  1. 在链中显示规则及其句柄:

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
      }
    }
  2. 通过使用 meta nftrace set 1 参数替换规则来添加追踪功能。以下示例替换了上一步中显示的规则并启用追踪:

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
  3. 使用 nft monitor 命令来显示追踪。以下示例过滤了命令的输出,来只显示包含 inet example_table example_chain 的条目:

    # nft monitor | grep "inet example_table example_chain"
    trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240
    trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept)
    ...
    警告

    根据启用了追踪的规则数量以及匹配流量的数量,nft monitor 命令可以显示很多输出。使用 grep 或其他工具来过滤输出。