防止DDOS攻击,适用于带有nginx反向代理的Django应用程序+;古尼科恩

防止DDOS攻击,适用于带有nginx反向代理的Django应用程序+;古尼科恩,django,security,nginx,ddos,Django,Security,Nginx,Ddos,我正在编写一个Django应用程序,它在生产中使用nginx反向代理+gunicorn作为Web服务器 我想包括阻止来自特定IP(或IP池)的DDOS攻击的功能。这可能是在nginx级别,而不是代码中的任何更深层次。我需要web应用程序防火墙吗?如果是,我如何整合它 位于可用站点的我的项目nginx文件具有: server { listen 80; charset utf-8; underscores_in_headers on; location = /favi

我正在编写一个Django应用程序,它在生产中使用nginx反向代理+gunicorn作为Web服务器

我想包括阻止来自特定IP(或IP池)的DDOS攻击的功能。这可能是在nginx级别,而不是代码中的任何更深层次。我需要web应用程序防火墙吗?如果是,我如何整合它

位于可用站点的我的项目nginx文件具有:

server {
    listen 80;
    charset utf-8;
    underscores_in_headers on;
    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {

        root /home/sarahm/djangoproject/djangoapp;
    }

    location /static/admin {

        root /home/sarahm/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/contrib/admin/static/;
    }

    location / {
        proxy_pass_request_headers on;
        proxy_buffering on;
        proxy_buffers 8 24k;
        proxy_buffer_size 2k;
        include proxy_params;
        proxy_pass          http://unix:/home/sarahm/djangoproject/djangoapp/djangoapp.sock;
    }


    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /home/sarahm/djangoproject/djangoapp/templates/;
   }
}

让我知道我是否应该包含更多信息,以及这些信息应该是什么。

如果您想阻止某些IP甚至子网访问您的应用程序,请将以下代码添加到
服务器
块:

#Specify adresses that are not allowed to access your server
    deny 192.168.1.1/24;
    deny 192.168.2.1/24;
    allow all;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 403;
}
limit_conn limitzone  20;
另外,如果您没有使用REST,那么您可能希望通过将以下内容添加到
服务器
块来限制可能的HTTP谓词:

#Specify adresses that are not allowed to access your server
    deny 192.168.1.1/24;
    deny 192.168.2.1/24;
    allow all;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 403;
}
limit_conn limitzone  20;
为了减少DoS攻击的可能性,您可能希望通过在NGINX
NGINX.conf
中添加以下内容来限制来自单个主机的可能请求数(请参阅):

limit_conn_zone $binary_remote_addr zone=limitzone:1M;
并将以下内容添加到
服务器
块:

#Specify adresses that are not allowed to access your server
    deny 192.168.1.1/24;
    deny 192.168.2.1/24;
    allow all;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 403;
}
limit_conn limitzone  20;
nginx.conf
的一些其他有用设置,如果设置正确,有助于缓解DoS:

server_tokens off;
autoindex off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
keepalive_timeout  20 15;

open_file_cache max=5000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
由于这里的内容太宽泛,无法解释所有这些,建议您查看文档以了解详细信息。尽管选择正确的值是通过在特定设置上的反复试验来实现的

Django将错误页本身作为模板提供,因此您应该删除:

error_page 500 502 503 504 /500.html;
location = /500.html {
    root /home/sarahm/djangoproject/djangoapp/templates/;
添加
access\u注销;未发现注销日志
静态
也是一个选项:

location /static/ {
    access_log off;
    log_not_found off;
    root /home/sarahm/djangoproject/djangoapp;
}
这将降低文件系统请求的频率,从而提高性能


NGINX是一个很棒的web服务器,设置它是一个广泛的主题,因此最好阅读文档(至少是操作部分)或找到一篇文章,描述与您相近的情况下的设置。

感谢您让我开始Nikita。我会像你建议的那样阅读文档,并检查你发布的设置。为了完整性,你对Naxsi()的回答还有什么要补充的吗?或者这与DDOS攻击无关?对不起,我没有任何纳西族的经验来告诉你这方面的事情。一般来说,我会说,你的应用程序,除非它真的很特别,不会引起“坏”人的兴趣来进行攻击,除非它变得出名或会影响其他人的构建(竞争)。DDoS攻击的主要原因是阻止网站所有者进行业务,这是由不诚实的竞争支付的,或者让网站所有者支付赎金,因为在DDoS攻击下,所有者将失去资金(即电子商务)。如果网站正在变大或是主要的业务资产,那么支付专业人员组织防御是值得的,或者至少使用cloudflare等特殊服务。在此之前,您只需采取一些简单的措施,其中一些措施是我建议的,以限制无意DoS效应的影响,这可能是由于索引或解析您的站点等引起的。因为如果有人真的想DDoS,他们会成功,除非你有一个昂贵的服务器设置。根据这一点:当使用nginx作为反向代理时,
sendfile
似乎不是必需的(这就是我正在做的)。因此,在我的情况下,我应该单独设置
tcp\u nopush on和<代码>tcp_节点延迟打开并保持
sendfile
关闭?