nftables 删除规则而不传递句柄(类似于 iptables 删除)

nftables 删除规则而不传递句柄(类似于 iptables 删除)

iptables 的删除语法要简单得多。如果我们用删除替换“追加”,我们会得到删除规则的命令。

nftable 为少数规则管理方面提供了类似的构造,例如

  1. 添加表和删除表(对称添加和删除)
  2. 添加链和删除链(对称添加和删除)

我的查询是

  1. 是否有任何理由/理由不提供相同的添加规则和删除规则?
  2. 有没有更方便的方法来删除规则(除了抓取句柄并使用句柄删除规则

非常感谢

答案1

我能想到的一个理由是删除规则时的成本与添加规则时的成本相同。

iptables(遗留)由于错误的原因,这也是相同的成本:添加或删除单身的规则强制传输所有的来自内核的规则集,在用户态中编辑它(iptables命令)并再次将整个规则集放回内核中。因此,向包含 1000000 条规则的规则集中添加一条规则无论如何都需要处理 1000000+1 条规则。iptables-nft,同时使用nftables内核 API 作为后端,别无选择,只能兼容,因此当要求删除规则并执行用户态工作时,必须检索超出需要的内容。

nftables,当添加规则时,只有这个规则被发送到内核,然后内核将发回其句柄(但使用索引可能需要额外的工作)。向具有 1000000 条规则的链添加 1 条规则不会产生与已存在的这 1000000 条规则相关的额外成本。要按内容删除规则,需要检索至少整个链并对其进行解析直至找到,可能需要解析 1000000 条规则。虽然解析对于显示来说很好,但在执行需要快速的操作时应尽可能避免这种情况。拥有独特的手柄会更快。我想这个决定是为了避免这种运行时成本而牺牲了管理方法。

现在,根据问题的不同,有多种方法可以不必依赖删除按内容

  • 将数据与代码分开(首选)

    使用命名,地图虚拟地图允许保留将使用动态数据的静态规则:那么在典型的运行时使用中不需要添加或删除规则,而只需添加或删除元素元素查找(在数据包路径遍历期间)和操作(在设置或动态使用期间(例如:实时将地址列入黑名单的工具,例如失败2禁止) ) 针对此用途进行了优化(在后台进行了适当的散列等),并且操作不是通过句柄而是通过内容完成。

    同样地,iptables可以利用IP集出于同样的目的,但是nftables更通用通常允许与这些数据结构进行更多的交互iptablesIP集

  • 创建句柄后立即存储(在程序或脚本执行期间)句柄。

    nft --echo --handle ...无论何时添加,都会回显规则及其句柄。对于--jsonJSON 输出,可以更轻松地使用它进行自动化操作。该工具可以做什么iptables在用户空间中也在做:找到一个匹配规则来找出句柄,但可能以一种更简单的方式,因为这将是一个定制的用途。

  • 将规则拆分为特定的常规(用户)链

    正如可能的那样iptables,使用专用链,其作用是拥有数据而不是代码。然后要重建它们,首先刷新它们并从外部数据源将它们填充回来。作为nftables操作可以是原子的(当使用 时nft -f ...),不会出现临时的行为不当的规则集。

    仍然最好使用/地图/虚拟映射相反:数据包将线性遍历具有所有规则的链,因此遍历具有 n 条规则尝试匹配此数据包的链的平均查找时间为 O(n),而/地图/虚拟映射(从单个规则调用)被散列并获得更快的遍历:平均查找时间为 O(1)。

相关内容