任何暴露于公共互联网的服务端点都容易受到黑客的大量攻击。您的服务可能是网站、API 端点或任何其他应用程序层服务。恶意用户和机器人将通过重复发送更高频率的请求来尝试侵入您的系统。在这篇文章中,我将向您简要介绍 DDoS 攻击和使用 Fail2ban 的缓解解决方案。
分布式拒绝服务 (DDoS) 攻击是一种恶意尝试,通过来自多个攻击源的大量网络流量来中断特定目标服务器或服务的正常流量。这会导致站点或服务的可用性由于资源耗尽而突然变慢或不可用。
应用层 DDoS 攻击针对第 7 层(OSI 模型的第 7 层),其中网站在服务器上生成并响应 HTTP 请求而交付。例如,不处理大量并发连接(打开大量连接并保持它们建立)的系统可能会耗尽系统的新连接容量。这类似于同时从许多不同的计算机上一遍又一遍地刷新网页,会产生大量的 HTTP 请求淹没服务器。
这些攻击是由僵尸网络而不是实际用户进行的,攻击者可以很容易地产生大量连接并以更高的频率发送大量请求。这些类型的第 7 层攻击很难防御,因为很难区分恶意流量和合法流量。
正如我之前提到的,缓解第 7 层攻击有点复杂。缓解涉及丢弃或限制流量的应用层 DDoS 攻击尝试,我们可以轻松实施一些方法,从而获得最大的收益。
通过对请求源实施质询以检查它是否是机器人,这就像在线提交在线表单时常见的验证码检查一样。给出诸如 javascript 级别挑战之类的要求,可以减轻许多攻击。
Web 应用程序防火墙是一种安全增强工具,可以通过将其放置在您的 Web 服务器前面来帮助缓解第 7 层 DDoS 攻击。这可能会充当您的 Web 服务器的反向代理,并根据一系列规则保护它免受某些类型的恶意流量。WAF 的一个关键优势是能够快速实施自定义规则以响应攻击。还可以维护 IP 信誉数据库,以便跟踪和有选择地阻止恶意流量。
请求速率限制是有效 DDoS 缓解策略的重要组成部分。这将限制请求的数量,并且服务器将在某个时间窗口内接受。例如,您知道普通人类用户每秒向您的登录 API 端点提交登录详细信息的次数不能超过五次,那么您可以确定是否有任何用户发送请求的频率高于这可能是恶意尝试。然后,您可以在您的登录 API 端点上定义一个每秒 5 个的速率限制,并锁定/阻止任何违反该规则的客户端 IP。
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 最佳实践和初始设置。
速率限制允许您限制用户在特定时间段内可以发出的 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; |
让我解释一下这里发生了什么:
区域配置完成后,将其应用于所需的位置块。
1 | vim /etc/nginx/sites-enabled/example.com.conf location / { limit_req zone=myzone burst=5 nodelay; } |
让我解释一下这里发生了什么:
重新启动 Nginx 服务以影响更改。
1 | systemctl restart nginx |
我已将服务器的公共 IP 添加到我的 /etc/hosts 文件中并命名为“example.com”,现在站点正在正确加载。
1 | apt-get update apt-get install fail2ban |
开箱即用,fail2ban 配置为仅禁止失败的 ssh 登录尝试 IP。因此,我们需要启用一些将配置为检查 Nginx 日志的规则。
一旦安装了fail2ban,需要配置本地配置文件。在 fail2ban 中,它们被称为“监狱”。jail.conf
使用以下命令制作文件的本地副本:
1 | cp /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 |
让我解释一下这里发生了什么:
在这种情况下,如果一个 IP 地址在 5 分钟内出现在我们的错误日志中 3 次,fail2ban 将禁止它。
findtime
和 值很重要,maxretry
因为它们决定了可疑 IP 被禁止的频率。如果您将这些值调整得更小,攻击者 IP 将更频繁地被禁止。根据需要调整值。
如果需要,修改nginx-req-limit
过滤器我的编辑nginx-limit-req.conf
文件。
1 | vim /etc/fail2ban/filter.d/nginx-limit-req.conf [Definition] failregex = limiting requests, excess:.* by zone.*client: <HOST> ignoreregex = |
完成所有 fail2ban 配置后,重新启动服务并检查状态。
1 | systemctl 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 个请求:
1 | ab -n 20 -c 10 Example Domain |
Nginx 错误日志:
1 | tail -f /var/log/nginx/error.log |
运行以下命令以查看 fail2ban 过滤器是否适用于上述日志文件。如果匹配项为零,则正则表达式过滤器可能存在问题。
1 | fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf |
Fail2ban 日志:
1 | tail -f /var/log/fail2ban.log |
Fail2ban 状态:
通过使用以下命令检查 fail2ban 状态,您可以看到带状 IP 列表。
1 | fail2ban-client status nginx-limit-req |
要验证 Fail2ban 添加到 iptables 的规则,请使用以下命令:
1 | iptables -L |
现在,如果您重新加载站点,该站点将无法加载,因为它被 fail2ban 使用 iptables 阻止。
您还可以手动禁止或取消禁止 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 提供了很大的灵活性来定制适合您的安全需求的策略。