![使用 fail2ban 阻止所有恶意 nginx 连接](https://linux22.com/image/751023/%E4%BD%BF%E7%94%A8%20fail2ban%20%E9%98%BB%E6%AD%A2%E6%89%80%E6%9C%89%E6%81%B6%E6%84%8F%20nginx%20%E8%BF%9E%E6%8E%A5.png)
最近,对我的服务器的攻击大幅增加,这使我切换到更积极的 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 值(keepidle
、keepinittime
、keepintvl
),禁用套接字延迟,重用或回收 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 等。