![创建一个 IPTABLES 链,除非数据包来自某个端口,否则其规则会被忽略?](https://linux22.com/image/789215/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%20IPTABLES%20%E9%93%BE%EF%BC%8C%E9%99%A4%E9%9D%9E%E6%95%B0%E6%8D%AE%E5%8C%85%E6%9D%A5%E8%87%AA%E6%9F%90%E4%B8%AA%E7%AB%AF%E5%8F%A3%EF%BC%8C%E5%90%A6%E5%88%99%E5%85%B6%E8%A7%84%E5%88%99%E4%BC%9A%E8%A2%AB%E5%BF%BD%E7%95%A5%EF%BC%9F.png)
我想确认以下内容。如果我创建一个链,其第一条规则是:
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
”。它将如何处理取决于该链的内容。如果它与任何最后行动(ACCEPT
,REJECT
,DROP
)该链中的规则,或者如果它与带有该操作的规则匹配RETURN
,则其处理将在调用链(INPUT
)中继续执行该链后面的规则。
默认情况下,fail2ban
会创建一个链和一条规则,该规则仅针对发往特定端口的数据包调用该链(除非您使用...-allports
非默认操作)。在该链中,它会为每个被禁止的 IP 添加一条 DROP 规则。因此,例如,Web 服务器数据包将不会被发送到为sshd
提供的 jail 创建的链进行处理。因此,以您建议的方式故意将某些端口从 fail2ban 处理中“排除”是没有成效的;它已经像这样工作了。
为了避免使用 fail2ban 创建包含过多规则的链,请调查ipset相关行动。它不会创建一个链条,而是f2b-jailname
创建一个IP设置匹配的单个规则引用 ipset。每个被禁止的 IP 都会添加到 ipset 中,而不是在链中创建单独的规则。ipset 具有 O(1) 复杂度特性,这意味着它的处理速度不取决于其中的项目数量;它最多可以包含 65536 个项目。
简而言之,要使用它,您需要用覆盖banaction = iptables
jailbanaction = iptables-ipset
的默认设置。您永远不应修改发行版提供的配置文件;而是创建/etc/fail2ban/jail.local
文件来添加覆盖设置:
[postfix]
bantime = 1h
enabled = true
banaction = iptables-ipset
(这将使用提供的postfix
邮件过滤器,并对所有smtpd
类型的服务做出反应。如果您使用其他邮件服务器,请进行相应调整。)
实现更好的防火墙效率的另一种方法是开始使用nftables
框架,而不是iptables
。它具有IP集的特征融合的,您可以使用 将它与 fail2ban 一起使用banaction = nftables
。大型集合的效率增益大致相同。