Теория и практика борьбы с DDoS атаками



Привет! Я работаю в компании, занимающейся решением задач масштабирования вычислительных систем, а так же написанием новых, а в качестве социальной деятельности веду ряд мелких некоммерческих проектов. Недавно мне впервые удалось побороться с живой DDoS атакой и я рад поделиться с вами полученным опытом.

Мы обсудим способы борьбы с DDoS атаками на небольшие сайты и рассмотрим мой частный случай.

Введение


Начнем с того, что поразмышляем о том, откуда берутся эти DDoS атаки. В принципе, основных источников — три: интернет-хулиганьё, вымогатели и конкуренты — недоброжелатели.

С интернет-хулиганьём все относительно просто: шансов попасть под раздачу не так уж и много. А если вы под нее попали — атака будет недолгой. Травить вас неделями вряд ли кому вздумается.

С вымогателями дело может обстоять сложнее, однако если вымогатели нашли вас, значит у вас, по их мнению, есть что взять. Тут уже каждый решает для себя, что выгоднее: дать денег жуликам, дать денег компании-производителю анти-DDoS решений или иметь хороших специалистов, которые уже собаку съели на борьбе с DDoS атаками. Однако если вы не являетесь владельцем популярного онлайн-казино, и час простоя не измеряется десятками тысяч баксов упущенной прибыли, вряд ли вы будете интересны жуликам.

А вот с конкурентами-недоброжелателями бороться и сложно и интересно. Во-первых нарваться на такую атаку очень просто. Ваш интернет-магазин находится в поисковике выше конкурирующего магазина? Этого вполне хватит. Уверен, что любой владелец коммерческого проекта может навскидку назвать 10 причин, почему кто-то может захотеть, чтобы его сайт покинул интернет-эфир.

Как это происходит

Разумеется, для совершения DDoS атаки нужен ботнет (с атаками хомячков с популярных ресурсов мы расстались во введении). А контроль над ботнетами имеют далеко не все желающие напакостить. Можно даже сказать, что как правило, никто из недоброжелателей не в состоянии организовать DDoS атаку. Но этого и не нужно. Ведь всегда можно заглянуть в старый почтовый ящик и выудить в нем пару десятков предложений убрать сайт конкурента. Да поиском эти предложения замечательно ищутся.

Стоит это относительно недорого, а сайт, работающий без поддержки, валится на ура.

Как с этим бороться


В первую очередь, атаку надо заметить. Если вы заметили атаку по сократившемуся числу звонков в офис, или числу электронных писем в ящике, значит с мониторингом у вас что-то не так. Чем раньше вы узнаете об атаке, тем раньше вы ее подавите и тем меньше клиентов потеряете. При разработке сайта закладывайте хотя бы простейший мониторинг. Причем желательно не встроенный в сайт, а отдельный, который можно запустить на домашнем компьютере, или на компьютере в офисе. Достаточно просто раз в час замерять время отдачи главной страницы сайта. Время увеличилось с нескольких секунд до нескольких десятков — стоит посмотреть, что случилось: дома интернет лагает или сайт лег.

Итак, вы получили сигнал тревоги и убедились, что сайт, действительно, перегружен. Тут можно пользоваться чем угодно: панелью управления хостингом, инструментами операционки и т.д. В первую очередь, свяжитесь со своим хостером. Многие хостеры штрафуют своих клиентов за превышение нагрузки на сеть/процессор, но часто достаточно заказать относительно недорогую услугу для избежания более серьезных трат.

Ну а теперь можно заняться отражением атаки.

Учитывая то, что сети хостеров, как правило, защищены от DDoS-ов низкого уровня, такого как 64-килобайтные пинги и прочая ерунда, убивать ваш сайт с высокой степерью вероятности будут по HTTP, имитируя небывалую популярность вашего ресурса.

Кроме того, следует помнить, что если ваш сайт — не Wikileaks, то атака вряд ли будет сокрушительной. Обязательно должен быть способ ее отразить, не добавляя своему сайту способностей обслужить столько же клиентов, сколько обслуживает Facebook.

