2.3.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 position 3 tcp dport 636 accept
使用句柄 3 在现有规则后面附加规则。例如,要插入一个允许端口 80 上 TCP 流量的规则,请输入:
# nft add rule inet nftables_svc INPUT position 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 } }
删除带有句柄 6 的规则:
# nft delete rule inet nftables_svc INPUT handle 6
要删除规则,您必须指定句柄。
显示规则集,并验证删除的规则不再存在:
# 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
命令,而不是手动删除独立命令中的所有规则、链和表。
其他资源
nft(8)
man page