使用 fail2ban 阻止所有恶意 nginx 连接

使用 fail2ban 阻止所有恶意 nginx 连接

最近,对我的服务器的攻击大幅增加,这使我切换到更积极的 fail2ban 阻止策略。为了减少传入连接的数量,我还重新配置了 nginx(针对明显恶意的请求):

keepalive_requests 0;
keepalive_timeout 0;

return 444;

(...)

error_page 400 500 502 503 504 =444 /444.html;

location /444.html {
    return 444;
}

因此,如果没有响应,下一个连接或请求就不会立即发送,并且 nginx 不会返回任何对攻击者有用的信息。

由于它们经常扫描端口,我还在 fail2ban 中添加了一个过滤器,禁止它们使用所有端口和协议,从而避免进一步的连接:

enabled = true
maxretry = 1
bantime = 1d
port = all
banaction = %(banaction_allports)s[blocktype=DROP,protocol=all]

但现在我注意到 nginx 正在收集越来越多的已建立连接,但并未关闭它们。它们都是被 fail2ban 阻止的连接。

一方面,这有效地减少了尝试的次数(在 DROP 之前进行监控),另一方面,我必须不时重新启动 nginx 以清除所有这些被阻止但打开的连接。

我正在寻找一种更好的方法来实现这一点,无需重新启动服务或类似的想法即可断开这些连接。在 Debian Buster 上结合使用 nginx/1.14.2 与 fail2ban/0.11.1。

提前致谢!

编辑1:

澄清一下:被 fail2ban 禁止的 IP 存在相当多的 FIN-WAIT-1、LAST-ACK 以及 ESTAB 连接。ESTAB 连接似乎停留在那里很长时间(甚至可能直到禁令被撤销?)。我的总体想法是通过模仿缺席主机来防止他们在这个 IP 上花费更多时间,并减少我在服务器上的网络资源使用量。

我尝试了conntrack -D -s <ip>@Danila Vershinin 评论链接中建议的方法,但切换到了ss -K dst <ip>额外的 fail2ban 操作。但这只对已建立的连接有效,而且奇怪的是,并没有删除所有连接。

答案1

另一方面,我必须不时重新启动 nginx 来清除所有这些被阻止但打开的连接。

对我来说这看起来不像是 nginx 或 fail2ban 的问题。

我猜没有开放,而是半关闭的已建立连接。通常,它们会在系统超时后消失(与您的网络子系统配置有关),但如果它们变得很多,那确实可能是一个问题。
您可以尝试重新配置网络子系统以更好地处理 TIME-WAIT 状态,例如调整一些 sysctl 值(keepidlekeepinittimekeepintvl),禁用套接字延迟,重用或回收 TW 计划连接等 pp),例如参见应对繁忙的 Linux 服务器上的 TCP TIME-WAIT 状态

您还可以尝试改变在 fail2ban 中拒绝连接的方式,例如尝试REJECT --reject-with tcp-reset而不是DROP(请参阅此评论了解主题丢弃与拒绝或者我的PoC FW.IDS-DROP-vs-REJECT)。

我正在寻找一种更好的方法来实现这一点,无需重新启动服务或采取类似的想法即可断开这些连接。

您还可以使用 tcpkill 或 cutter 扩展 fail2ban jail 的操作。
请参阅https://github.com/fail2ban/fail2ban/issues/2107#issuecomment-379722469例如。

答案2

首先我强烈建议配置您的iptables

如果这些机器人正在扫描端口,您应该丢弃除特定端口之外的所有流量,例如 22、80、443 等。

相关内容