无法刷新 nftable 元素的集合



我实际上正在学习在测试环境中使用nftables,并且我实际上正在使用nftables-set。我使用的是0.7版本,由于我的测试不起作用,我更新到了0.9.4版本,但我的问题仍然存在。

我可以在我的桌子上创建我的集合,没有任何问题。我的集合元素必须包含ipv4地址。我处理nftables表、链和集合没有问题,我的规则有效等等

因此,我想做但找不到如何做到这一点的是,在不逐个精确确定ipv4地址的情况下删除我集合的所有元素。

假设我的表的名称是test,而我的集合名称是tmp并具有ipv4_addr类型,我的配置将如下所示:

table ip test {
set tmp {
type ipv4_addr
}
}

我可以用这个命令成功地将元素添加到这个集合中:

nft add element ip test tmp { 10.10.10.10 }

现在我想做的是删除集合中的所有元素,我查看了nft的手册页,它说我可以用flush命令从集合中清除所有元素:

SETS
[...]
flush    Remove all elements from the specified set.

所以我尝试了这个命令来从我的集合中删除我的所有元素:

nft flush set test tmp

但它返回给我这个错误:

Error: Could not process rule: Invalid argument
flush set test tmp
^^^^^^^^^^^^^^^^^^^

我用同样的方式尝试了很多命令(在设置之前添加表,而不是精确处理表(,它总是给我返回一个错误,但不是每次都一样。

我想我一定做错了什么,但我不知道是什么。你有什么想法吗?我会非常感激的!

也许我的整体配置不好,我一定不能那样想布景?

如果不能从集合中清除元素,有没有办法从集合中删除所有元素(除了定义标志超时(?

很抱歉,如果我的信息不清楚,我是法国人,用其他语言描述问题有点困难。。。

谢谢!

谨致问候。

所以我联系了netfilter团队并给了我答案。

一个集合的flush选项只适用于Linux 4.10以后的版本,我的版本在下面。

如果你感兴趣的话,我在Debian上找到了一种用这些命令刷新表格的方法:

将集合中的元素存储在变量中:

elements=$(nft list set test tmp | awk '/{ /,/}/' | cut -d '=' -f 2)

使用删除命令删除元素

nft delete element test tmp ${ip_elements}

希望它能帮助一些人。

如果您使用nft脚本进行原子更新功能,您也可以将您的集合作为变量存储在该脚本中。

使用命名集,您可以执行类似的操作

#!/usr/sbin/nft -f
flush set ip test tmp
table ip test {
set tmp {
type ipv4_addr
elements = { 10.10.10.10 }
}
chain somechain {
type filter hook input priority 0; policy accept
ip saddr @tmp meta nftrace set 1
}
}

但既然这不起作用,你可以改为

define tmp = { 10.10.10.10 }
flush chain ip test somechain
table ip test {
chain somechain {
type filter hook input priority 0; policy accept
ip saddr $tmp meta nftrace set 1
}
}

这保持了使用命名集的可读性,但在执行时会将其转换为内联匿名集。

这将更新整个规则,从而"刷新"集合中的旧值。

当然,这需要规则在一个链中,您可以在每次运行时刷新和重新创建。

相关内容

  • 没有找到相关文章

最新更新