同一 TCP 连接上出现多个 404 错误后阻止 nginx 连接

同一 TCP 连接上出现多个 404 错误后阻止 nginx 连接

我想保护两台服务器免遭盲目探测 URL 的攻击者的攻击。

我的想法是在一定数量的 404 状态代码之后阻止请求。

我可以使用 fail2ban 来做到这一点。

但是其中一台服务器位于反向代理后面我无法控制 然后不传达原始 IP 地址(并且需要很长时间才能处理转发原始 IP 地址的请求),这意味着从 nginx 的角度来看,所有请求都源自反向代理的 IP如果有人引发太多 404 错误,我显然不想阻止所有传入流量。

有没有什么方法(不使用 fail2ban、使用 fail2ban 或使用任何其他工具)可以检测至少 404 错误来自同一个 https 连接并终止此连接或让其对任何后续请求无条件返回 404?

如果我的问题不清楚,请告诉我,我会尝试重新措辞,以提供更多信息。

答案1

您可以设置 Nginx 来缓存响应,包括带有 404 等错误的响应。但是,据我所知,您无法计算错误的数量(但这并不重要)。

这里唯一的问题是,如果您创建新页面,而之前该页面被缓存为 404,则它将无法工作。至少,不会立即工作(取决于您的缓存超时时间)。

但这肯定会有很大帮助。所有本来会转到后端并生成 404 的点击都会在 Nginx 实例处被阻止,并一遍又一遍地返回完全相同的 404 错误。

另一种方法是定义一个位置并运行一个命令(然后可以运行该命令ipset来添加 IP 地址)。例如:

location /phpmyadmin.php {
  content_by_lua_block {
    os.execute("/usr/bin/block-ip.sh")
  } 
}

不过,我不太确定你如何处理多条路径。


我自己的经验fail2ban是它相当慢而且“落后”(不主动)。但是,如果你真的想完全阻止某个 IP 地址,最简单的方法是让你的应用程序向前端发送一条消息,然后你可以在那里运行iptables以阻止该 IP。为此,你需要转发原始 IP,而 Nginx 默认情况下不会这样做,但很容易添加一个X-Forwarded-For标头,然后你的应用程序可以将其发送回你用来将 IP 添加到你的 的小工具iptables。还要注意,你不应该直接将其添加到iptables。相反,你应该使用列表。为此,请查看ipset

如果您无法更改您的应用程序但又想使用fail2ban,您必须检查 Nginx 日志并检测您不喜欢的路径。

答案2

Nginx 有一个limit_req模块,因此您可以使用它作为预过滤。

https://stackoverflow.com/questions/37877242/nginx-limit-req-based-on-http-header对于类似的问题。

例如,通过计算和限制 404 尝试次数(例如在相关错误位置)和/或通过 fail2ban 过滤它们(如果您只记录有限的请求)。这样,您可以减少maxretryfail2banfindtime中的监狱,并可以避免日志中有大量消息导致负载过高(请参阅fail2ban :: wiki / 最佳实践)。

对于过滤器示例(基本上你不需要过滤器,你可以failregex直接在监狱中设置等),请参阅过滤器.d/nginx-limit-req.conf。您还可以将 nginx 配置为记录标头而不是或除了真实 IP 之外。甚至可以使用不同的/结合模块中的不同限制和突发来X-Forwarded-For禁止它们。maxretryfindtimelimit_req

相关内容