当前位置: 首页 > 工具软件 > Fail2ban > 使用案例 >

使用 Fail2ban 保护 Web 服务器免受 DDoS 攻击

暴德运
2023-12-01

任何暴露于公共互联网的服务端点都容易受到黑客的大量攻击。您的服务可能是网站、API 端点或任何其他应用程序层服务。恶意用户和机器人将通过重复发送更高频率的请求来尝试侵入您的系统。在这篇文章中,我将向您简要介绍 DDoS 攻击和使用 Fail2ban 的缓解解决方案。

什么是 DDoS 攻击?

分布式拒绝服务 (DDoS) 攻击是一种恶意尝试,通过来自多个攻击源的大量网络流量来中断特定目标服务器或服务的正常流量。这会导致站点或服务的可用性由于资源耗尽而突然变慢或不可用。

应用层 DDoS 攻击

应用层 DDoS 攻击针对第 7 层(OSI 模型的第 7 层),其中网站在服务器上生成并响应 HTTP 请求而交付。例如,不处理大量并发连接(打开大量连接并保持它们建立)的系统可能会耗尽系统的新连接容量。这类似于同时从许多不同的计算机上一遍又一遍地刷新网页,会产生大量的 HTTP 请求淹没服务器。

这些攻击是由僵尸网络而不是实际用户进行的,攻击者可以很容易地产生大量连接并以更高的频率发送大量请求。这些类型的第 7 层攻击很难防御,因为很难区分恶意流量和合法流量。

应用层 DDoS 攻击如何缓解?

正如我之前提到的,缓解第 7 层攻击有点复杂。缓解涉及丢弃或限制流量的应用层 DDoS 攻击尝试,我们可以轻松实施一些方法,从而获得最大的收益。

对请求的挑战

通过对请求源实施质询以检查它是否是机器人,这就像在线提交在线表单时常见的验证码检查一样。给出诸如 javascript 级别挑战之类的要求,可以减轻许多攻击。

使用 Web 应用程序防火墙 (WAF)

Web 应用程序防火墙是一种安全增强工具,可以通过将其放置在您的 Web 服务器前面来帮助缓解第 7 层 DDoS 攻击。这可能会充当您的 Web 服务器的反向代理,并根据一系列规则保护它免受某些类型的恶意流量。WAF 的一个关键优势是能够快速实施自定义规则以响应攻击。还可以维护 IP 信誉数据库,以便跟踪和有选择地阻止恶意流量。

请求速率限制

请求速率限制是有效 DDoS 缓解策略的重要组成部分。这将限制请求的数量,并且服务器将在某个时间窗口内接受。例如,您知道普通人类用户每秒向您的登录 API 端点提交登录详细信息的次数不能超过五次,那么您可以确定是否有任何用户发送请求的频率高于这可能是恶意尝试。然后,您可以在您的登录 API 端点上定义一个每秒 5 个的速率限制,并锁定/阻止任何违反该规则的客户端 IP。

什么是Fail2ban?

Fail2ban 是一种入侵检测系统 (IDS),它持续扫描日志文件(例如 /var/log/nginx/error.log)以查找可疑活动并禁止 IP 或采取预先配置的操作。通常,Fail2ban 操作会更新防火墙规则,以在指定的时间内拒绝从日志文件中检测到的 IP 地址,尽管也可以配置发送电子邮件。开箱即用,Fail2Ban 带有用于各种服务(Apache、Nginx、SSH 等)的过滤器。

让我们开始实施

实施此 DDoS 缓解解决方案时有 2 个部分。首先,我们需要配置 Nginx 来限制基于 IP 地址的请求数。这将使用 Nginx 模块“ngx_http_limit_req_module”。然后 Nginx 会将有关被禁止 IP 的信息记录到错误日志中。Fail2ban 解析 Nginx 错误日志,如果它发现同一个 IP 的出现次数过多,它将通过创建防火墙(iptables)规则将其禁止 x 时间。

如果您不熟悉 Nginx 及其配置,可以参考我之前的帖子:Nginx 最佳实践和初始设置。

在 Nginx 中启用速率限制

速率限制允许您限制用户在特定时间段内可以发出的 HTTP/HTTPS 请求的数量。这也可以用于安全目的,我可以帮助您保护您的网站免受 DDoS 攻击。如果您需要更多关于 NGINX 速率限制的信息,可以查看此链接Rate Limiting with NGINX

首先,我们必须定义一个限制区域。您可以有多个区域,并且可以分配给不同的位置块。将以下行添加到您的 server 或 http 上下文块中:

1# vim /etc/nginx/nginx.conf limit_req_zone $binary_remote_addr zone=myzone:20m rate=5r/s;

让我解释一下这里发生了什么:

  • $binary_remote_addr – 客户端的 IP 地址。
  • zone=myzone:20m – “myzone” 是区域名称,它分配内存块。在这种情况下,10m 分配了 10 兆字节的内存,足以每秒处理 160,000 个连接。
  • rate=5r/s – 定义每个客户端允许的默认连接数。这里设置为每秒 5 个请求,最大为 10,但您可以通过将其格式化为 30r/m(每分钟 30 个请求)将其设置为较慢。

