Защита сервера от DDoS атаки
Так получилось что мы попали под DDoS, ботнет был около 70-100к зараженных компов. Продолжительность DDoS`а была почти неделю. Атака была довольно примитивной, но колличество ботов брало свое, каждый бот несколко раз запрашивал индексовую страницу. Если страница статичная – ничего страшного, но если Вам нужно сделать несколько SQL запросов и обработать шаблон – начинаются проблемы. Если быть точнее то сервер ляжет и с 3000 ботов. Ниже будем рассматривать защиту именно при тех условиях что были даны, если у кого-то возникнут вопросы о том как защититься в случае других атак – постараюсь помочь.
Кстати результат был довольно плачевный для атаковавших, через несколько часов сервер работал в штатном режиме с нагрузкой около 10-15% и выдерживал эту атаку совершенно спокойно.
- о хардварнйо части: Intel \ 3.2 GHz 800FSB \ P4 Xeon, 4GB DDR2, FreeBSD 7.1
- софт: nginx 0.7.59, php 5.3rc2 в режиме fast-cgi и php-fpm, кеширование sql запросов, файлов, конфигов, сгенерированных страниц на memcached.
первым делом взялись за ядро:
sysctl net.inet.tcp.finwait2_timeout=5000 sysctl net.inet.tcp.fast_finwait2_recycle=1 sysctl kern.ipc.somaxconn=4096 sysctl net.inet.tcp.always_keepalive=0 sysctl net.inet.tcp.nolocaltimewait=1 sysctl net.inet.ip.portrange.first=1024 sysctl kern.ipc.nmbclusters=65536 sysctl net.inet.ip.portrange.randomized=0 sysctl net.inet.tcp.keepidle=60000 sysctl kern.ipc.nmbclusters=262144 sysctl kern.ipc.maxsockets=204800 sysctl net.inet.tcp.recvspace=8192 sysctl net.inet.tcp.sendspace=16384 sysctl net.inet.tcp.msl=15000
ловим наших ботов в nginx и тупо блочим их ipfw, хорошая статья написана :
if ($http_user_agent ~* "(vaginamook|2003100|ODI3|Hotbar|4.75|DigExt|20030718|Q312461|H010818|inktomi|googlebawt|FAST-WebCrawler|Microsoft-WebDAV-MiniRedir|FunWebProducts|looksmart|avastye)") { access_log /usr/local/nginx/logs/ddos IP; return 403; }
Настройки nginx, рабочая конфигурация:
worker_processes 2; events { worker_connections 9000; } client_body_buffer_size 8k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 2k; client_body_timeout 5; client_header_timeout 5; keepalive_timeout 5 5; send_timeout 5; sendfile on; server_tokens off; tcp_nodelay on; tcp_nopush on; gzip on; gzip_buffers 16 8k; gzip_comp_level 4; gzip_http_version 1.0; gzip_min_length 1024; gzip_types text/plain text/html text/css; gzip_vary on;
PHP как уже говорилось работает с php-fpm, на сокетах. Выставленны таймауты, корок небыло.
PS: Сегодня будет нереально заводной трек. Последнюю неделю только под него и бегаю в зале. А девушки… Эх, блин, где мой отпуск…