0

我实际上正在学习在测试环境中使用 nftables,并且我实际上正在使用 nftables 集。我使用的是 0.7 版,由于我的测试无法正常工作,我更新到 0.9.4 版,但我的问题仍然相同。

我可以毫无问题地在我的桌子上创建我的套装。而且我的集合元素必须包含 ipv4 地址。我使用 nftables 表、链和集合没有问题,我的规则有效等等......

所以我想做但找不到怎么做的是删除我所有的集合元素,而不是一一精确的ipv4地址。

假设我的表名称是test并且我的设置名称是tmp类型为 ipv4_addr,我的配置将如下所示:

table ip test {
        set tmp {
                type ipv4_addr
        }
}

我可以使用以下命令成功地将元素添加到该集合中:

nft add element ip test tmp { 10.10.10.10 }

现在我要做的是删除我的集合中的所有元素,我查看了 nft 的手册页,它说我可以使用 flush 命令刷新集合中的所有元素:

SETS
[...]
flush    Remove all elements from the specified set.

所以我尝试了这个命令从我的集合中删除我的所有元素:

nft flush set test tmp

但它返回给我这个错误:

Error: Could not process rule: Invalid argument
flush set test tmp
^^^^^^^^^^^^^^^^^^^

我以相同的方式尝试了很多命令(在设置之前添加表格,而不是精确表格),它总是返回错误,但并非每次都相同。

我想我一定做错了什么,但我不知道是什么。如果你有任何想法,请?我将非常感谢!

也许我的整体配置不好,我不能这样想套?

如果无法从集合中刷新元素,有没有办法从集合中删除所有元素(除了定义标志超时)?

抱歉,如果我的信息不清楚,我是法语,用另一种语言来描述问题有点困难......

谢谢!

问候。

4

2 回答 2

1

所以我联系了netfilter团队并给了我一个答案。

一组的刷新选项仅适用于 Linux 4.10 及以后的版本,我的版本低于此版本。

如果您有兴趣,我找到了一种在 Debian 上使用这些命令刷新表的方法:

将集合中的元素存储在变量中:

elements=$(nft list set test tmp | awk '/{ /,/}/' | cut -d '=' -f 2)

使用 delete 命令删除元素

nft delete element test tmp ${ip_elements}

希望它会帮助一些人。

于 2020-04-30T12:11:37.787 回答
0

如果您将 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
  }
}

这保持了使用命名集的可读性,但它在执行时转换为内联匿名集。

这会更新整个规则,从而“刷新”集合中的旧值。

当然,这要求规则位于一个链中,您可以在每次运行时刷新和重新创建。

于 2020-06-03T15:19:53.547 回答