如何在集合元素过期之前用 nft 刷新它的超时/过期值?
将现有元素添加到集合中不会重置 timeout/expires 值:
nft add element ip mytable myset { 10.10.10.1 timeout 60s }
# wait 10s
nft add element ip mytable myset { 10.10.10.1 timeout 60s expires 60s }
nft list set ip mytable myset
使用 iptables/ipset 我可以通过添加现有元素来刷新超时:
ipset add myset 10.10.10.1 timeout 60
# wait 10s
ipset add myset 10.10.10.1 -exist timeout 60
ipset list myset
虽然记录了原子规则替换:
它没有明确记录元素替换,但这实际上只是规则替换的一种情况。可以在引入的单个原子事务中删除和添加元素
-f
:这将用新条目及其更新的过期时间替换旧条目,而不会暂时丢失元素。因此,不要执行以下操作,这不是原子的,因为在两次调用之间
nft
,元素将暂时不存在,并且取决于此集合的规则将暂时不匹配:这应该使用
-f
输入文件(-
代表标准输入算作有效输入文件)来完成:元素永远不会停止存在,因为它是原子变化。
与此nft构造一样,如果想要幂等地执行此操作,而不必知道元素是否已经存在,并且不触及其他元素,则应该添加、删除和重新添加它,因为在添加现有元素时不会t 一个错误,删除一个缺失的元素将是一个错误:
它仍然是一个单一的原子事务。
补充说明
从数据包路径
从数据包路径执行此操作时,两者之间存在区别,
add @myset
仅在创建新元素时设置超时,但不会更新现有元素的超时,允许它稍后在其整个持续时间内超时,并且update @myset
确实设置在所有情况下超时。原子规则更新不仅限于元素,还可以在任何级别使用
例如,如果需要关注单个元素,则可以在集合级别执行相同的操作:
实际上,上面的示例可能会失败,因为可能存在引用该集合的规则,因此即使在事务期间也不允许将其删除(可以用
add table ip mytable
,delete table ip mytable
,类似地重写整个表add table ip mytable { ...
)。如果已知该集合之前存在,则在添加回单个元素之前刷新它就足够了:当然,可以使用实际文件代替
- <<'EOF'
...EOF
。