简介
在上篇文章中,我们介绍了nftables基本原理以及与iptables的区别,nftables安装和配置保存的操作。这篇文章主要介绍nftables的基本操作,表、链、规则的新增、插入、修改、删除等操作。
注意:在进行nftables实验时和iptables一样,请务必在个人的测试机上进行,不要在有任何业务的机器上进行测试。
在进行测试前,为保障我们环境的纯粹性,我们需要将nftables清空,以便进行后续的各项实验测试。
nft flush ruleset #清除 nftables 中的所有规则
nft list ruleset

表
nftables
中的表是一个包含链、规则、集合和其他对象集合的名字空间。
每个表都必须分配一个地址系列。地址系列定义此表处理的数据包类型。在创建表时,可以设置以下地址系列之一:
ip
:仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。ip6
:仅匹配 IPv6 数据包.inet
:匹配 IPv4 和 IPv6 数据包。arp
:匹配 IPv4 地址解析协议(ARP)数据包。bridge
:匹配通过网桥设备的数据包。netdev
:匹配来自 ingress 的数据包。
添加表
nft add table <table_address_family> <table_name>
nft list tables #列出所有表
nft list table <table_name> #列出指定表的规则
nft list table <table_address_family> <table_name> #列出对应族中对应对应表的所有规则

删除表
nft delete table <table_address_family> <table_name>

刷新表
当我们需要清除一个表中的所有规则但是不需要删除我们表的结构和配置的时候可以通过以下命令实现:
nft flush table <table_address_family> <table_name>
链
链的用途是包含规则,与 iptables 中的链不同,nftables 中没有内置链。这意味着,如果没有任何类型或钩子使用链,nftables 将不会触及流经这些链的数据包,因为它们没有定义任何规则来处理这些数据包。
表由链组成,链又是规则的容器。存在以下两种规则类型:
基本链 :可以使用基本链作为来自网络堆栈的数据包的入口点。
常规链 :可以将常规链用作 jump
目标来更好地组织规则。
基本链
nft add chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }
链类型
类型 | 地址系列 | 钩子 | 描述 |
---|---|---|---|
| all | all | 标准链类型 |
|
|
| 这个类型的链根据连接跟踪条目执行原生地址转换。只有第一个数据包会遍历此链类型。 |
|
|
| 如果 IP 头的相关部分已更改,则接受的遍历此链类型的数据包会导致新的路由查找。 |
链优先级
priority 参数指定数据包遍历具有相同 hook 值的链的顺序。可以将此参数设为整数值,或使用标准优先级名称。数字较低的链首先被处理,并且可以是负数。
文本值 | 数字值 | 地址系列 | 钩子 |
---|---|---|---|
|
|
| all |
|
|
| all |
|
|
|
|
|
|
| |
|
|
| all |
|
| all | |
security |
|
| all |
|
|
|
|
|
|
| |
|
|
|
|
链策略
如果此链中的规则没有指定任何操作,则链策略定义 nftables
是否应该接受或丢弃数据包。可以在链中设置以下策略之一:
accept
(默认)drop
常规链
nft add chain <table_address_family> <table_name> <chain_name>
查看链
nft list chains #列出所有链信息
nft list chain 族类型 表名 链名
编辑链
想要编辑链,只需按其名称调用它并定义要更改的规则
nft chain <table_address_family> <table_name> <chain_name> { type <type> hook <hook> priority <priority> \; policy <policy> \; }
删除链
和删除表一样通过delete参数
nft delete chain 族类型 表名 链名
刷新来自链的规则
清空指定表中特定链的所有规则,但保留该链的结构和配置
nft flush chain 族类型 表名 链名
举例
定义一个表为filter-table,定义一个链为input-chain,设置类型为filter,hook为input,优先级为-10

此时需要将该链默认动作指定为drop,应该怎么做呢?
通过如下方式可以实现,但是该命令的后果将会直接拒绝所有input的数据包,切记不可随意配置。该动作就相当于我们iptables中默认的filter链中INPUT表的默认动作。
nft chain ip filter-table input-chain '{ type filter hook input priority -10 ; policy drop ; }'
规则
规则定义对通过包含此规则的链的数据包执行的操作。规则由表达式或语句构成,并包含在链中。如果规则还包含匹配表达式,则 nftables
仅在所有之前的表达式都应用时才执行操作。
添加规则
nft add rule <table_address_family> <table_name> <chain_name> <rule>
此命令在链的末尾附加新规则。
如果要在链的开头添加一条规则,请使用 nft insert 命令而不是 nft add
指定位置添加规则
在iptables中我们可以通过在rule前面添加序号来删除增加规则和设置匹配顺序,在nftables中同样也可以通过该方式实现,那么就是handle参数
nft add rule <table_address_family> <table_name> <chain_name> <handle> <rule>
如果未指定handle值,则默认在最后添加规则
如果要在指定位置插入规则,则需要使用如下命令
nft insert rule <table_address_family> <table_name> <chain_name> <handle> <rule>
此时如果未指定handle值,则在链开头添加规则
查看规则
nft list chain 族类型 表名 链名
nft --handle list chain 族类型 表名 链名
nft -a list chain 族类型 表名 链名
通过-a/--handle参数可以查看携带handle值的规则信息
删除规则
单个规则只能通过handle删除。
nft delete rule <table_address_family> <table_name> <chain_name> handle x
通过对应的handle值删除对应的规则
刷新规则
# nft flush table 表名
# nft flush chain 族类型 表名 链名
举例

拒绝192.168.140.248访问本机80端口

测试访问

规则顺序测试




总结
上面所介绍的就是nftables基本的表、链、规则的创建和管理,如果熟悉iptables的配置方式的话,那么nftables的配置逻辑理解起来还是相对比较容易的。大家可以多做实验理解表、链、规则的相关性和其互相的关系,如果不是非常清楚,可以参考iptables部分相关的文章。