Что такое DDoS?
DoS расшифровывается как Denial of Service (отказ в обслуживании). DoS-атака — это атака на сервер с целью вывести его из рабочего состояния так, чтобы пользователи, которые имеют право работать с данными и программами, располагающимися на данном сервере, не имели такой возможности. Одной из целью dos-атаки может быть взлом сервера, посредством выявления необходимой для хакера информации при работе сервера в критической ситуации.
Чаще всего Dos-атака производится при помощи большого количества бессмысленных обращений к серверу, так называемого флуда. При этом происходит исчерпание возможностей компьютерной системы (процессора, памяти), либо пропускной способности канала связи с сервером. Естественно, возможны и абсолютно легитимные возможности для DoS-атаки. Предположим, организация поставила свой сайт на не слишком мощный сервер, а затем разместила рекламу на очень популярном ресурсе — это дало крайне много переходов на сайт, и сервер оказался перегружен. Но чаще всего DoS-атаки связаны именно с атакой на сервер, в большинстве случаем действиями конкурирующих компаний — при капитализме живем, товарищи!
Но мы говорим все о dos-атаке, а в заголовке статьи ddos. Отличие ddos-атаки от dos-атаки только в том, что ddos-атака является распределенной, т.е. атакующих компьютеров не один, а много. Их количество может измеряться тысячами. Эти атакующие компьютеры образуют так называемые ботнет сети, которыми управляет хакер при помощи сервера. Чаще всего хакер работает через VPN, для того, чтобы обеспечить максимальную анонимность.
Пример атаки
Мы хотели бы рассмотреть пример атаки на сервер, на котором работают несколько сайтов, т.е. мы рассматриваем веб-сервер. И атака на него будет производится HTTP-флудом, бессмысленными запросами к главной странице через GET. Это самый простой случай.
За последние 3 месяца мне приходилось несколько раз отражать такого рода атаки на подконтрольный мне сервер. В различных случаях я применял 2 разных способа отражения DDOS — этими способами я и хотел бы поделится с вами в этой статье. Операционная система на сервере — linux debian lenny, вебсервер apache2, также установлен nginx и настроен для отдачи статического содержимого вебстраниц.
Первый способ отражения атаки
Самый простой способ — это определение и бан ip-адресов атакующих компьютеров. Для определения того, кто же нас атакует, будем использовать консольную утилиту tcpdump. Бан будем осуществлять при помощи iptables.
Давайте посмотрим выдачу команды tcpdump -v -i eth0 dst port 80. Эта команда выдаст нам, что происходит на сервере на 80-м порту. Вот пример выдачи:
tcpdump -v -i eth0 dst port 80
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
09:09:10.921244 IP (tos 0x0, ttl 49, id 3514, offset 0, flags [DF], proto TCP (6), length 64) 189.132.35.106.50074 > km34609.keymachine.de.www: S, cksum 0x7703 (correct), 600315629:600315629(0) win 65535
Как вы можете видеть в выдаче команды присутствует ip-адрес пользователя сделавшего запрос на какую-то страницу на сервере. Но этот пользователь может быть как пользователем, так и крупицой ботнет-сети. Блокировать или не блокировать его?
Очевидно, что скорее всего, если пользователь не является обычным, среднестатистическим пользователем, то запросов от него должно быть неимоверное количество. Таким образом, нам нужно подготовить статистику по запросам с каждого ip за определенный промежуток времени.
Делается это так:
tcpdump -v -n -w ddos.log dst port 80 -c 250
tcpdump -nr ddos.log |awk ‘{print $3}’ |grep -oE ‘[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}’ |sort |uniq -c |sort -rn
После прохождения второй команды получаем список из 2-х колонок: в первой количество запросов, во второй — с какого ip было это количество запросов.
reading from file ddos.log, link-type EN10MB (Ethernet)
250 189.132.35.106
В этой выдаче фигурирует мой ip — я самостоятельно позапрашивал страницу на сервере много раз и получился этот вывод. В реальных условиях будет большой список адресов и нужно будет выбирать те адреса, с которых идет больше всего запросов и писать правила для iptables такого вида для каждого из них:
iptables -A INPUT -s 189.132.35.106 -j DROP
Вот так, например, я закрою доступ на сервер пользователю с ip 189.132.35.106 и его запросы сервером обрабатываться не будут.
Но ip, с которых идет HTTP-флуд, может быть много — хочется какой-то пакетной обработки. В таком случае, как вариант, можно использовать такой небольшой скриптик и в какой-то мере автоматизировать свою работу.
Назовем его antiddos.sh. Не забудьте присвоить скрипту право на запуск.
#!/bin/bash?BLOCKDB=”ips.txt”?IPS=$(grep -Ev “^#” $BLOCKDB)?for i in $IPS?do?iptables -A INPUT -s $i -j DROP?done
Далее посмотрим как работать с этим скриптом. Для начала нам нужно сформировать список ip, которые мы хотим добавить в файрвол. Для этого нужно вывести их список на экран так, как мы уже выводили раньше:
tcpdump -v -n -w ddos.log dst port 80 -c 1000
tcpdump -nr ddos.log |awk ‘{print $3}’ |grep -oE ‘[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}’ |sort |uniq -c |sort -rn
reading from file ddos.log, link-type EN10MB (Ethernet)
700 189.132.35.102
200 89.132.35.101
34 108.134.35.106
33 55.138.35.102
33 99.130.35.6
Получаем список ip — анализируем какие мы хотим забанить. Предположим, нам показалось, что первые 2 нам не нравятся по каким-то причинам. С них уж слишком много запросов. Запоминает, что нам нужно только первые 2 забанить (их может быть в реальности и 20, и 100 штук) и вводим команду, которая записывает список всех ip в файл.
tcpdump -nr ddos.log |awk ‘{print $3}’ |grep -oE ‘[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}’ |sort |uniq |sort -rn > ips.txt
Открываем ips.txt и видим ip пользователей, но уже без указания количества:
189.132.35.102
89.132.35.101
108.134.35.106
55.138.35.102
99.130.35.6
Мы помним, что нам нужны только первые 2, так что последние 3 удаляем. Остается вот это в файле:
189.132.35.102
89.132.35.101
Затем вводим команду ./antiddos.sh и все ip из файла ips.txt попадают в iptables.
Второй способ отражения атаки
Второй способ, который я недавно использовал, связан с конфигурированием nginx. Для одного из ресурсов, в принципе, не слишком необходим трафик из зарубежья, и при этом ботнет-сеть, которая атаковала ресурс практически полностью находилась за рубежом. Для реализации защиты я применил базу данных в свободном доступе http://static.wipmania.com/static/worldip.cidr.zip
Из этого архива нам нужен файл worldip.conf — его нужно скопировать в папку /etc/nginx/ .
При этом в основной конфиг nginx (файл /etc/nginx/nginx.conf) нужно внести следующие изменения.
В общую секцию http добавить:
geo $geo {
include worldip.conf;
default XX;
}
Это нужно для того, чтобы считать файл с привязкой ip по странам. Здесь мы по ip пользователя определяем его страну. Если страну не определить, то присваивается XX.
Затем в секцию server для сайтов, запросы к которым вы хотите фильтровать по странам нужно добавить:
set $a 0;
if ($geo = RU)
{
set $a 1;
}
if ($a = 0)
{
return 444;
}
Таким образом, если страна пользователя не Россия, то соединение сбрасывается и никакого ответа пользователю не будет. Можно также добавить в файл обработку страны, которая не определилась по ip в базе данных. Скорее всего страна не будет определятся, если база данных worldip.conf устарела и есть вероятность, что пользователь может быть тоже из тех стран, которым вы хотите показывать сайт. Добавьте в секцию server такие строки:
if ($geo = XX)
{
set $a 1;
}
После всех настроек нужно перезагрузить nginx командой /etc/init.d/nginx restart.
В заключение
Эти 2 способа — лишь верхущка айсберга. Способов остановки ddos очень много. Как и способов самого ddos. Мы рассмотрели только случай http-флуда на вебсервер, а есть еще SYN-флуд, UDP-флуд, ICMP-флуд.
статья опубликована в журнале Веб-Аналитик.ИНФО, (№2) май 2010 год