iptables 的删除语法要简单得多。如果我们用删除替换“追加”,我们会得到删除规则的命令。
nftable 为少数规则管理方面提供了类似的构造,例如
- 添加表和删除表(对称添加和删除)
- 添加链和删除链(对称添加和删除)
我的查询是
- 是否有任何理由/理由不提供相同的添加规则和删除规则?
- 有没有更方便的方法来删除规则(除了抓取句柄并使用句柄删除规则
非常感谢
答案1
我能想到的一个理由是删除规则时的成本与添加规则时的成本相同。
和iptables(遗留)由于错误的原因,这也是相同的成本:添加或删除单身的规则强制传输所有的来自内核的规则集,在用户态中编辑它(iptables命令)并再次将整个规则集放回内核中。因此,向包含 1000000 条规则的规则集中添加一条规则无论如何都需要处理 1000000+1 条规则。iptables-nft,同时使用nftables内核 API 作为后端,别无选择,只能兼容,因此当要求删除规则并执行用户态工作时,必须检索超出需要的内容。
和nftables,当添加规则时,只有这个规则被发送到内核,然后内核将发回其句柄(但使用索引可能需要额外的工作)。向具有 1000000 条规则的链添加 1 条规则不会产生与已存在的这 1000000 条规则相关的额外成本。要按内容删除规则,需要检索至少整个链并对其进行解析直至找到,可能需要解析 1000000 条规则。虽然解析对于显示来说很好,但在执行需要快速的操作时应尽可能避免这种情况。拥有独特的手柄会更快。我想这个决定是为了避免这种运行时成本而牺牲了管理方法。
现在,根据问题的不同,有多种方法可以不必依赖删除按内容。
将数据与代码分开(首选)
使用命名套,地图和虚拟地图允许保留将使用动态数据的静态规则:那么在典型的运行时使用中不需要添加或删除规则,而只需添加或删除元素。元素查找(在数据包路径遍历期间)和操作(在设置或动态使用期间(例如:实时将地址列入黑名单的工具,例如失败2禁止) ) 针对此用途进行了优化(在后台进行了适当的散列等),并且操作不是通过句柄而是通过内容完成。
同样地,iptables可以利用IP集出于同样的目的,但是nftables更通用通常允许与这些数据结构进行更多的交互iptables和IP集。
创建句柄后立即存储(在程序或脚本执行期间)句柄。
nft --echo --handle ...
无论何时添加,都会回显规则及其句柄。对于--json
JSON 输出,可以更轻松地使用它进行自动化操作。该工具可以做什么iptables在用户空间中也在做:找到一个匹配规则来找出句柄,但可能以一种更简单的方式,因为这将是一个定制的用途。将规则拆分为特定的常规(用户)链
正如可能的那样iptables,使用专用链,其作用是拥有数据而不是代码。然后要重建它们,首先刷新它们并从外部数据源将它们填充回来。作为nftables操作可以是原子的(当使用 时
nft -f ...
),不会出现临时的行为不当的规则集。仍然最好使用放/地图/虚拟映射相反:数据包将线性遍历具有所有规则的链,因此遍历具有 n 条规则尝试匹配此数据包的链的平均查找时间为 O(n),而放/地图/虚拟映射(从单个规则调用)被散列并获得更快的遍历:平均查找时间为 O(1)。