我的 Flowtable 卸载在我的路由器上运行得非常完美。有时我想阻止一些正在进行的流量,通过流表处理。如果我向常规路由处理添加新的阻止规则,它对活动的卸载连接没有影响。因此,在添加一些新规则后,我想刷新流表的哈希以使其再次重建。但如何呢?我还没有找到任何使用 nft 命令来清空卸载连接的方法。我可以销毁流表并重新创建,但是没有更好的方法吗?
答案1
卸载的流量仍然与连线具有该属性的条目[OFFLOAD]
(卸载的条目有默认的 30 秒不活动超时,并恢复为非卸载的 conntrack 条目,此时没有看到流量,直到它们有机会(流量)再次卸载)。要删除 flowtable 条目,请使用 删除 conntrack 条目conntrack -D
。
更新:此功能已随此提供犯罪:
netfilter: ctnetlink: 支持卸载的 conntrack 条目删除
目前,卸载的 conntrack 条目(流)只能在通过超时、tcp 状态更改或 tc ct 规则删除从卸载中删除后才能删除。对于希望手动删除或刷新现有条目的用户来说,这可能会导致问题。
并且需要内核 6.4 或足够新的内核LTS 6.1.x(~ >= 6.1.32) 已通过提交中的参考示例向后移植:
Example usage: # Delete all offloaded (and non offloaded) conntrack entries # whose source address is 1.2.3.4 $ conntrack -D -s 1.2.3.4 # Delete all entries $ conntrack -F
以下 LTS 内核也有提交,请确保正在使用足够新的内核:4.19,5.4,5.10,5.15。
在较旧的内核上,尝试删除此类连线条目将返回 EBUSY(可以看出,在提交中删除了此错误)。
删除所有且仅删除[OFFLOAD]
条目的最简单方法是:
conntrack -D --status OFFLOAD
或为了硬件卸载(未测试)将是:
conntrack -D --status HW_OFFLOAD
但这并不完全可靠,因为流可能在错误的时间恢复到非卸载状态,因此最好不要成为移除过滤器的一部分。使用附加属性连线conntrack -L ...
应该首选删除此类条目的条目(如 所示),例如协议、源地址、端口等。
所以像这样的工具失败2禁止这将在通常的 ESTABLISHED 状态规则之前将条目添加到设置的黑名单中,可能必须提供 5-uple(以删除单个流)或仅提供源地址(以删除该地址的所有相关流)。例如,要当前(或不)以 OFFLOAD 状态阻止(原始)源 192.0.2.11,除了更新丢弃规则使用的一组之外,还可以运行(无需特别关心 OFFLOAD 状态):
conntrack -D -s 192.0.2.11