区域配置完成后,将其应用于所需的位置块。

1vim /etc/nginx/sites-enabled/example.com.conf location / { limit_req zone=myzone burst=5 nodelay; }

让我解释一下这里发生了什么:

  • burst=10 – 每秒单个 IP 可以排队的请求数,每个 IP 总共有 10 个请求(5 个在处理中,5 个在队列中)。
  • nodelay - 排队的请求尽快处理。

重新启动 Nginx 服务以影响更改。

1systemctl restart nginx

我已将服务器的公共 IP 添加到我的 /etc/hosts 文件中并命名为“example.com”,现在站点正在正确加载。

安装 Fail2ban

1apt-get update apt-get install fail2ban

开箱即用,fail2ban 配置为仅禁止失败的 ssh 登录尝试 IP。因此,我们需要启用一些将配置为检查 Nginx 日志的规则。

配置 Fail2ban 的常规设置

一旦安装了fail2ban,需要配置本地配置文件。在 fail2ban 中,它们被称为“监狱”。jail.conf使用以下命令制作文件的本地副本:

1cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local vim /etc/fail2ban/jail.local #Find the "[nginx-limit-req]" line and comment on the existing lines under it and add the following lines, which define the bantime, findtime, retries, and actions. [nginx-limit-req] enabled = true filter = nginx-limit-req action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp] logpath = /var/log/nginx/*error.log findtime = 300 maxretry = 3 bantime = 3600

让我解释一下这里发生了什么:

  • [nginx-req-limit] – 过滤器名称,您可以为此指定任何名称。
  • enabled = true – 启用过滤器。
  • filter = nginx-req-limit – 这是来自 fail2ban 的默认过滤器。
  • action = iptables-multiport[name=ReqLimit, port=”http,https”, protocol=tcp] – 这是当在 Nginx error.log 文件中发现可疑 IP 时 fail2nam 将触发的操作。
  • logpath = /var/log/nginx/*error.log – 我们告诉 fail2ban 哪个日志文件需要检查可疑 IP。
  • findtime = 300 – fail2ban 限制搜索的时间。(5分钟)
  • maxretry = 3 – IP 在被禁止之前可以出现在日志中的最大次数。
  • bantime = 3600 – IP 将被禁止多长时间。(1小时)

在这种情况下,如果一个 IP 地址在 5 分钟内出现在我们的错误日志中 3 次,fail2ban 将禁止它。

findtime 和 值很重要,maxretry 因为它们决定了可疑 IP 被禁止的频率。如果您将这些值调整得更小,攻击者 IP 将更频繁地被禁止。根据需要调整值。

如果需要,修改nginx-req-limit过滤器我的编辑nginx-limit-req.conf文件。

1vim /etc/fail2ban/filter.d/nginx-limit-req.conf [Definition] failregex = limiting requests, excess:.* by zone.*client: <HOST> ignoreregex =

完成所有 fail2ban 配置后,重新启动服务并检查状态。

1systemctl restart fail2ban.service systemctl status fail2ban.service

测试和故障排除

现在是时候验证配置是否按预期运行了。可以使用 Siege 或 Apache Benchmark Tool 等工具进行测试,对于这个测试,我将使用 apache benchmark 工具来测试网页上的速率限制。

如果您的系统上没有安装 ab,则必须使用发行版的包管理器安装 apache2-utils 包。如果您使用的是 Windows,请下载 Apache Binaries .zip 文件,然后在命令提示符下使用所需参数运行 ab.exe。

1#On Debian Servers apt-get update && apt-get upgrade apt-get install -y apache2-utils #On Redhat Servers yum update yum install httpd httpd-tools -y

假设我们想看看一个网络服务器处理 20 个请求的速度有多快,最多同时运行 10 个请求:

1ab -n 20 -c 10 Example Domain

Nginx 错误日志:

1tail -f /var/log/nginx/error.log

运行以下命令以查看 fail2ban 过滤器是否适用于上述日志文件。如果匹配项为零,则正则表达式过滤器可能存在问题。

1fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf

Fail2ban 日志:

1tail -f /var/log/fail2ban.log

Fail2ban 状态:

通过使用以下命令检查 fail2ban 状态,您可以看到带状 IP 列表。

1fail2ban-client status nginx-limit-req

要验证 Fail2ban 添加到 iptables 的规则,请使用以下命令:

1iptables -L

现在,如果您重新加载站点,该站点将无法加载,因为它被 fail2ban 使用 iptables 阻止。

手动添加/删除禁止 IP(可选)

您还可以手动禁止或取消禁止 IP 地址。

1#Ban a specific IP with that jail fail2ban-client set nginx-limit-req banip 1.2.3.4 #Unban a specific IP with that jail fail2ban-client set nginx-limit-req unbanip 1.2.3.4

设置 fail2ban 以保护您的 Nginx 服务器免受 DDoS 攻击是相当简单的。但是,fail2ban 提供了很大的灵活性来定制适合您的安全需求的策略。

 类似资料: