我正在 Ubuntu Web 服务器上配置 Fail2Ban,以防止它成为 DoS/DDoS 的受害者。我不想使用 Cloudflare,因为我必须路由我的 DNS 并使用他们的 SSl 证书。
目前,我在网上找到了一个脚本,可以检查每秒超过 1 个 HTTPHEAD
请求,或者每秒超过 1 个请求xmlrpc.php
。我认为这不足以提供足够的保护,因为这些并不是人们可以用来执行 DDoS 攻击的唯一类型的请求。
我正在研究限制特定 IP 在短时间内可以发出的GET
/请求数量,但我不确定应该如何设置限制,因为加载大量 Javascript、CSS 或图像的大页面会在短时间内发出大量请求。我应该考虑限制/请求,还是应该考虑其他方法?为什么?POST
GET
GET
POST
答案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 级别)阻止恶意机器人。