使用案例:我今天有一个使用 iptables 的家庭路由器。我正在研究转换为 nftables,因为它对于很多规则来说看起来更易于管理。
我今天在 iptables 下设置的一件事是“国家块”ipset,其中包含国家 CIDR 块,涵盖了大多数随机端口探测/黑客尝试。不幸的是,nftables 无法直接使用我现有的 ipset,但将其转换为 nftables ip 集相当简单。
问题:为了避免出现一个巨大的 nftables 文件,我选择将“国家/地区”集分离到一个单独的文件中。 nftables 可以轻松包含其他文件,因此这似乎完全符合 nftables 的预期行为。我将我的国家/地区定义如下:
table ip country-block {
set country-block {
type ipv4_addr;
flags interval;
elements = { /* CIDR blocks here */ }
}
}
这加载得很好。现在我想在我的防火墙过滤器中使用它。我在主配置文件“table inet filter”中定义了一个表。这里我想添加规则:
ip saddr @country-block drop
在我用谷歌搜索答案之后,这是我找到的引用 ip 集的唯一方法。不幸的是,这会引发错误:
Error: Could not process rule: Set 'country-block' does not exist
我尝试引用“country-block@country-block”,希望它可以解析为我创建的国家块命名空间,但这不起作用:
Error: syntax error, unexpected drop
ip saddr country-block@country-block drop
^^^^
有谁知道如何引用不同表中的集合?我不想将所有集合折叠到我的单个“过滤器”表中并将它们全部维护在一个文件中 - 这将是多么丑陋的一团糟。
附注我尝试标记此“nftables”,但显然这是一个新标签,而且我没有创建新标签所需的代表。具有所需代表的好心人可以适当标记此吗?
答案1
在询问 nftables 开发人员的邮件列表后,我收到了回复。简短的回答是不可能引用另一个表中的集。
然而,我至少能够将我的集合存储在一个单独的文件中,并通过 @include 将它们引入。这使得我的 ipset 更易于管理,而不必将它们全部放入一个庞大的配置文件中。语法如下:
# nftables.conf
include "/etc/nftables.country-block"
table inet filter {
set country-block {
type ipv4_addr; flags interval;
elements = $country_block_list
}
}
# nftables.country-block
define country_block_list = {
# comma-separated CIDR blocks here
}
但值得注意的是,截至撰写本文时(2016 年 12 月 21 日),这需要一个从 nftables 最新源代码构建的 nft 命令行实用程序,因为此时可用的最新版本 (nftables v0.6) 将使用上述配置会引发错误。 nftables 有一个相当不错的维基概述如何从源代码构建和安装,尽管我预计几个月后一旦新版本发布并进入所有不同的发行版,这将不再是必要的。