2.3.4. 使用 nft 命令管理表、链和规则

要在命令行或 shell 脚本中管理 nftables 防火墙,请使用 nft 工具。

重要

此流程中的命令不代表典型的工作流,且不会被优化。此流程演示了如何使用 nft 命令管理表、链和规则。

流程

  1. 使用 inet 地址系列创建一个名为 nftables_svc 的表,以便表可以处理 IPv4 和 IPv6 数据包:

    # nft add table inet nftables_svc
  2. 将名为 INPUT 的基本链(用于处理传入的网络流量)添加到 inet nftables_svc 表中:

    # nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }

    为了避免 shell 将分号解释为命令的结尾,请使用 \ 字符转义分号。

  3. INPUT 链中添加规则。例如,允许端口 22 和 443 上的传入 TCP 流量,以及作为 INPUT 链的最后一个规则,拒绝其他带有互联网控制消息协议(ICMP)端口无法访问的消息的流量:

    # nft add rule inet nftables_svc INPUT tcp dport 22 accept
    # nft add rule inet nftables_svc INPUT tcp dport 443 accept
    # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable

    如果您输入 nft add rule 命令,nft 会将规则按与运行命令相同的顺序添加规则。

  4. 显示包括句柄的当前规则集:

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        reject # handle 4
      }
    }
  5. 在带有句柄 3 的现有规则前面插入规则。例如,要插入一个允许端口 636 上 TCP 流量的规则,请输入:

    # nft insert rule inet nftables_svc INPUT position 3 tcp dport 636 accept
  6. 使用句柄 3 在现有规则后面附加规则。例如,要插入一个允许端口 80 上 TCP 流量的规则,请输入:

    # nft add rule inet nftables_svc INPUT position 3 tcp dport 80 accept
  7. 再次使用 handle 显示规则集。验证后续添加的规则是否已添加到指定位置:

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # 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
        reject # handle 4
      }
    }
  8. 删除带有句柄 6 的规则:

    # nft delete rule inet nftables_svc INPUT handle 6

    要删除规则,您必须指定句柄。

  9. 显示规则集,并验证删除的规则不再存在:

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # 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
        reject # handle 4
      }
    }
  10. INPUT 链中删除所有剩余的规则:

    # nft flush chain inet nftables_svc INPUT
  11. 显示规则集,并验证 INPUT 链是否为空:

    # nft list table inet nftables_svc
    table inet nftables_svc {
      chain INPUT {
        type filter hook input priority filter; policy accept
      }
    }
  12. 删除 INPUT 链:

    # nft delete chain inet nftables_svc INPUT

    您还可以使用此命令删除仍然包含规则的链。

  13. 显示规则集,并验证 INPUT 链已被删除:

    # nft list table inet nftables_svc
    table inet nftables_svc {
    }
  14. 删除 nftables_svc 表:

    # nft delete table inet nftables_svc

    您还可以使用此命令删除仍然包含链的表。

    注意

    要删除整个规则集,请使用 nft flush ruleset 命令,而不是手动删除独立命令中的所有规则、链和表。

其他资源

nft(8) man page