logo   Блоги рядом:  Аристарх..., Music Exchange, Друга ріка
Регистрация  Забыли пароль?

Сообщество web программистов

Олексій Акулов  пишет в: developers
28.05.2008 15:04:04
Настроение: Отличное!

DOS-атака на наш веб-сервер! (nginx)

На днях пришлось изучать возможность перехода наших сервисов на более быстрые веб-сервера под управлением nginx. Да, да, да... и мне иногда приходится делать грязную работу системного администратора :(. Процесс установки шел не совсем гладко, но все было поставлено.

Установил я значит все, и думаю, что-то не так, ну "не прет" меня от такого :), ну какой смысл от сервера без нагрузки? как от курицы, которая не несет золотые яйца :)

Решил исправить ситуацию и сделать испытание, устроил ему DOS-атаку (Denial of Service - «отказ в обслуживании»). Стресс-тест позволяющий проверить производительность и устойчивость серверов под искусственно сгенерированными "пользователями" сайта. Или в другой интерпретации - это разновидность атаки злоумышленника на компьютерные системы. Целью этой атаки является создание таких условий, при которых настоящие пользователи системы не могут получить доступ к предоставляемым системой ресурсам, либо этот доступ затруднен.

Помощи в организации попросил у моих друзей из КПИ, которые сидят на высокоскоростном интернете. Для этой цели установил бесплатную CMS от WikiPedia на нашем сервере, а в качестве программы, которая генерирует пользователей на сайте использовали продукт под названием Webserver Stress Tool. Вначале запустили небольшую нагрузку, но сервер даже не заметил что его «клюют». Потом решили «вжарить по полной». Запустили на 2-х компьютерах подключенных к каналу 100 МБ/сек (UA-IX) 250 лже-пользователей с интервалом нажатия на ссылки и заходом на сайт 0 сек, тем самым, сымитировав ситуацию, как будто на сайте сидят 250 пользователей и непрерывно (в реальности такого просто быть не может) давят на все ссылки в течение 180 секунд. Сервер наконец-то понял, что к нему идут обращения, индикатор загрузки показывал отметку 55%. При этом, на сайт можно было зайти с небольшой задержкой с любого компьютера. В общем, как мы не старались, выше 60% так и не вышло «завалить» сервер.

Оценки конечно субъективные, и не понятно как будет вести себя реальный сайт с его сложными запросами под реальной нагрузкой, но даже такой небольшой тест несет в себе позитивные эмоции и надежды что в скором будущем наши сервисы окончательно перестанут тормозить :) !!!

Одним словом: МЫ ПЕРЕХОДИМ на nginx!

Пользуясь случаем, хочу выразить благодарность Игорю Сысоеву, который является разработчиком данного веб-сервера nginx.

Спасибо за внимание! :)

Комментариев: 18

 
контрольное число

ну нарешті

Держим кулаки за сервера!!!!!

spacer 20

Спасибо! Будем стараться! :) Кто-то вчера отказывался говорить на компьютерные темы :)))))))

Чудово

Йо, нельзя же пугать-то так!!! Читаю заголовок - и у меня сердце в пятки уходит :) А вообще супер, Лех. Реально НИИ целый, а не компания.

прочитала кучу умных слов, из которых в очередной раз убедилась, что Леша - молодец!)

spacer 20

Спасибо :)

250 пользователей - ерунда. Представь, что будет с сервером, если пользователей будет около 10 тысяч, и генерировать они будут более полутора миллионов пакетов в секунду ;) Мы такое недавно переживали и не один раз :P

spacer 20

Пакеты и пользователи - это разные вещи, у нас на ХВ и побольше было. А тут писал про тест.

spacer 30

Странная фраза. Я же не говорил, что пакеты и пользователи - одинаковые вещи. Я хотел сказать, что тест синтетический и слабенький. 250 "пользователей" - мало для теста.

spacer 40

а як ви справилися з 10тисячами?

spacer 50

Один нормальный сервер, с "правильно" написанными кодом страниц и грамотным веб-сервером выдерживает и более 10 тысяч. У нас ХайВей выдерживает до 5 тысяч, учитывая что сервер покупался 4 года назад, на обычной базе "не серверного" Pentium-а 4 ;)

spacer 60

Легальных клиентов - да. Легальный клиент ждет загрузки страницы, читает, кликает по ссылкам, опять ждет. А если все 10к - это боты, которые долбятся в GET / и не вычитывая ответа закрывают коннект? Каждый запрос генерит трид php, если страница не кэшируется nginx'ом. Теперь представляем себе 10к тридов php одновременно (а может и 50к, если боты успевают сделать в секунду по 5 запросов) и чешем голову ;)

spacer 50

На самом деле цифра 10к была непостоянная, атаки велись с помощью ботнета, кол-во непрерывно атакующих компьютеров скакало в пределах 6к-15к, в среднем 10к.

Дело было так: неожиданно стали поступать звонки о том, что люди не могут зайти на сайт. Связались с провайдером, где мы держим свои сервера (не Украина), те говорят "на вас ведется атака, трафик рубится на корневом роутере". Это у них защита такая. Их тоже можно понять, миллионка в внутренней сети никому не нужна.

Но сайт-то должен работать. Стали искать возможности, для нейтрализации (с такой атакой мы сталкивались впервые).

Попытки запустить tcpdump для анализа и пустить трафик на сервер закончились полным зависанием машинки (довольно мощной, кстати) и перегрузом ее через kwm.

Вся опасность таких атак не в том, что пользователи не могут получить доступ к серверам, а в том, что у некоторых сетевых сервисов может нарушаться логика работы. Например, ipfw может пропускать некоторые правила, т.е., например, deny ip from any to me dst-port 3389 может не сработать.

Добавив deny icmp from any to me, с удивлением обнаружили, что этим правилом блочится около миллиона пакетов в секунду. Но этого все равно было недостаточно, потому что оставались многочисленные GET /

Специфика сайта такова, что мы не можем кэшировать /, иначе все было бы довольно просто. В работе мы используем связку nginx+lshttpd. lshttpd спавнит для каждого запроса lsphp, что, собственно, и нагружало сервер.

В конце-концов, мы пришли к изящному решению. Все основывалось на том факте, что атакующие, запрашивая / не вычитывали ответ (им он нафиг не нужен был), поэтому был проведен следующий финт: Мы изменили A запись домена на второй сервер, на котором была всего 1 html-ка в корне, которая джаваскриптом перебрасывала пользователя на другой порт, который пробрасывался на первый сервер. Проброс происходил быстро и пользователи замечали только, что заходя на http://domain они попадали на http://domain:82

Вот и все. Боты продолжали долбиться на 80 порт, на котором nginx'ы обоих серверов отплевывали 500-байтовую html-ку, легальные клиенты спокойно работали.

Время простоя сайта - 6 часов.

spacer 60

Это вы про приват рассказываете?

spacer 70

С чего это вдруг такой вывод? :)

Нет, не про приват.

spacer 80

Потому что именно у них были такие проблемы, и гораздо дольше, чем 6 часов. И таким же образом побороли...

spacer 90

Такие проблемы возникают рано или поздно у всех. А приват, по моим наблюдениям, валялся гораздо дольше, около 2-3 дней.




О сообществе

Сообщество web разработчиков


Модераторы сообщества

Метки

Календарь
Пн Вт Ср Чт Пт Сб Вск
     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Последние посетители сообщества
Нет данных