配置表

nftables 中,表是的容器。所以开始使用 nftables 时你首先需要做的是添加至少一个表。然后,你可以向你的表里添加,然后往链里添加规则

在我们继续之前,让我们重点看看表对象。

相比比较熟悉的 iptables,主要的区别是没有预定义的表了(例如,没有 filterrawmanglenatsecurity 表了)。所以我们创建的任何表初始时都是的。

在我们写这篇文章时,有 6 种不同类型的表,它们是:

  • ip
  • arp
  • ip6
  • bridge
  • inet,这在 Linux 内核 3.14 之后可用。这个特殊的表是 IPv4 和 IPv6 混合使用的表,这对简化混合栈防火墙的管理有帮助。因此,你在 inet 表中注册的链在 IPv4 和 IPv6 中都能看到。
  • netdev,这在 Linux 内核 4.2 之后可用。它有一个进入时的钩子,你可以使用它注册一个链以便在路由之前更早的阶段进行过滤,它是已存在的 tc 的替代。

添加表

添加一个表的语法如下:

% nft add table [<family>] <name>

为了添加一个 IPv4 的 foo 表,你需要使用下面的命令:

% nft add table ip foo

请注意,在这个例子中,family 参数是可选的,因为如果你不指定 family,它就会假设是 IPv4。

如果你想添加 IPv6 表,你需要使用下面的命令:

% nft add table ip6 bar

列出表

你可以列出所有存在的表

% nft list tables
table ip foo
table ip6 bar

你也可以列出每个族的表:

% nft list tables ip
table ip foo

然后你可以列出表的内容:

% nft list table ip filter
table ip filter {
}

如我们所说,任何表最初都是空的,这是很正常的,因为在 iptables 里表一开始也没有预定义的

删除表

你也可以使用下面的命令删除表:

% nft delete table ip foo

故障处理:从 Linux 内核 3.18 开始,你可以用这个命令删除表和它的内容。然而,在这之前,你需要先删除表中的内容,否则你将会遇到下面的错误:

% nft delete table filter
<cmdline>:1:1-19: Error: Could not delete table: Device or resource busy
delete table filter
^^^^^^^^^^^^^^^^^^^

清空表

你可以使用下面的命令删除表中所有的规则:

% nft flush table ip filter

这删除了表中每一个你注册的链中的所有规则。