无法刷新 nftable 元素的集合
Cannot flush nftable element's set
我实际上正在学习在测试环境中使用 nftables,并且我实际上正在使用 nftables 集。
我使用的是 0.7 版,由于我的测试无法正常工作,我更新到 0.9.4 版,但我的问题仍然相同。
我可以毫无问题地在 table 上创建我的集合。我的集合元素必须包含 ipv4 地址。
我使用 nftables tables,链条和集合没有问题,我的规则有效等等...
所以我想做但找不到如何做的是删除我集合的所有元素,而不是一一精确的 ipv4 地址。
假设我的 table 的名字是 test 并且我的设定名称是 tmp ipv4_addr 类型,我的配置将如下所示:
table ip test {
set tmp {
type ipv4_addr
}
}
我可以使用此命令成功将元素添加到此集合中:
nft add element ip test tmp { 10.10.10.10 }
现在我想做的是删除我集合中的所有元素,我查看了 nft 的手册页,它说我可以使用刷新命令从我的集合中刷新所有元素:
SETS
[...]
flush Remove all elements from the specified set.
所以我尝试了这个命令来删除我的集合中的所有元素:
nft flush set test tmp
但是 returns 我这个错误:
Error: Could not process rule: Invalid argument
flush set test tmp
^^^^^^^^^^^^^^^^^^^
我以同样的方式尝试了很多命令(在设置之前添加 table,而不是精确地 table),它总是 returns 我出错,但不是每次一样。
我想我一定做错了什么,但我不知道是什么。如果你有什么想法好吗?我将不胜感激!
可能是我整体配置不好,总不能这么想套吧?
如果无法清除集合中的元素,是否有办法删除集合中的所有元素(除了定义标志超时之外)?
抱歉,如果我的信息不清楚,我是法国人,用其他语言描述问题有点困难...
谢谢!
此致。
于是我联系了netfilter团队,给了我答复。
set 的 flush 选项仅适用于 Linux 4.10 之后,我的版本低于此。
如果您有兴趣,我找到了一种在 Debian 上使用这些命令刷新 table 的方法:
将集合中的元素存储在变量中:
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
}
}
这保持了使用命名集的可读性,但在执行时会转换为内联匿名集。
这会更新整个规则,因此 "flushes" 集合中的旧值。
当然,这要求规则在一个链中,您可以在每个 运行.
上刷新和重新创建
我实际上正在学习在测试环境中使用 nftables,并且我实际上正在使用 nftables 集。 我使用的是 0.7 版,由于我的测试无法正常工作,我更新到 0.9.4 版,但我的问题仍然相同。
我可以毫无问题地在 table 上创建我的集合。我的集合元素必须包含 ipv4 地址。 我使用 nftables tables,链条和集合没有问题,我的规则有效等等...
所以我想做但找不到如何做的是删除我集合的所有元素,而不是一一精确的 ipv4 地址。
假设我的 table 的名字是 test 并且我的设定名称是 tmp ipv4_addr 类型,我的配置将如下所示:
table ip test {
set tmp {
type ipv4_addr
}
}
我可以使用此命令成功将元素添加到此集合中:
nft add element ip test tmp { 10.10.10.10 }
现在我想做的是删除我集合中的所有元素,我查看了 nft 的手册页,它说我可以使用刷新命令从我的集合中刷新所有元素:
SETS
[...]
flush Remove all elements from the specified set.
所以我尝试了这个命令来删除我的集合中的所有元素:
nft flush set test tmp
但是 returns 我这个错误:
Error: Could not process rule: Invalid argument
flush set test tmp
^^^^^^^^^^^^^^^^^^^
我以同样的方式尝试了很多命令(在设置之前添加 table,而不是精确地 table),它总是 returns 我出错,但不是每次一样。
我想我一定做错了什么,但我不知道是什么。如果你有什么想法好吗?我将不胜感激!
可能是我整体配置不好,总不能这么想套吧?
如果无法清除集合中的元素,是否有办法删除集合中的所有元素(除了定义标志超时之外)?
抱歉,如果我的信息不清楚,我是法国人,用其他语言描述问题有点困难...
谢谢!
此致。
于是我联系了netfilter团队,给了我答复。
set 的 flush 选项仅适用于 Linux 4.10 之后,我的版本低于此。
如果您有兴趣,我找到了一种在 Debian 上使用这些命令刷新 table 的方法:
将集合中的元素存储在变量中:
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
}
}
这保持了使用命名集的可读性,但在执行时会转换为内联匿名集。
这会更新整个规则,因此 "flushes" 集合中的旧值。
当然,这要求规则在一个链中,您可以在每个 运行.
上刷新和重新创建