Учимся выстаивать под ддсом средствами nginx

Discussion in 'AntiDDos - АнтиДДОС' started by foozzi, 27 Feb 2011.

  1. foozzi

    foozzi Member

    Joined:
    13 Apr 2010
    Messages:
    195
    Likes Received:
    12
    Reputations:
    5
    Итак, нас, а точнее один из саИтов на виртуальном хостинге в очередной раз начали ддосить. Как правило, без специальных ддос железок такой клиент заворачивается на днс на 127.0.0.1, или в случае выделенного ip-адреса- на центральном маршрутизаторе. Но мы решили пойти по другому
    У нас есть nginx фронт-эндом, поэтому будем пытаться выстаивать под ддосом с 20000 хостов при помощи него.
    Подразумевается, что proxy_cache_path у нас уже описан в контексте http.
    Для начала обосомим перменную для которой ужесточим и пропишем правила:
    Code:
    set $special_limit 0;
    
    if ($http_host ~* 'example.com') {
    set $personal_limit 1;
    }
    if ($http_host ~* '[url=http://www.example.com]www.example.com[/url]') {
    set $personal_limit 1;
    } 
    
    if ($personal_limit = 1) {
    rewrite ^(.*)$ /personal_limit last;
    }
    Далее, описываем локейшн:
    Code:
    location /personal_limit
    {
    internal;
    access_log logs/personal_limit_access.log cachestatus;
    error_log logs/personal_limit_error.log notice;
    
    proxy_connect_timeout 10;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_buffering on;
    proxy_ignore_headers "Expires" "Cache-Control";
    
    proxy_pass http://$host$request_uri;
    proxy_cache personal_cache;
    
    set $request_uri_without_session $request_uri;
    if ($request_uri ~* "(.*)(\?|&)(sid|PHPSESSID|session)=([^&]+)(.*)$") {
    set $request_uri_without_session $1$5;
    }
    proxy_cache_key "$request_method$host$request_uri_without_session";
    
    proxy_cache_valid 200 3d;
    proxy_cache_valid 304 1d;
    expires 3d;
    limit_conn by_vhost 10;
    }
     
  2. adept002

    adept002 New Member

    Joined:
    10 Dec 2010
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Code:
    limit_req_zone  $binary_remote_addr  zone=lphp:10m   rate=1r/s;
    
    limit_zone   limz  $binary_remote_addr  10m;
    limit_conn   limz  10;
    В location \{
    Code:
    limit_req   zone=lphp  burst=10 nodelay;