我实际上正在学习在测试环境中使用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
}
}
这保持了使用命名集的可读性,但在执行时会将其转换为内联匿名集。
这将更新整个规则,从而"刷新"集合中的旧值。
当然,这需要规则在一个链中,您可以在每次运行时刷新和重新创建。