Настройка Nginx для отражения небольших ddos атак

Discussion in 'AntiDDos - АнтиДДОС' started by PandoraBox, 17 Aug 2009.

  1. PandoraBox

    PandoraBox Elder - Старейшина

    Joined:
    6 May 2007
    Messages:
    262
    Likes Received:
    176
    Reputations:
    7
    [​IMG]

    Nginx - веб сервер предназначеный для работы на высоконагруженных серверах. Ddos атака как раз и является той нагрузкой с которой этот web сервер может вполне удачно справится. Решения которые предоставляет Antiddos.org построены на кластерах под управлением FreeBSD и веб сервера Nginx. Мы провели очень много экспериментов по реакции nginx под нагрузкой и пришли к мнению что он является правильным выбором для работы на серверах которые подвергаются ddos атакам. Ниже привожу основные настройки данного сервера.

    FreeBSD, сетевая Intel fxp, порт 100Мбит, polling, http accept-filter
    в sysctl
    Code:
    sysctl kern.maxfiles=90000
    sysctl kern.maxfilesperproc=80000
    sysctl net.inet.tcp.blackhole=2
    sysctl net.inet.udp.blackhole=1
    sysctl kern.polling.burst_max=1000
    sysctl kern.polling.each_burst=50
    sysctl kern.ipc.somaxconn=32768
    sysctl net.inet.tcp.msl=3000
    sysctl net.inet.tcp.maxtcptw=40960
    sysctl net.inet.tcp.nolocaltimewait=1
    sysctl net.inet.ip.portrange.first=1024
    sysctl net.inet.ip.portrange.last=65535
    sysctl net.inet.ip.portrange.randomized=0
    в nginx моменты

    Code:
    worker_processes 1;
    worker_rlimit_nofile 80000;
    events {
    worker_connections 50000;
    }
    Code:
    server_tokens off;
    log_format IP ‘$remote_addr’;
    reset_timedout_connection on;
    
    listen xx.xx.xx.xx:80 default rcvbuf=8192 sndbuf=16384 backlog=32000 accept_filter=httpready;
    фильтрацию url например по критерию POST index.php?actio
    Code:
    n=login
    с пустым реферером можно реализовать так
    Code:
    set $add 1;
    location /index.php {
    limit_except GET POST {
    deny all;
    }
    set $ban “”;
    if ($http_referer = “” ) {set $ban $ban$add;}
    if ($request_method = POST ) {set $ban $ban$add;}
    if ($query_string = “action=login” ){set $ban $ban$add;}
    if ($ban = 111 ) {
    access_log /var/log/nginx/ban IP;
    return 404;
    }
    proxy_pass http://127.0.0.1:8000; #тут живёт апач
    }
    Дальше резали на уровне pf - загружали в таблицу IP с которых приходило слишком
    много хитов. PF с таблицами работает очень быстро. Исходники парсера логов есть на
    http://www.comsys.com.ua/files.

    ну и по крону уже раз в минуту добавлять в ip table новые ip из лога

    25Мбитный DDoS, преимущесвенно режущийся ip, остатки проходят на nginx, который по критерию обучает ip и остатки проксирует на апач - LA 0, сайт работает.

    Источник: antiddos.org
     
    #1 PandoraBox, 17 Aug 2009
    Last edited: 17 Aug 2009