В первую очередь стоит попробовать в действии ваш firewall. Конкретные зоны IP-адресов закреплены за конкретными странами. Поэтому если ваши заказчики из России, а DDoS-ят вас с китайского ботнета, в качестве экстренной меры вполне подойдет отрезание зон Китая на firewall-е. А можно, наоборот, оставить только те страны, где живут ваши потенциальные клиенты — вам виднее. Как определить откуда DDoS-ят? Включите временно логирование запросов и посмотрите откуда к вам лезут. В принципе, netstat -a -n тоже подойдет. Если ваш сайт поднялся, дальше можно не бороться. Когда атака прекратится — разбаните этот Китай.

Если firewall не помог навскидку, стреляйте прицельно. Возьмите лог запросов за пару минут и выберите из него уникальные IP адреса. Если ботнет небольшой, его будет отлично видно, и тогда можно будет забанить ноды ботнета персонально.

Если и это не помогло, придется отправлять ответы всем желающим. Тут есть целое поле для уловок. Правило игры простое: вы не сладите с ботнетом, если при на каждый его запрос будете делать несколько запросов в БД, формировать сложную страницу из десятка вложенных шаблонов и т.д.

Что же делать? Если дергают не главную страницу сайта, просто подвиньте страницы вашего сайта и сделайте страницу 404 с редиректом на главную страницу сайта. Вы потеряете часть посетителей из поисковиков, но отдавать большие страницы с каталогом товаров из базы всем подряд вы все равно вряд ли сможете так просто (хотя, если памяти хватает, ваша CMS умеет возвращать 304/Not Modified не ныряя в базу, можно поставить перед вашим веб-проектом тот же сквид. Этим, кстати, стоит заняться уже сейчас если у вас есть пара сотен свободных мегабайт памяти. Эта мера и нагрузку снизит на базу, и рейтинг в поисковиках поднимет за счет более быстрой отдачи, и посетители будут охотнее листать ваш каталог).

Если дергают главную страницу — нужно настоящих пользователей перенаправить на новый URL главной страницы, причем так, чтобы боты не поняли. Как это не смешно, лично мне помог простой редирект 301/Moved Permanently на новый адрес главной страницы. Отсылка этих редиректов почти ничего не стоит, если у вас сайт не написан пьяным гиком на питоне и на каждом запросе не запускается интерпретатор питона. В моем случае нагрузка на процессор от ботнета упала до 4% и сайт заработал, как будто никакой атаки нет.

Если ботнет окажется достаточно умным, чтобы понимать 301/Moved Permanently — возможностей еще полно: можно использовать http-equiv=«refresh» или редирект посредством JavaScript. В крайнем случае, можно возвращать страницу с ссылочкой.

В самом крайнем случае, сделайте гравную страницу полностью статической, максимально легкой (не забудьте про минификацию html) и отдавайте ее в таком виде. Весь динамический контент можно просто захардкодить на время атаки.

Ну и самое главное: когда атака закончится, не забудьте вернуть все назад :)

Как это было у меня


Ну и напоследок приведу свой случай с цифрами:
Проект — некоммерческий, на виртуальном хосте VDS за 8.95 баксов в месяц: Shared CPU, 256MB RAM, 500GB traffic.
Операционка — CentOS 5.5
Сайт на Java (Apache Tomcat + Apache httpd для статики + MySql).
По крону регулярно проверялось наличие процессов в памяти, и в случае отсутствия они перезапускались.
Бомбили сайт запросами GET / со скоростью 80-100 запросов в секунду.

В результате атаки httpd начал жрать много памяти и много файловых дескрипторов, что привело к выпаданию его самого и томката. Время открытия сайта увеличилось до минуты, кроме того посетители периодически получали Connection Refused.

После того, как httpd был откручен и выкинут, остался один томкат. Сайт стал стабилен, но время ответа все еще было очень большим. После прикручивания к томкату native-libs (его же родного ускорителя), томкат стал выпадать с Segmentation Fault. Лучшее — враг хорошего.

После анализа айпишников атаковавших, стало понятно, что отсеять их firewall-ом не получится.

Покрутив конфиги сайта, установил редирект с главной страницы сайта на /index. Ботнет этот редирект преодолеть не смог, а для томката отправлять 100 редиректов в секунду — не особо затратно. С редиректом нагрузка упала со 100% до жалких 4%.

Подключение услуги «безлимитный трафик» стоило 1 доллар за месяц (ширина канала ограничена до 5Mbit/s).

Через несколько дней атака иссякла.

Надеюсь, этот пост поможет кому-нибудь, потому что мне пришлось думать головой, как бороться с атакой вместо того, чтобы раздавить ее за 20 минут. Всем успехов!


0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.