nftables ip 设置多个表

Mar*_*ark 6 linux nftables

用例:我今天有一个使用 iptables 的家用路由器。我正在研究转换为 nftables,因为它看起来更易于管理许多规则。

我今天在 iptables 下设置的一件事是“country-block”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 */ }
  }
}
Run Code Online (Sandbox Code Playgroud)

这很好加载。现在我想在我的防火墙过滤器中使用它。我在主配置文件“table inet filter”中定义了一个表。在这里我想添加规则:

ip saddr @country-block drop
Run Code Online (Sandbox Code Playgroud)

在我所有的谷歌搜索答案之后,这是我找到的引用 ip 集的唯一方法。不幸的是,这会引发错误:

Error: Could not process rule: Set 'country-block' does not exist
Run Code Online (Sandbox Code Playgroud)

我尝试引用“country-block@country-block”,希望它可以解析为我创建的 country-block 命名空间,但这不起作用:

Error: syntax error, unexpected drop
   ip saddr country-block@country-block drop
                                        ^^^^
Run Code Online (Sandbox Code Playgroud)

有谁知道引用不同表中的集合的方法吗?我不想把我的所有集合折叠到我的单个“过滤器”表中,并将它们全部保存在一个文件中——这将是多么丑陋的一团糟。

附:我试图标记这个“nftables”,但显然它是一个新标签,我没有创建新标签所需的代表。有需要代表的好心人可以适当地标记一下吗?

Mar*_*ark 9

在询问他们的邮件列表后,我收到了 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
    }
Run Code Online (Sandbox Code Playgroud)

但值得注意的是,在撰写本文时 (2016-12-21),这需要从 nftables 的最新源代码构建的 nft 命令行实用程序,因为此时可用的最新版本 (nftables v0.6) 将使用上述配置抛出错误。nftables 有一个很好的 wiki,概述了如何从源代码构建和安装,尽管我不认为在新版本发布并进入所有各种发行版后的几个月内这将是必要的。