11.4. 使用 nft 命令管理表、链和规则
要在命令行上或 shell 脚本中管理 nftables 防火墙,请使用 nft 工具。
此流程中的命令不代表典型的工作流,且没有被优化。此流程只演示了如何使用 nft 命令来管理表、链和规则。
流程
创建一个带有
inet地址系列的名为nftables_svc的表,以便表可以处理 IPv4 和 IPv6 数据包:# nft add table inet nftables_svc将处理传入网络流量的、名为
INPUT的基本链添加到inet nftables_svc表中:# nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }为了避免 shell 将分号解释为命令的结尾,请使用
\字符转义分号。向
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会将按与运行命令相同的顺序将规则添加到链。显示包括句柄的当前规则集:
# 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 } }在句柄为 3 的现有规则前面插入一条规则。例如,要插入一个允许端口 636 上 TCP 流量的规则,请输入:
# nft insert rule inet nftables_svc INPUT handle 3 tcp dport 636 accept在句柄为 3 的现有规则后面附加一条规则。例如,要插入一个允许端口 80 上 TCP 流量的规则,请输入:
# nft add rule inet nftables_svc INPUT handle 3 tcp dport 80 accept再次显示带有 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 } }删除 handle 为 6 的规则:
# nft delete rule inet nftables_svc INPUT handle 6要删除规则,您必须指定 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 reject # handle 4 } }从
INPUT链中删除所有剩余的规则:# nft flush chain inet nftables_svc INPUT显示规则集,并验证
INPUT链是否为空:# nft list table inet nftables_svc table inet nftables_svc { chain INPUT { type filter hook input priority filter; policy accept } }删除
INPUT链:# nft delete chain inet nftables_svc INPUT您还可以使用此命令删除仍然包含规则的链。
显示规则集,并验证
INPUT链是否已被删除:# nft list table inet nftables_svc table inet nftables_svc { }删除
nftables_svc表:# nft delete table inet nftables_svc您还可以使用此命令删除仍然包含链的表。
注意要删除整个规则集,请使用
nft flush ruleset命令,而不是在单独的命令中手动删除所有规则、链和表。