防止DDOS攻击,对于使用nginx反向代理+ gunicorn的Django应用程序

时间:2016-02-02 12:02:22

标签: 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 = /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/;
   }
}

如果我应该包含更多信息以及该信息应该是什么,请告诉我。

1 个答案:

答案 0 :(得分:6)

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

#Specify adresses that are not allowed to access your server
    deny 192.168.1.1/24;
    deny 192.168.2.1/24;
    allow all;

此外,如果您没有使用REST,那么您可能希望通过将以下内容添加到server块来限制可能的HTTP谓词:

if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 403;
}

为了减少DoS攻击的可能性,您可能希望通过向NGINX nginx.conf添加以下内容来限制来自单个主机的可能请求数(请参阅http://nginx.org/en/docs/stream/ngx_stream_limit_conn_module.html):

limit_conn_zone $binary_remote_addr zone=limitzone:1M;

以及以下server块:

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;

由于它太宽泛而无法在此解释这些内容,建议您查看文档http://nginx.org/en/docs/以获取详细信息。虽然通过特定设置的反复试验来选择正确的值。

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

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

如果您不真正关心日志记录,则将access_log off; log_not_found off;添加到static也是一种选择:

location /static/ {
    access_log off;
    log_not_found off;
    root /home/sarahm/djangoproject/djangoapp;
}

这将降低文件系统请求的频率,从而提高性能。

NGINX是一个很棒的网络服务器并且设置它是一个广泛的主题,所以最好是阅读文档(至少是HOW-TO部分)或找到描述接近你的情况的设置的文章。