Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Простейшая защита от DDoS. (Linux) #2

Статус
В этой теме нельзя размещать новые ответы.

Brendan

Специалист
Задача c наименьшими усилиями и затратами привести в порядок конфиги установленного вэб-сервера apache2, произвести тюнинг MySQL и произвести простейшую защиту от DoS/DDoS сервера. Имеем 1 сервер, на нем apache2, отдача файлов осуществляется им же, также на сервере производится конвертация видео, на нем же хранятся файлы, задач много, конфиги мягко говоря странные, всякие «левые» скрипты, самописный CMS, плюс ко всему «инициативный» владелец сервера, но раз он платит, то надо делать =)

С apache2 и MySQL проблем не возникло, благо опыт в подобных манипуляциях имелся. А вот с DDoS и его имитацией пришлось повозиться. Основная проблема заключалась в том, что кто-то из пользователей сайта мог находиться за nat’ом, кто-то злонамеренно генерировать tcp соединения, кто-то медленными запросами баловаться.

Так вот небольшой и очень простой способ примитивной защиты нашелся быстро:
PHP:
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
Просматриваем сетевые соединения, формируем список из двух колонок, первая — количество соединений, вторая — IP-адрес, чем больше соединений на 1 IP-адрес, тем больше вероятности, что нас атакуют. Суть атаки, на сколько я понимаю, в том, чтобы забить всё разрешённое пространство tcp-соединений вэб-сервера и привести к его отказу.

После того, как мы получили список, можно в ручную, при помощи iptables блокировать IP-адреса,
PHP:
iptables -A INPUT -s IP_address -j DROP
но это долго, муторно, и практически всегда бессмысленно.

Еще одно из соображений на тему — ограничение количества соединений на 1 IP-адрес:
PHP:
iptables -A INPUT -p udp —dport 80 -m connlimit —connlimit-above 10 -j DROP
iptables -A INPUT -p tcp —dport 80 -m connlimit —connlimit-above 10 -j DROP
к примеру 10 содинений на один адрес.

Еще один из способов анализа, выявления аномалий и последующего блокирования «виновника торжества»
PHP:
tcpdump -v -n -w attack.log dst port 80
tcpdump -nr attack.log |awk ‘{print $3}’ |grep -oE ‘[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}’ |sort |uniq -c |sort -rn | head -20
Пишем весь трафик в файл, сортируем и получаем IP и количество соединений, после благополучно ручками блокируем полученный списочек.

Так как все выше перечисленное требует непосредственного участия в процессе, то не всегда удобно. Более оптимальный вариант нашелся также очень быстро.

Идем на сайт:

Создаем папку для утилитки и переходим в неё:
PHP:
 mkdir -p /usr/local/ddos
Качаем скрипт установщика:
PHP:
wget http://www.inetbase.com/scripts/ddos/install.sh
Даем права на исполнение:
PHP:
chmod 0700 install.sh
Устанавливаем:
PHP:
./install.sh
Смотрим, что у нас появилось в папке:
HTML:
-rw-r—r— 1 root staff 972 Dec 12 15:25 ddos.conf
-rwxr-xr-x 1 root staff 3934 Dec 12 14:57 ddos.sh
-rw——- 1 root root 806 Dec 12 16:56 ignore.ip.list
-rw-r—r— 1 root staff 10113 Jan 10 2006 LICENSE
правим файл ddos.conf
PHP:
nano ddos.conf
PHP:
##### APF_BAN=1 (Make sure your APF version is atleast 0.96)
##### APF_BAN=0 (Uses iptables for banning ips instead of APF)
APF_BAN=0
если нас вполне устраивает iptables, то соответственно ставим 0

PHP:
##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=200
указываем пороговое значение, при достяжении которого будет сделан вывод об аномалии и IP-адрес сгенерировавший указанное количество соединений будет забанен.

PHP:
##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=6000
указываем количество секунд, в течение которого IP-адрес будет в бане.

Есть одно большое НО:

Скрипт ddos.sh упорно отказывался запускаться до того момента пока в него не внесли изменения:
PHP:
{
CONF=»/usr/local/ddos/ddos.conf»
if [ -f «$CONF» -a «$CONF» != «» ]; then
. $CONF
else
head
echo «\$CONF not found.»
exit 1
fi
}
После внесенных изменений пробуем запустить скрипт со следующим ключом, который означает, что нужно создать задачу по cron, забегая вперед, в ней тоже небольшая неточность:
PHP:
/usr/local/ddos# ./ddos.sh -h
DDoS-Deflate version 0.6
Copyright (C) 2005, Zaf <zaf@vsnl.com>

Usage: ddos.sh [OPTIONS] [N]
N : number of tcp/udp connections (default 150)
OPTIONS:
-h | —help: Show this help screen
-c | —cron: Create cron job to run this script regularly (default 1 mins)
-k | —kill: Block the offending ip making more than N connections

./ddos.sh -c
Далее идем в папку /etc/cron.d/ и переименовываем файл ddos.cron (точка) в ddoscron (без точки)

Собственно все.

Источник: (Не реклама)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу