创建一个 IPTABLES 链,除非数据包来自某个端口,否则其规则会被忽略?

创建一个 IPTABLES 链,除非数据包来自某个端口,否则其规则会被忽略?

我想确认以下内容。如果我创建一个链,其第一条规则是:

iptables -I INPUT -p tcp -m multiport --dports 25,465 -j name

这是否意味着,除非数据包来自这些端口,否则不会检查链中任何进一步指定的规则?

我正在使用fail2ban,并且我使用创建了一个带有禁止规则的过滤器,该规则指定了端口 25、465 -m multiport --dports 25,465。但是这个过滤器最终创建了足够多的规则,以至于偶尔该ksoftirqd过程会使用大量 CPU,并且网络会变慢。我注意到当服务器在其他端口上发生大量 I/O 时会发生这种情况。

我假设每个数据包都在查看我链中的所有规则。我希望可以通过添加上面看到的第一个规则来避免这种情况,这样不发送到端口 25 和 465 的数据包就不会费心检查该链中的其余规则。如果这不起作用,我将不胜感激,知道任何其他可能的解决方案。

答案1

不是“来自”而是“到” --dports目的地端口。您编写的规则的意思是:“如果数据包被发送到监听 TCP 端口 25 或 465 的服务,则在链中处理它name”。它将如何处理取决于该链的内容。如果它与任何最后行动ACCEPTREJECTDROP)该链中的规则,或者如果它与带有该操作的规则匹配RETURN,则其处理将在调用链(INPUT)中继续执行该链后面的规则。

默认情况下,fail2ban会创建一个链和一条规则,该规则仅针对发往特定端口的数据包调用该链(除非您使用...-allports非默认操作)。在该链中,它会为每个被禁止的 IP 添加一条 DROP 规则。因此,例如,Web 服务器数据包将不会被发送到为sshd提供的 jail 创建的链进行处理。因此,以您建议的方式故意将某些端口从 fail2ban 处理中“排除”是没有成效的;它已经像这样工作了。

为了避免使用 fail2ban 创建包含过多规则的链,请调查ipset相关行动。它不会创建一个链条,而是f2b-jailname创建一个IP设置匹配的单个规则引用 ipset。每个被禁止的 IP 都会添加到 ipset 中,而不是在链中创建单独的规则。ipset 具有 O(1) 复杂度特性,这意味着它的处理速度不取决于其中的项目数量;它最多可以包含 65536 个项目。

简而言之,要使用它,您需要用覆盖banaction = iptablesjailbanaction = iptables-ipset的默认设置。您永远不应修改发行版提供的配置文件;而是创建/etc/fail2ban/jail.local文件来添加覆盖设置:

[postfix]
bantime = 1h
enabled = true
banaction = iptables-ipset

(这将使用提供的postfix邮件过滤器,并对所有smtpd类型的服务做出反应。如果您使用其他邮件服务器,请进行相应调整。)

实现更好的防火墙效率的另一种方法是开始使用nftables框架,而不是iptables。它具有IP集的特征融合的,您可以使用 将它与 fail2ban 一起使用banaction = nftables。大型集合的效率增益大致相同。

相关内容