如何在 nftables 中刷新设置元素超时?

如何在 nftables 中刷新设置元素超时?

如何在集合元素过期之前使用 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

相关内容