通过 Web 服务器配置处理 HTTP 洪水攻击(Django 应用程序)

通过 Web 服务器配置处理 HTTP 洪水攻击(Django 应用程序)

我维护的一个基于 Django 的网络论坛最近在应用层频繁遭受 DDOS 攻击。本质上,这似乎是一次 HTTP 洪水袭击了主页,导致服务器执行大量内部请求并加载各种文件来创建页面。洪水峰值约为每分钟 4000 个请求(典型吞吐量约为 500 rpm),在此过程中导致我的服务器瘫痪。

我的网络服务器是 nginx,作为 gunicorn 应用程序服务器的反向代理。

我还没有使用 gunicorn 的安全参数:limit_request_linelimit_request_fieldslimit_request_field_size)。但我有nginx fail2ban安装并在我的系统中设置两个jailjail.local以确保阻止HTTP洪水:

[nginx-postflood]

enabled = true
filter = nginx-postflood
port = http,https
logpath = /var/log/nginx/access.log
findtime = 60
maxretry = 13
bantime = 300

[nginx-getflood]

enabled = true
filter = nginx-getflood
port = http,https
logpath = /var/log/nginx/access.log
findtime = 5
maxretry = 6
bantime = 600

此设置没有帮助,我不知道为什么。当我测试它时,我能够阻止我的 IP,所以它肯定是有效的。也许 HTTP 洪水随机化了 IP。

我可以采用什么策略来阻止这种应用层 DDOS?作为新手,我仍然对这一切感到困惑。非常感谢专家的帮助!

答案1

我最终在 nginx 级别处理了这个问题。我http {在 中添加了以下内容nginx.conf

limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=7r/s;
limit_conn_status 403;
limit_req_status 403;

然后在虚拟主机文件的server {块中(任何location {块之外)执行以下内容:

limit_conn conn_limit_per_ip 10;
limit_req zone=req_limit_per_ip burst=5 nodelay;

到目前为止,这个配置对我来说运行良好。


注意:适用于 DoS,但不确定它能否经受住 DDoS 攻击。希望有专家能提供意见。

相关内容