nft — 删除元素后无法将其添加回集合(在 OpenVZ 容器中)

nft — 删除元素后无法将其添加回集合(在 OpenVZ 容器中)

我遇到了 Nftables 的奇怪问题,我不明白。

这是导致我的状态的命令序列:

~# nft add table inet firewall
~# nft add set inet firewall blacklist4 \{ typeof ip saddr \; flags interval \; auto-merge \; \}
~# nft add element inet firewall blacklist4 \{ 192.0.2.0/25 \}
~# nft add element inet firewall blacklist4 \{ 192.0.2.128/25 \}
~# nft -a list ruleset
table inet firewall { # handle 0
        set blacklist4 { # handle 0
                typeof ip saddr
                flags interval
                auto-merge
                elements = { 192.0.2.0/25, 192.0.2.128/25 }
        }
}

到目前为止,一切都很好。请注意,它没有自动将/24网络的两半合并为一条记录,这是我所期望的,并且我发现我不是第一个注意到这一点的人:https://www.spinics.net/lists/netfilter/msg58958.html

现在,在这种状态下,它不会让我添加“组合”或“部分”范围元素:

~# nft add element inet firewall blacklist4 \{ 192.0.2.128/26 \}
Error: interval overlaps with an existing one
add element inet firewall blacklist4 { 192.0.2.128/26 }
                                       ^^^^^^^^^^^^^^
Error: Could not process rule: File exists
add element inet firewall blacklist4 { 192.0.2.128/26 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~# nft add element inet firewall blacklist4 \{ 192.0.2.0/24 \}
Error: interval overlaps with an existing one
add element inet firewall blacklist4 { 192.0.2.0/24 }
                                       ^^^^^^^^^^^^
Error: Could not process rule: File exists
add element inet firewall blacklist4 { 192.0.2.0/24 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

因此删除这两个元素并检查:

~# nft delete element inet firewall blacklist4 \{ 192.0.2.0/24 \}
Error: interval not found in set
delete element inet firewall blacklist4 { 192.0.2.0/24 }
                                          ^^^^^^^^^^^^
Error: Could not process rule: No such file or directory
delete element inet firewall blacklist4 { 192.0.2.0/24 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~# nft delete element inet firewall blacklist4 \{ 192.0.2.0/25 \}
~# nft delete element inet firewall blacklist4 \{ 192.0.2.128/25 \}
~# nft -a list ruleset
table inet firewall { # handle 0
        set blacklist4 { # handle 0
                typeof ip saddr
                flags interval
                auto-merge
        }
}

我故意先尝试删除合并的,因为前面说过“文件存在”。但事实证明它只在添加时存在,而在删除时不存在。最后一条命令显示集合为空;现在让我们添加一些东西:

~# nft add element inet firewall blacklist4 \{ 192.0.2.0/24 \}
Error: Could not process rule: File exists
add element inet firewall blacklist4 { 192.0.2.0/24 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~# nft add element inet firewall blacklist4 \{ 192.0.2.0/25 \}
Error: Could not process rule: File exists
add element inet firewall blacklist4 { 192.0.2.0/25 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~# nft add element inet firewall blacklist4 \{ 192.0.2.0/26 \}
Error: Could not process rule: File exists
add element inet firewall blacklist4 { 192.0.2.0/26 }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
~# nft -a list ruleset
table inet firewall { # handle 0
        set blacklist4 { # handle 0
                typeof ip saddr
                flags interval
                auto-merge
        }
}

我无法添加相同的超级块或部分块,它说“文件存在”。为什么?在哪里? list 命令一直说集合是空的。

现在如何添加回来?

可以通过冲洗装置来重置此设置。然而,这个测试集是空的,但在现实生活中它会有其他数据。如果创建的集没有auto-merge.如果我删除flags interval,它会按预期工作,但仅限于单个 IP 地址。

这是OpenVZ系统,3.10.0-1160.42.2.vz7.184.10 #1 SMP Fri Dec 31 04:05:16 MSK 2021 x86_64 GNU/Linux.能和那个联系起来吗?

nft版本是nftables v0.9.8 (E.D.S.),系统是新更新的Debian Bullseye。

相关内容