在 Fail2Ban 中检测 DoS 和 DDoS 的好方法是什么?

在 Fail2Ban 中检测 DoS 和 DDoS 的好方法是什么?

我正在 Ubuntu Web 服务器上配置 Fail2Ban,以防止它成为 DoS/DDoS 的受害者。我不想使用 Cloudflare,因为我必须路由我的 DNS 并使用他们的 SSl 证书。

目前,我在网上找到了一个脚本,可以检查每秒超过 1 个 HTTPHEAD请求,或者每秒超过 1 个请求xmlrpc.php。我认为这不足以提供足够的保护,因为这些并不是人们可以用来执行 DDoS 攻击的唯一类型的请求。

我正在研究限制特定 IP 在短时间内可以发出的GET/请求数量,但我不确定应该如何设置限制,因为加载大量 Javascript、CSS 或图像的大页面会在短时间内发出大量请求。我应该考虑限制/请求,还是应该考虑其他方法?为什么?POSTGETGETPOST

答案1

仅通过检查每秒的请求率很难看出好人和坏人的区别。在做出最终决定之前,您需要在您的环境中运行脚本,以查看每 5 分钟来自单个 IP 地址的请求数(示例)对于您的网站来说是“正常的”。

一旦您确定了正常速率,就应该可以使用脚本来计算 GET 和/或 POST(取决于您的日志文件分析)。

但是,有可能在日志文件中找到其他可疑活动进行过滤,例如扫描脚本或可执行文件等。(“希望”GET/POST 在配置良好的 Web 服务器中导致错误 ;-))

我用过这个外部的fail-2-ban-link在我自己的系统上。

答案2

一个好的设置是在 1 秒内检查多个连接。我认为 1 秒内 100 个连接是非常可疑的,应该被阻止。

当您使用 Apache 时,我建议也使用 mod_evasive 和 fail2ban。

使用mod_evasive

使用失败2ban

答案3

您担心的是真正的 DoS 攻击还是恶意爬虫?我的意思是,爬虫会爬取您的网站以获取联系信息、尝试查找安全漏洞或尝试传播垃圾邮件,但它们的目的不是造成拒绝服务。但它们可能会产生有问题的负载,从而导致 DoS。这些通常是您在小型网页上需要关注的问题。

我发现,对于这类机器人,在应用程序级别实施速率级别效果非常好。这也具有这样的效果,即它可以与爬行速度过快的优秀爬虫一起工作。如果正确实施,通过响应 429 - 请求过多,它们会减慢速度,但不会停止索引您的网站。

您可以在 nginx 中像这样执行此操作,我建议仅将限制应用于运行 PHP(或任何其他语言)的位置,这些位置通常占用最多的 CPU、RAM 和磁盘空间,并会导致您的服务器停止工作。您通常可以服务大量静态文件而不会遇到问题。通常,仅为 PHP 文件找到正确的值也容易得多。

# This will limit requests to 2 per second,
# you should run some tests here to make sure this is a value
# low enough to ensure an individual user will not be able to cause DoS
# while not blocking legitimate requests.
# The limit of 2/s will probably be to low if you have a lot of ajax requests.
limit_req_zone $binary_remote_addr zone=php_req_limit:10m rate=2r/s;

# This is needed for limiting the total number of parallel requests.
limit_conn_zone $server_name zone=conn_limit:10m;

server {
    # This will limit the number of concurrent requests to 100.
    # This means an ip cannot open more than 100 simultaneous connections.
    # If you have a lot of static resources css files, jss, images
    # or you make a lot of AJAX calls you might need a higher value here.
    limit_conn conn_limit 100;

    # Apply the limit to the place that runs your code.
    # For example the place where you proxy your requests to fpm.
    location ~ [^/]\.php(/|$) {

        # This applies the limit.
        # The burst parameter regulates by how many requests the limit can
        # be overstepped on the first interaction.
        # This means even tough the limit is set to 2 request per second
        # on the first interaction you can actually make up to 22 requests.
        # When the user than waits for a second after all requests have
        # been processed the buffer becomes empty again and he can burst again.
        # This means a normal user (with a webbrowser) that goes to a page
        # stays there for a few seconds and then continues to another
        # page will have up to 22 requests per page load.
        # But an aggressive crawler will not be able to constantly make 22 requests.

        limit_req zone=php_req_limit burst=20 nodelay;

        [...]
    }


    # This will make your server to respond with 403 instead of 503
    # when the limit is exceeded. This is important so that legit
    # crawlers will know to slow down.
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;

    [...]
}

您还可以将此方法与 fail2ban 结合使用,如果 IP 在一段时间内触发大量 429(因此它们拒绝减速),则阻止它们。这样,您既给了合法机器人(如搜索爬虫)调整其行为的机会,又确保以最有效的方式(在 TCP 级别)阻止恶意机器人。

相关内容