Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

6.2. 创建和管理 nftables 表、链和规则

本节介绍如何显示 nftables 规则集以及如何管理它。

6.2.1. 显示 nftables 规则集

nftables 的规则集包含表、链和规则。本节介绍如何显示此规则集。
要显示所有规则集,请输入:
# nft list ruleset
table inet example_table {
  chain example_chain {
    type filter hook input priority filter; policy accept;
    tcp dport http accept
    tcp dport ssh accept
  }
}
注意
默认情况下,nftables 不预先创建表。因此,在没有表的情况下显示主机上设置的规则,nft list ruleset 命令不会显示任何输出。

6.2.2. 创建 nftables 表

nftables 中的表是包含链、规则、集合和其他对象集合的名字空间。本节介绍如何创建表。
每个表都必须定义一个地址系列。表的地址系列定义了表进程的类型。在创建表时,您可以设置以下地址系列之一:
  • ip :仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。
  • ip6: 仅匹配 IPv6 数据包。
  • inet: 匹配 IPv4 和 IPv6 数据包。
  • arp: 匹配 IPv4 地址解析协议(ARP)数据包。
  • 网桥 :匹配遍历网桥设备的数据包。
  • netdev :匹配来自 ingress 的数据包。

过程 6.4. 创建 nftables 表

  1. 使用 nft add table 命令来创建新表。例如,要创建一个名为 example_table 的表,用于处理 IPv4IPv6 数据包:
    # nft add table inet example_table
  2. 另外,还可列出规则集中的所有表:
    # nft list tables
    table inet example_table

其他资源

  • 有关地址系列的详情,请查看 nft (8) 手册页中的 Address families 部分。
  • 有关您可以在表中运行的其他操作的详情,请查看 nft (8) 手册页中的 Tables 部分。

6.2.3. 创建 nftables 链

chains 是规则的容器。存在以下两种规则类型:
  • 基本链:您可以使用基础链作为来自网络堆栈的数据包的入口点。
  • 常规链:您可以使用常规链作为 跳过 目标,并更好地组织规则。
这个步骤描述了如何在现有表中添加基本链。

先决条件

  • 已存在您要添加新链的表。

过程 6.5. 创建 nftables 链

  1. 使用 nft add chain 命令来创建新链。例如,要在 example_table 中创建一个名为 example_chain 的链:
    # nft add chain inet example_table example_chain '{ type filter hook input priority 0 ; policy accept ; }'
    重要
    要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。此外,一些 shell 也解译大括号,因此请使用 ticks (1)将大括号和它们内的任何内容引用。
    这个链过滤传入的数据包。priority 参数指定 nftables 进程处理具有相同 hook 值的链的顺序。较低优先级的值优先于优先级更高的值。policy 参数为此链中的规则设置默认操作。请注意,如果您远程登录到服务器,并将默认策略设置为 drop,如果没有其他规则允许远程访问,则会立即断开连接。
  2. 另外,还可以显示所有链:
    # nft list chains
    table inet example_table {
      chain example_chain {
        type filter hook input priority filter; policy accept;
      }
    }
    

其他资源

  • 有关地址系列的详情,请查看 nft (8) 手册页中的 Address families 部分。
  • 有关您可以在链上运行的其他操作的详情,请查看 nft (8) 手册页中的 部分。

6.2.4. 将规则附加到 nftables 链的末尾

本节介绍如何在现有 nftables 链的末尾附加规则。

先决条件

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

过程 6.6. 将规则附加到 nftables 链的末尾

  1. 要添加新规则,请使用 nft add rule 命令。例如,要在 example_table 中的 example_chain 中添加一条规则,以允许端口 22 上的 TCP 流量:
    # nft add rule inet example_table example_chain tcp dport 22 accept
    您还可以指定服务名称而不是端口号。在示例中,您可以使用 ssh 而不是端口号 22。请注意,服务名称根据 /etc/services 文件中的条目解析为端口号。
  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 accept
      }
    }
    

其他资源

  • 有关地址系列的详情,请查看 nft (8) 手册页中的 Address families 部分。
  • 有关您可以在链中运行的其他操作的详情,请查看 nft (8) 手册页中的 Rules 部分。

6.2.5. 在 nftables 链的开头插入一条规则

本节介绍如何在现有 nftables 链的开头插入规则。

先决条件

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

过程 6.7. 在 nftables 链的开头插入一条规则

  1. 要插入新规则,请使用 nft insert rule 命令。例如,要在 example_table 中的 example_chain 插入一条规则,以允许端口 22 上的 TCP 流量:
    # nft insert rule inet example_table example_chain tcp dport 22 accept
    您还可以指定服务名称而不是端口号。在示例中,您可以使用 ssh 而不是端口号 22。请注意,服务名称根据 /etc/services 文件中的条目解析为端口号。
  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 accept
        ...
      }
    }
    

其他资源

  • 有关地址系列的详情,请查看 nft (8) 手册页中的 Address families 部分。
  • 有关您可以在链中运行的其他操作的详情,请查看 nft (8) 手册页中的 Rules 部分。

6.2.6. 在 nftables 链的特定位置插入一条规则

本节解释了如何在 nftables 链中的现有规则前后插入规则。这样,您可以将新规则放在正确的位置上。

先决条件

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

过程 6.8. 在 nftables 链的特定位置插入一条规则

  1. 使用 nft -a list ruleset 命令显示 example_table 中的所有链及其规则,包括其句柄:
    # nft -a list table inet example_table
    table inet example_table { # handle 1
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        tcp dport 389 accept # handle 4
      }
    }
    
    使用 -a 显示句柄。您需要此信息才能在后续步骤中定位新规则。
  2. 将新规则插入到 example_table 中的 example_chain 链中:
    • 要在句柄 3 前插入一条允许端口 636 上 TCP 流量的规则,请输入:
      # nft insert rule inet example_table example_chain position 3 tcp dport 636 accept
    • 要添加一条规则,在句柄 3 后允许端口 80 上的 TCP 流量,请输入:
      # nft add rule inet example_table example_chain position 3 tcp dport 80 accept
  3. 另外,还可在 example_table 中显示所有链及其规则:
    # nft -a list table inet example_table
    table inet example_table { # handle 1
      chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        tcp dport 80 accept # handle 6
        tcp dport 389 accept # handle 4
      }
    }
    

其他资源

  • 有关地址系列的详情,请查看 nft (8) 手册页中的 Address families 部分。
  • 有关您可以在链中运行的其他操作的详情,请查看 nft (8) 手册页中的 Rules 部分。