如何在集合元素过期之前使用 nft 刷新其超时/过期值?
将现有元素添加到集合不会重置超时/过期值:
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
答案1
尽管原子规则替换已记录:
原子规则替换
您可以使用该
-f
选项自动更新规则集:% nft -f file
没有明确记录元素替换,但这实际上只是规则替换的一个例子。人们可以在引入的单个原子事务中删除并重新添加元素-f
:这将用较新的条目及其更新的到期时间替换较旧的条目,而不会导致元素暂时丢失。
nft
因此,不要执行以下操作,因为在两次调用之间,元素将暂时不存在,并且依赖于该集合的规则将暂时不匹配,因此这不是原子的:
# nft delete element ip mytable myset '{ 10.10.10.1 }'
# nft add element ip mytable myset '{ 10.10.10.1 timeout 60s expires 60s }'
这应该使用-f
和输入文件(-
代表标准输入计为有效输入文件):
# nft -f - <<'EOF'
delete element ip mytable myset { 10.10.10.1 }
add element ip mytable myset { 10.10.10.1 timeout 60s }
EOF
由于这是一个原子变化,因此元素永远不会消失。
与往常一样不育系构造,如果想要幂等地执行此操作,而不必知道元素是否已经存在,并且不触及其他元素,则应该添加、删除并重新添加它,因为虽然添加现有元素不是错误,但删除缺失元素将是一个错误:
# nft -f - <<'EOF'
add element ip mytable myset { 10.10.10.1 }
delete element ip mytable myset { 10.10.10.1 }
add element ip mytable myset { 10.10.10.1 timeout 60s }
EOF
它仍然是一个单一的原子事务。
补充笔记
-
从数据包路径执行此操作时,存在一个区别,
add @myset
即仅在创建新元素时设置超时,但不会更新已经存在的元素的超时,从而允许它稍后在其整个持续时间内超时,以及update @myset
在所有情况下设置超时。 原子规则更新不仅限于元素,还可以在任何级别使用
例如,如果有一个需要关注的元素,则可以在集合级别执行相同的操作:
# nft -f - <<'EOF' add set ip mytable myset { type ipv4_addr; flags timeout; } delete set ip mytable myset add set ip mytable myset { type ipv4_addr flags timeout elements = { 127.0.0.1 timeout 1m } } EOF
实际上,上述示例很可能会失败,因为可能存在引用该集合的规则,因此即使在事务期间也不允许删除它(也可以改写整个表,使用
add table ip mytable
,delete table ip mytable
,add table ip mytable { ...
)。如果已知该集合之前存在,则在添加回单个元素之前刷新它就足够了:# nft -f - <<'EOF' flush set ip mytable myset add element ip mytable myset { 127.0.0.1 timeout 1m } EOF
当然,可以使用实际文件来代替- <<'EOF'
...。EOF