配置表
在 nftables
中,表是链的容器。所以开始使用 nftables
时你首先需要做的是添加至少一个表。然后,你可以向你的表里添加链,然后往链里添加规则。
在我们继续之前,让我们重点看看表对象。
相比比较熟悉的 iptables
,主要的区别是没有预定义的表了(例如,没有 filter
,raw
,mangle
,nat
和 security
表了)。所以我们创建的任何表初始时都是空的。
在我们写这篇文章时,有 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
这删除了表中每一个你注册的链中的所有规则。